Linux 기반 HAProxy 고가용성 로드밸런스 클러스터 구축 실습

HAProxy 는 높은 성능과 안정성을 갖춘 오픈소스 로드밸런서로, TCP 와 HTTP 기반의 애플리케이션에 대해 프로キシ 서비스를 제공합니다. 가상 호스팅을 지원하며 최대 10Gbps 급의 트래픽 처리 능력을 갖춘 것으로 알려져 있습니다. 네트워크 계층 4(Transport Layer) 부터 7(Application Layer) 까지 포괄적으로 지원하는 점도 특징 중 하나이며, MySQL 과 같은 데이터베이스 서비스에도 적용이 가능합니다.

대규모 트래픽을 받는 웹사이트나 세션 유지가 필요한 서비스에 특히 유리하며, 하드웨어 자원만 허용한다면 수만 개의 동시 연결을 처리할 수 있습니다. 구조적으로 웹 서버 자체를 구동하는 것이 아니라, 트래픽 분산을 위한 전용 프록시로 동작하므로 Nginx 나 Apache 와 비교했을 때 기능이 더욱 특화되어 있습니다. 또한 내부적으로 서버 헬스체크 메커니즘을 탑재하고 있어 장애 발생 시 해당 노드를 자동으로 제외하고 복구 시 다시 포함시키는 고가용성(HA) 을 보장합니다.

실습 환경 사전 정의

이번 실습은 다음과 같은 3 대의 노드로 구성된 환경을 기반으로 진행합니다.

  • Load Balancer (LB): 192.168.1.6 (HAProxy 설치를 담당)
  • Web Server 1: 192.168.1.7
  • Web Server 2: 192.168.1.8

1. HAProxy 라이브러리 설치 및 컴파일

먼저 로드밸런서 역할을 수행하는 머신에서 필수 빌드 도구들을 설치해야 합니다.

yum -y install gcc make openssl-devel psmisc

최신 소스를 다운로드 받아 압축 해제한 후 디렉터리 내로 이동합니다. 커널 버전과 호환되는 타겟 OS 를 지정하여 컴파일을 수행하며, 전역 설치 경로는 /opt/haproxy 로 변경하여 관리 편의성을 높입니다.

cd /usr/local/src/
tar -xzf haproxy-2.x.x.tar.gz
cd haproxy-2.x.x
make TARGET=linux-glibc PREFIX=/opt/haproxy

메이크 파일을 직접 수정하여 경로와 타겟 정보를 확정 짓는 과정 대신, 매개변수를 인자 형태로 전달하여 빌드하는 방식을 사용합니다. 이후 생성된 바이너리를 설치 디렉터리로 복사합니다.

make install PREFIX=/opt/haproxy
ls /opt/haproxy/sbin/

2. 설정 파일 초기화 및 커스터마이징

설정 디렉터리와 런타임 디렉터리를 생성한 후, 주요 설정 파일을 작성합니다. 기존에 존재하지 않는 디렉터리를 먼저 확보해야 합니다.

mkdir -p /opt/haproxy/etc
mkdir -p /opt/haproxy/run
chmod 755 /opt/haproxy/run

주요 설정 파일인 haproxy.cfg 의 구조는 크게 Global, Defaults, Frontend, Backend 로 나뉩니다. 각 섹션의 목적에 맞춰 매개변수 명칭과 값을 최적화하여 재정의합니다.

# /opt/haproxy/etc/haproxy.cfg

global
    log 127.0.0.1 local2 daemon
    maxconn 65535
    chroot /opt/haproxy
    uid nobody
    gid nobody
    daemon
    nbproc auto

defaults
    mode http
    log global
    option httplog
    option dontlognull
    option forwardfor
    retries 3
    timeout connect 5s
    timeout client 1m
    timeout server 1m
    balance roundrobin
    
frontend fe_http_listener
    bind *:80
    default_backend be_web_farm
    stats enable
    stats uri /status
    stats refresh 10s

