소프트웨어 L4/L7 로드 밸런서 HAProxy 구성 절차
HAProxy는 L4/L7 로드 밸런서 역할을 해주는 오픈 소스 소프트웨어입니다.
성능 또한 나쁘지 않기 때문에 물리적으로 로드 밸런서를 둘 수 없는 상황이라면 좋은 대안이 될 수 있을 것 같습니다.
저는 개인적으로 Linux 환경에 익숙하지 않은데, 저와 같은 분들을 위해 설치 절차를 정리해 공유합니다.
먼저, 테스트 시스템 환경은 다음과 같습니다.
- HAProxy VIP: 192.168.0.150
- HAProxy #1: 192.168.0.151
- HAProxy #2: 192.168.0.152
- Web Server #1: 192.168.0.153
- Web Server #2: 192.168.0.154
1. CentOS 7을 설치합니다. 저의 경우 최소 설치 모드로 설치한 후 SELINUX를 Disable 하였습니다.
vi /etc/sysconfig/selinux
SELINUX=disabled
2. 두 HAProxy 서버에 HAProxy와 keepalived 패키지를 설치합니다.
yum install -y haproxy keepalived
3. 먼저, keepalived를 설정하겠습니다. 원본 설정 파일을 복사해 새 설정 파일을 만듭니다.
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.origin
4. 텍스트 편집기로 /etc/keepalived/keepalived.conf 설정 파일을 엽니다.
vi /etc/keepalived/keepalived.conf
5. 메일 알림 관련 설정은 삭제합니다.
global_defs {
notification_email {
}
}
6. virtual_ipaddress 항목을 VIP로 설정하고, 아래의 나머지 설정들은 삭제합니다. MASTER 서버는 state MASTER, priority 200, BACKUP 서버는 state BACKUP, priority 100으로 설정합니다.
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.150
}
}
7. 두 HAProxy 서버에서 keepalived를 실행합니다.
service keepalived start
8. 간단히 테스트를 위해 VIP로 ping으로 테스트해 본 결과 MASTER에서 BACKUP으로의 Failover 시에는 ping이 적게는 1개, 많게는 3개가 빠지는 것으로 확인되었으며, BACKUP에서 다시 MASTER로의 Failback 시에는 ping loss 없이 되는 것을 확인할 수 있었습니다.
여기까지는 HAProxy 서버에 대한 이중화를 위한 구성이었으며, 이제부터의 작업은 실제 로드 밸런싱을 처리하는 패키지인 HAProxy에 대한 설정을 설명합니다.
HTTP 및 TCP에 대한 로드 밸런싱이 가능하기 때문에 필요에 따라 여러 서비스(DB, Redis 등)에 대한 부하 분산 용도로 사용이 가능합니다만, 여기서는 일반적으로 웹 서버에 대한 부하 분산 설정으로 구성합니다.
또한, 단순히 HTTP 요청(TCP 80)을 Backend 서버로 전송하도록 설정하는 경우에는 웹 서비스마다 HAProxy를 두어야 하는 상황이 될 수 있기 때문에 요청 주소에 따라 분기하도록 하고, 쿠키를 사용한 Sticky Session 설정을 한 구성입니다.
9. 원본 파일은 복사해 둔 후 HAProxy 설정 파일을 텍스트 편집기로 엽니다.
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.origin
vi /etc/haproxy/haproxy.cfg
10. 아래는 호출한 도메인에 따라 두 대의 Backend 서버로 각각 분기하는 예제입니다.
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 100000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#-------- Custom Error Page
# errorfile 400 /etc/haproxy/errors/400.html
# errorfile 403 /etc/haproxy/errors/403.html
# errorfile 408 /etc/haproxy/errors/408.html
# errorfile 500 /etc/haproxy/errors/500.html
# errorfile 502 /etc/haproxy/errors/502.html
# errorfile 503 /etc/haproxy/errors/503.html
# errorfile 504 /etc/haproxy/errors/504.html
#------- Main Frontend
frontend http *:80
#-- redirect http to https
# redirect scheme https if !{ ssl_fc }
acl host_name1 hdr(host) -i naver.com www.naver.com
acl host_name2 hdr(host) -i daum.net www.daum.net
use_backend webfarm1 if host_name1
use_backend webfarm2 if host_name2
#------- Web Farm #1
backend webfarm1
mode http
balance roundrobin
option httpchk GET / HTTP/1.0
option log-health-checks
option forwardfor
option httpclose
cookie SERVERID insert indirect nocache
stats enable
stats uri /haproxy
server node1 192.168.0.153:8081 cookie node1 check inter 1000 rise 3 fall 3
server node2 192.168.0.154:8081 cookie node2 check inter 1000 rise 3 fall 3
#------- Web Farm #2
backend webfarm2
mode http
balance roundrobin
option httpchk GET / HTTP/1.0
option log-health-checks
option forwardfor
option httpclose
cookie SERVERID insert indirect nocache
stats enable
stats uri /haproxy
server node1 192.168.0.153:8082 cookie node1 check inter 1000 rise 3 fall 3
server node2 192.168.0.154:8082 cookie node2 check inter 1000 rise 3 fall 3
11. 구성 파일을 저장한후 각각의 HAProxy 서버에서 서비스를 시작 후 정상적으로 시작되었는지 확인합니다.
service haproxy start
systemctl status -l haproxy.service
12. 부팅 시 각각의 서비스가 시작되도록 설정합니다.
systemctl enable keepalived
systemctl enable haproxy
13. 이제 테스트를 위해 Windows 클라이언트에서 HOSTS 파일에 daum.net과 naver.com에 대한 IP 주소를 HAProxy의 VIP로 설정한 후 테스트해 정상적으로 부하분산이 되는 것을 확인하였습니다. Fiddler로 요청을 확인해 보면 아래와 같이 Cookie 정보를 받아오는 것을 확인할 수 있습니다.
14. 설정에 따라 /haproxy 페이지로 이동하면 전체적인 노드 응답 상태, 요청 수 등의 상황을 확인할 수 있습니다.
전체 설정 옵션은 아래 링크를 참고하세요.
http://cbonte.github.io/haproxy-dconv/configuration-1.5.html