HAProxy 설정 (2)

초콜렛빵·2024년 5월 30일
0

공부

목록 보기
5/5

HAProxy 설정 진행

기본적으로 HAProxy는 reverse proxy 형태로 진행이 되는 구조이다. 서버의 앞단에서 요청에 대해서 전달을 하고, 그 결과를 받아서 반환하는 역할을 하게 된다.

원하는 구조

기존 패치 시, 사람들이 안 쓰는 시간인 퇴근 시간 이후 7~8시에 진행이 되어야 했다. 이를 서버 두개를 운영하며, HAProxy에서 패치를 위해 중지한 서버에 대해 접근이 되지 않도록 처리하고, 중지한 서버가 패치가 완료되면 해당 서버로 클라이언트가 연결, 나머지 서버를 패치가 가능하도록 처리하는 것이 목표였다.

이를 위해 중간에 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.cfg 설정

이제 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_backendbeta_1으로 전송이 멈추게 된다. 즉 7007 포트에 대해서는 통신이 더 이상 이루어 지지 않는다.

다시 재활 성화 하는 방법은

enable server beta_backend/beta_1 | socat - /run/haproxy/admin.sock

이 명령어를 실행하면 다시 재활성화 되어 7007 포트로도 네트워크 통신이 이루어진다.

이를 잘 활용하면 서비스를 사용중일 때에도 패치가 가능해지게 된다.

profile
차근차근 기록하고 배우는 개발자

0개의 댓글