1. HAProxy 소개

- HAProxy는 TCP 및 HTTP 기반 애플리케이션에 대한 고가용성 및 로드 밸런싱을 제공하는 오픈 소스 소프트웨어 솔루션
- Reverse Proxy 기반으로 동작하고, Reverse Proxy, Load Balancer 기능 제공하며, Health Check 기능 제공
- HAProxy에는 관리자가 응용 프로그램의 성능을 실시간으로 추적할 수 있는 강력한 모니터링 도구가 제공됨

2. Docker 기반으로 HAProxy 구성 예시

- 사전조건: Linux기반 OS에서 docker-compose를 실행할 수 있는 상태
- 전체파일 구성

[root@console /APP/docker_haproxy/haproxy_web]# tree
.
├── create.sh
├── delete.sh
├── docker-compose.yml
├── haproxy
│   └── haproxy.cfg
├── log.sh
├── start.sh
├── stop.sh
├── weba
│   └── index.html
├── webb
│   └── index.html
└── webc
    └── index.html

1) docker-compose.yml 구성

  • Load Balancer 포트는 8000번, 통계화면 조회하는 포트는 7000번으로 구성
    cat docker-compose.yml
    # This will start a haproxy and three web services. haproxy will act as a loadbalancer.
    version: "3.9"
    services:
      weba:
          image: httpd:latest
          container_name: weba        
          volumes:
              - ./weba:/usr/local/apache2/htdocs
          environment:
              - TZ=Asia/Seoul        
          expose:
              - 80
      webb:
          image: httpd:latest
          container_name: webb     
          volumes:
              - ./webb:/usr/local/apache2/htdocs
          environment:
              - TZ=Asia/Seoul        
          expose:
              - 80
      webc:
          image: httpd:latest
          container_name: webc     
          volumes:
              - ./webc:/usr/local/apache2/htdocs
          environment:
              - TZ=Asia/Seoul        
          expose:
              - 80
      haproxy:
          image: haproxy:latest
          container_name: haproxy
          volumes:
              - ./haproxy:/haproxy-override
              - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
          links:
              - weba
              - webb
              - webc
          ports:
              - "8000:8000" #service port
              - "7000:7000" #statistics port
    

2) haproxy.cfg 설정파일 구성

cat haproxy.cfg

global
  log /dev/log    local0
  log /dev/log    local1 notice
  maxconn 4096

defaults
  log global
  mode http
  option httplog
  option dontlognull
  timeout connect 5000
  timeout client 50000
  timeout server 50000

listen stats
  bind 0.0.0.0:7000
  mode http
  stats enable
  stats hide-version
  # stats scope .
  stats realm Haproxy\ Statistics
  stats uri /
  # stats page id/pwd, skip
  # stats auth user:pass

frontend web_balancer
  bind 0.0.0.0:8000
  mode http
  default_backend web_backends

backend web_backends
  mode http
  balance roundrobin  # roundrobin 알고리즘으로
  option forwardfor

  option httpchk GET /   # default health cheak
  #option httpchk HEAD /healthcheck.html HTTP/1.1
  server weba weba:80 check inter 1s fastinter 500ms rise 1 fall 1 weight 1
  server webb webb:80 check inter 1s fastinter 500ms rise 1 fall 1 weight 1
  server webc webc:80 check inter 1s fastinter 500ms rise 1 fall 1 weight 1

3) 웹페이지 샘플 스크립트

  • Load Balancer 기능 체크를 위해 파일 이름은 다르게
[root@console /APP/docker_haproxy/haproxy_web]# cat weba/index.html 
weba index.html
[root@console /APP/docker_haproxy/haproxy_web]# cat webb/index.html 
webb index.html
[root@console /APP/docker_haproxy/haproxy_web]# cat webc/index.html 
webc index.html

4) docker-compose로 구동하기

  • 아래 명령어를 통해서 구동
docker-compose -f docker-compose.yml up -d

5) 웹페이지 테스트결과

  • Health Check 와 웹페이지 접속이 roundrobin 방식으로 접속됨(로그로 확인)
docker-compose -f docker-compose.yml logs -f
webb     | 172.19.0.5 - - [29/Mar/2023:23:56:53 +0900] "GET /index.html HTTP/1.1" 200 16
webc     | 172.19.0.5 - - [29/Mar/2023:23:56:53 +0900] "GET / HTTP/1.0" 200 16
weba     | 172.19.0.5 - - [29/Mar/2023:23:56:53 +0900] "GET / HTTP/1.0" 200 16
webb     | 172.19.0.5 - - [29/Mar/2023:23:56:54 +0900] "GET / HTTP/1.0" 200 16
webc     | 172.19.0.5 - - [29/Mar/2023:23:56:54 +0900] "GET / HTTP/1.0" 200 16
weba     | 172.19.0.5 - - [29/Mar/2023:23:56:54 +0900] "GET / HTTP/1.0" 200 16
webb     | 172.19.0.5 - - [29/Mar/2023:23:56:55 +0900] "GET / HTTP/1.0" 200 16
webc     | 172.19.0.5 - - [29/Mar/2023:23:56:55 +0900] "GET / HTTP/1.0" 200 16
weba     | 172.19.0.5 - - [29/Mar/2023:23:56:55 +0900] "GET / HTTP/1.0" 200 16
webb     | 172.19.0.5 - - [29/Mar/2023:23:56:56 +0900] "GET / HTTP/1.0" 200 16
webc     | 172.19.0.5 - - [29/Mar/2023:23:56:56 +0900] "GET / HTTP/1.0" 200 16
weba     | 172.19.0.5 - - [29/Mar/2023:23:56:56 +0900] "GET / HTTP/1.0" 200 16
webb     | 172.19.0.5 - - [29/Mar/2023:23:56:57 +0900] "GET / HTTP/1.0" 200 16
webc     | 172.19.0.5 - - [29/Mar/2023:23:56:57 +0900] "GET / HTTP/1.0" 200 16
webc     | 172.19.0.5 - - [29/Mar/2023:23:56:57 +0900] "GET /index.html HTTP/1.1" 200 16
weba     | 172.19.0.5 - - [29/Mar/2023:23:56:57 +0900] "GET / HTTP/1.0" 200 16
weba     | 172.19.0.5 - - [29/Mar/2023:23:56:58 +0900] "GET /index.html HTTP/1.1" 200 16

6) HAProxy 통계 화면 조회내역

  • IP:7000 포트로 접속시 통계화면이 표기되어 로그를 보지 않더라도 실시간으로 통계 확인이 용이함

태그: ,

카테고리:

업데이트:

댓글남기기