backend be_web_farm
    option httpchk GET /health
    http-check expect status 200
    server ws_01 192.168.1.7:80 check inter 2000 rise 2 fall 3
    server ws_02 192.168.1.8:80 check inter 2000 rise 2 fall 3

여기서는 기본 제공 예제보다 더 구체적인 헬스 체크 옵션 (inter, rise, fall) 을 추가하여 모니터링의 정확도를 높였습니다. 또한 전역 접속 수를 상향 조정했고, 상태 확인 페이지 URI 를 단순화했습니다.

3. 시스템 데몬으로 통합 (Systemd)

전통적인 init 스크립트 방식보다는 최신 리눅스 배포판에 표준화된 systemd 유닛 파일을 생성하여 관리하는 것이 권장됩니다. 이를 통해 보다 직관적인 시작, 중지, 리로드 작업을 수행할 수 있습니다.

[Unit]
Description=HA Proxy Service
After=syslog.target
After=network.target

[Service]
Type=forking
PIDFile=/opt/haproxy/run/haproxy.pid
ExecStartPre=/opt/haproxy/bin/haproxy -f /opt/haproxy/etc/haproxy.cfg -c -q
ExecStart=/opt/haproxy/sbin/haproxy -f /opt/haproxy/etc/haproxy.cfg -p /opt/haproxy/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

이 내용을 /etc/systemd/system/haproxy.service 에 저장한 후, 권한을 부여하고 데몬을 활성화합니다.

chmod +x /etc/systemd/system/haproxy.service
systemctl daemon-reload
systemctl enable haproxy
systemctl start haproxy

리로드 기능은 별도의 스크립트 없이 systemd 의 reload 명령을 통해 손쉽게 호출 가능하며, 이 과정에서 기존 연결이 강제 끊기지 않도록 USR2 신호를 활용하도록 설정했습니다.

4. 로깅 및 방화벽 설정

시스템 로그 관리를 위해 rsyslog 설정을 수정하여 HAProxy 에서 발생하는 로그를 별도 파일로 수집합니다.

# /etc/rsyslog.conf 에 추가
$ModLoad imudp
$UDPServerRun 514
local2.* /var/log/haproxy.log

방어벽 정책으로는 외부 접근을 허용할 포트만 개방해야 합니다. 80 번 포트는 LB 노드 전체 포트이고, 백엔드 서버들은 내부 네트워크 인터페이스만 노출되도록 설정하거나 LB 노드와 동일한 구간으로 연동합니다.

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

5. 백엔드 서버 환경 준비

로드밸런서 뒤쪽에서 실제 콘텐츠를 제공하는 서버들도 최소한의 설정으로 준비합니다. 두 대의 서버 모두 동일한 구조를 가지며, 응답하는 내용만 구분할 수 있도록 인덱스 페이지에 식별자를 기입합니다.

# youxi2 (192.168.1.7)
yum -y install httpd
echo "Response from Node A" > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd

# youxi3 (192.168.1.8)
yum -y install httpd
echo "Response from Node B" > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd

각 백엔드 서버에서도 방화벽 정책을 확인하여 80 번 포트가 차단되지 않았는지 반드시 점검해야 합니다.

6. 동작 검증 및 모니터링

설정이 완료되었다면 브라우저에서 로드밸런서 IP 의 80 번 포트를 통해 요청을 보냅니다. 페이지 새로고침을 반복하면 설정한 Round Robin 정책에 따라 'Node A'와 'Node B'의 응답이 교대로 출력되어야 정상입니다.

또한 설정된 통계 페이지 주소 (http://<LB_IP>/status) 로 접속하면 현재 각 백엔드 서버의 업타임, 처리 요청 수, 활성 연결 현황 등 실시간 건강 상태를 시각적으로 확인할 수 있습니다. 모든 노드가 ACTIVE 상태로 표시되고 트래픽이 균등하게 분산될 때 성공적인 배포로 판단할 수 있습니다.

태그: HAProxy load-balancing linux-administration systemd network-architecture

7월 8일 21:55에 게시됨