기본적으로 HAProxy는 reverse proxy 형태로 진행이 되는 구조이다. 서버의 앞단에서 요청에 대해서 전달을 하고, 그 결과를 받아서 반환하는 역할을 하게 된다.
기존 패치 시, 사람들이 안 쓰는 시간인 퇴근 시간 이후 7~8시에 진행이 되어야 했다. 이를 서버 두개를 운영하며, HAProxy에서 패치를 위해 중지한 서버에 대해 접근이 되지 않도록 처리하고, 중지한 서버가 패치가 완료되면 해당 서버로 클라이언트가 연결, 나머지 서버를 패치가 가능하도록 처리하는 것이 목표였다.
이를 위해 중간에 HAProxy를 세팅하는 것이 목표였다.

HAProxy 설치를 CentOS에 설치 하는 경우
# package setting
yum -y install wget yum-utils gcc perl pcre-devel openssl-devel zlib-devel readline-devel systemd-devel tar lua lua-devel make
# download 2.7 haproxy
wget http://www.haproxy.org/download/2.7/src/haproxy-2.7.0.tar.gz
tar -xzf haproxy-2.7.0.tar.gz
cd haproxy-2.7.0
# compile source code
make TARGET=linux-glibc
sudo make install
# set config files
sudo mkdir -p /etc/haproxy
sudo cp examples/haproxy.init /etc/init.d/haproxy
sudo chmod +x /etc/init.d/haproxy
sudo cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg
# add service and start
sudo chkconfig --add haproxy
sudo chkconfig haproxy on
sudo service haproxy start
해당 명령어를 이용해 HAProxy 설치가 가능하다.
이제 HAProxy의 설정을 통해 서버들의 로드밸런싱을 설정할텐데 기본적으로 내가 한 세팅은 다음과 같다.
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen stats
bind *:9000
mode http
stats enable
stats realm HAProxy Statistics
stats uri /haproxy_stats
stats auth admin:admin
#---------------------------------------------------------------------
# TCP-in
#---------------------------------------------------------------------
listen server_80
bind *:80
option forwardfor
redirect scheme https code 301 if !{ ssl_fc }
frontend service_alpha
bind *:7067
option forwardfor
use_backend webserver_apache if is_react
default_backend alpha_backend
backend alpha_backend
balance roundrobin
option forwardfor
#hash-type consistent #sticky session : client id hash
## source ip table
stick-table type ip size 200k expire 600m
stick on src
server alpha1 127.0.0.1:7006 check
server alpha2 127.0.0.1:7016 check
frontend service_beta
bind *:7068
mode tcp
option tcplog
default_backend beta_backend
backend beta_backend
balance roundrobin
mode tcp
timeout connect 5m
timeout client 5m
timeout server 5m
server beta_1 127.0.0.1:7007 check
server beta_2 127.0.0.1:7017 check
위의 세팅의 경우 서비스 두개에 대해서 각각 front를 통해서 포트 두개를 열어 놓았다. 이를 활용하여, backend 쪽으로 로드밸런싱이 처리 되는데 이는 balance roundrobin 즉, roundrobin 형태로 로드밸런싱이 이루어진다.
각각의 설명에 대해서는 아래를 참고
HAProxy 설정 값 설명- global # 전역 옵션 섹션
- daemon: 백그라운드 모드(background mode)로 실행
- log: syslog 설정
- log-send-hostname: hostname 설정
- uid: 프로세스의 userid를 number로 변경
- user: 프로세스의 userid를 name으로 변경
- node: 두 개 이상의 프로세스나 서버가 같은 IP 주소를 공유할 때 name 설정(HA 설정)
- maxconn: 프로세스당 최대 연결 개수
- Defaults # 기본 옵션 섹션
- log: syslog 설정
- maxconn: 프로세스당 최대 연결 개수
- listen webfarm 10.101.22.76:80 : haproxy name ip:port
- mode http: 연결 프로토콜
- option httpchk: health check
- option log-health-checks: health 로그 남김 여부
- option forwardfor: 클라이언트 정보 전달
- option httpclose: keep-alive 문제 발생 시 off 옵션
- cookie SERVERID rewrite: 쿠키로 서버 구별 시 사용 여부
- cookie JSESSIONID prefix: HA 구성 시 prefix 이후에 서버 정보 주입 여부
- balance roundrobin: 순환 분배 방식
- stats enable: 서버 상태 보기 가능 여부
- stats uri /admin: 서버 상태 보기 uri
- server xvadm01.ncli 10.101.22.18:80 cookie admin_portal_1 check inter 1000 rise 2 fall 5: real server 정보(server [host명] [ip]:[port] cookie [서버쿠키명] check inter [주기(m/s)] rise [서버구동여부점검횟수], fall [서비스중단여부점검횟수])
- balance 옵션
- roundrobin: 순차적으로 분배(최대 연결 가능 서버 4128개)
- static-rr: 서버에 부여된 가중치에 따라서 분배
- leastconn: 접속 수가 가장 적은 서버로 분배
- source: 운영 중인 서버의 가중치를 나눠서 접속자 IP를 해싱(hashing)해서 분배
- uri: 접속하는 URI를 해싱해서 운영 중인 서버의 가중치를 나눠서 분배(URI의 길이 또는 depth로 해싱)
- url_param: HTTP GET 요청에 대해서 특정 패턴이 있는지 여부 확인 후 조건에 맞는 서버로 분배(조건 없는 경우 round robin으로 처리)
- hdr: HTTP 헤더 에서 **hdr(<name>)**으로 지정된 조건이 있는 경우에 대해서만 분배(조건 없는 경우 round robin으로 처리)
- rdp-cookie: TCP 요청에 대한 RDP 쿠키에 따른 분배
위와 같은 설정을 한 후에, HAProxy에서 설정한 포트에 대해서 enable, disable 명령어를 통해서 특정 포트로 전달 되는 것을 중단, 실행이 가능하다.
명령어의 예시로는
disable server beta_backend/beta_1 | socat - /run/haproxy/admin.sock
위의 명령어 실행을 하면 기존 beta_backend의 beta_1으로 전송이 멈추게 된다. 즉 7007 포트에 대해서는 통신이 더 이상 이루어 지지 않는다.
다시 재활 성화 하는 방법은
enable server beta_backend/beta_1 | socat - /run/haproxy/admin.sock
이 명령어를 실행하면 다시 재활성화 되어 7007 포트로도 네트워크 통신이 이루어진다.
이를 잘 활용하면 서비스를 사용중일 때에도 패치가 가능해지게 된다.