Network & Server Factory

개인 공부 기록

Server & OS/Linux

[Linux] HAProxy + keepalived로 VIP 이중화 로드밸런서 구성

1nfra 2022. 11. 26. 17:16
HAProxy 2대(Master/Backup)와 keepalived로 VIP(192.168.1.200)를 공유하는 이중화 로드밸런서를 만들고, 뒤에 WordPress 웹 서버 2대를 붙였습니다. Master를 재시작해 VIP가 Backup으로 넘어가는 것까지 확인했습니다.

1. 구성

  • keepalived: VIP 관리와 이중화(Master 장애 시 Backup이 VIP를 넘겨받음)
  • HAProxy: 웹 서버로 트래픽을 나누는 로드밸런싱
호스트 IP 포트 역할
VIP 192.168.1.200 - HAProxy Master/Backup이 공유
Haproxy_Master 192.168.1.201 80 keepalived + HAProxy
Haproxy_Backup 192.168.1.202 80 keepalived + HAProxy
Web_Master 192.168.1.104 80 WordPress
Web_Backup 192.168.1.127 80 WordPress

2. sysctl 설정

Master와 Backup의 /etc/sysctl.conf에 아래 두 줄을 추가합니다. ip_nonlocal_bind는 VIP가 자기 서버에 없을 때도 HAProxy가 그 주소로 바인딩할 수 있게 해 줍니다.

root@Haproxy_Master:~ vi /etc/sysctl.conf
root@Haproxy_Backup:~ vi /etc/sysctl.conf

net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1

3. HAProxy 설정

3.1 설치

Master와 Backup 모두에 HAProxy를 설치합니다.

root@Haproxy_Master:~ apt-get install -y haproxy
root@Haproxy_Backup:~ apt-get install -y haproxy

3.2 haproxy.cfg 수정

Master와 Backup의 /etc/haproxy/haproxy.cfg를 각각 수정합니다.

root@Haproxy_Master:~ vi /etc/haproxy/haproxy.cfg

	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

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Default ciphers to use on SSL-enabled listening sockets.
        # For more information, see ciphers(1SSL). This list is from:
        #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
        # An alternative list with additional directives can be obtained from
        #  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option forwardfor
        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

frontend haproxy
        bind *:80
        mode http
        default_backend SERVER_WEB

backend SERVER_WEB
        balance roundrobin
        server WEB 192.168.1.104:80 check
        server WEB 192.168.1.127:80 check
        option httpchk GET /

Haproxy_Master의 haproxy.cfg

root@Haproxy_Backup:~ vi /etc/haproxy/haproxy.cfg

	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

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Default ciphers to use on SSL-enabled listening sockets.
        # For more information, see ciphers(1SSL). This list is from:
        #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
        # An alternative list with additional directives can be obtained from
        #  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option forwardfor
        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

frontend haproxy
        bind *:80
        mode http
        default_backend SERVER_WEB

backend SERVER_WEB
        balance roundrobin
        server WEB 192.168.1.104:80 check
        server WEB 192.168.1.127:80 check
        option httpchk GET /

Haproxy_Backup의 haproxy.cfg

3.3 HAProxy 시작

root@Haproxy_Master:~ /etc/init.d/haproxy restart -f /etc/haproxy/haproxy.cfg
root@Haproxy_Backup:~ /etc/init.d/haproxy restart -f /etc/haproxy/haproxy.cfg

4. keepalived 설정

4.1 설치

root@Haproxy_Master:~ apt-get install -y keepalived
root@Haproxy_Backup:~ apt-get install -y keepalived

4.2 Master 설정

root@Haproxy_Master:~ vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 50
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass Password@
    }
    virtual_ipaddress {
        192.168.1.200
    }
}

4.3 Backup 설정

Backup은 state를 BACKUP으로 두고, priority를 Master보다 낮게 설정해야 합니다(Master 100, Backup 50).

root@Haproxy_Backup:~ cat /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 50
    priority 50
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass Password@
    }
    virtual_ipaddress {
        192.168.1.200
    }
}

4.4 keepalived 시작

root@Haproxy_Master:~ service keepalived start
root@Haproxy_Backup:~ service keepalived start

5. 검증

설정을 마치고 Master의 IP를 보면 VIP 192.168.1.200이 추가되어 있습니다.

Haproxy_Master에 VIP 192.168.1.200 할당

 

Master를 재시작해 장애 상황을 만들어 보니 VIP가 Backup으로 넘어가 정상 동작했습니다.

Master 재시작 후 Haproxy_Backup으로 넘어간 VIP

6. 정리

  • keepalived가 VIP를, HAProxy가 로드밸런싱을 맡는 구조입니다.
  • Backup의 priority를 Master보다 낮게 설정해야 평소에는 Master가 VIP를 가집니다.
  • net.ipv4.ip_nonlocal_bind=1을 켜 두면 VIP가 없는 서버에서도 HAProxy가 미리 떠 있을 수 있습니다.
728x90
서울
--:--:--
-전체 글
-카테고리
오늘 방문