Keepalived + LVS-DR 클러스터 구축 가이드

1. Keepalived 개요

Keepalived는 layer3, layer4, layer5 스위칭 메커니즘과 유사한 소프트웨어로, 웹 서버의 상태를 감지합니다. 웹 서버가 다운되거나 장애가 발생하면 Keepalived가 이를 감지하여 장애가 발생한 서버를 시스템에서 제거하고, 서버가 정상적으로 복구되면 자동으로 다시 서버 풀에 추가합니다. 이러한 모든 작업은 자동으로 처리되며, 관리자는 장애가 발생한 서버만 수동으로 복구하면 됩니다.

2. Keepalived 동작 원리

Layer3, Layer4, Layer5는 IP/TCP 프로토콜 스택의 IP 계층, TCP 계층, 그리고 애플리케이션 계층에서 동작합니다.

  • Layer3: Keepalived가 Layer3 방식으로 동작할 때, 서버 풀의 각 서버에 ICMP 패킷(Ping)을 주기적으로 전송합니다. 특정 서버의 IP 주소가 활성화되어 있지 않으면(예: 비정상 종료) 해당 서버를 장애로 판단하고 풀에서 제외합니다. Layer3는 서버의 IP 주소 유효성을 정상 작동 여부의 기준으로 삼습니다.
  • Layer4: 주로 TCP 포트 상태를 기반으로 서버의 정상 작동 여부를 결정합니다. 예를 들어, 웹 서버의 기본 포트는 80번인데, Keepalived가 80번 포트가 활성화되지 않음을 감지하면 해당 서버를 풀에서 제거합니다.
  • Layer5: Layer5는 구체적인 애플리케이션 계층에서 동작하며, Layer3나 Layer4보다 복잡하고 네트워크 대역폭을 더 많이 사용합니다. Keepalived는 사용자 설정에 따라 서버 프로그램이 정상적으로 실행되는지 확인하고, 설정과 일치하지 않으면 서버를 풀에서 제거합니다.

3. Keepalived의 역할

  1. VIP 관리: VIP(Virtual IP)를 관리하여 LVS(Director) 간에 VIP를 이동시킵니다.
  2. LVS 디스패처 모니터링: 마스터 디스패처에서 실행되는 Keepalived는 멀티캐스트를 통해 네트워크에 자신의 존재를 알립니다(즉, 백업 디스패처에게 마스터가 여전히 살아있는지 알림). 백업 디스패처가 일정 시간(advert_int) 동안 멀티캐스트를 수신하지 못하면 마스터가 다운되었다고 판단하고 작업을 인계받아 VIP를 자신에게 할당합니다.
  3. RS(Real Server) 관리: Keepalived는 일정 간격으로 각 리얼 서버에 접근하는 작업(예: `elinks -dump http://[IP:포트]`)을 수행하여 상태를 확인합니다.

고전적인 고가용성 웹 아키텍처: LVS + keepalived + nginx + apache + php + eaccelerator (+ nfs 선택 가능)

4. 실험 환경

호스트명 IP 주소 설명
youxi1 192.168.5.100 (VIP), 192.168.5.101 (DIP) 마스터 디스패처
youxi2 192.168.5.100 (VIP), 192.168.5.102 (DIP) 백업 디스패처
youxi3 192.168.5.103 리얼 서버 1
youxi4 192.168.5.104 리얼 서버 2

5. 실험 절차

Keepalived 소스 코드는 공식 웹사이트에서 다운로드한 후, 마스터 디스패처(youxi1)와 백업 디스패처(youxi2)에 업로드합니다.

5.1 마스터 디스패처 (youxi1)에 Keepalived + LVS-DR 구축

먼저 ipvsadm을 설치합니다. (로컬 또는 EPEL 저장소 사용, VIP 직접 설정 불필요)

[root@youxi1 ~]# yum -y install ipvsadm

Keepalived 의존성 패키지 설치:

[root@youxi1 ~]# yum -y install gcc openssl-devel libnfnetlink-devel libnl libnl3-devel

Keepalived 소스 코드 컴파일 및 설치:

[root@youxi1 ~]# tar zxf keepalived-1.4.5.tar.gz -C /usr/local/src/
[root@youxi1 ~]# cd /usr/local/src/keepalived-1.4.5/
[root@youxi1 keepalived-1.4.5]# ./configure --prefix=/usr/local/keepalived
[root@youxi1 keepalived-1.4.5]# make && make install
[root@youxi1 keepalived-1.4.5]# echo $?
0

./configure 결과를 확인합니다.

  • Use IPVS Framework: IPVS(IP Virtual Server) 프레임워크 사용 여부. LVS 핵심 코드이며, 사용하지 않으려면 --disable-lvs 옵션을 사용합니다. 여기서는 "Yes"입니다.
  • IPVS use libnl: IPVS가 새 버전의 libnl을 사용하는지 여부. libnl은 Netlink의 구현으로, IPv6를 지원하는 LVS를 의미합니다.
  • Use VRRP Framework: VRRP 프레임워크 사용 여부. Keepalived의 핵심 프로세스인 VRRPD에 필수적입니다. 여기서는 "Yes"입니다.

시작 스크립트 및 설정 파일 준비:

[root@youxi1 keepalived-1.4.5]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@youxi1 keepalived-1.4.5]# vim /etc/init.d/keepalived
# 15행 수정: . /usr/local/keepalived/etc/sysconfig/keepalived
[root@youxi1 keepalived-1.4.5]# chmod +x /etc/init.d/keepalived
[root@youxi1 keepalived-1.4.5]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@youxi1 keepalived-1.4.5]# vim /usr/local/keepalived/etc/sysconfig/keepalived
# KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived/etc/keepalived/keepalived.conf"

Keepalived 설정 파일 (/usr/local/keepalived/etc/keepalived/keepalived.conf) 수정:

[root@youxi1 keepalived-1.4.5]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server localhost
   smtp_connect_timeout 30
   router_id youxi1    # 현재 노드 식별자 (중복 불가)
}

vrrp_instance VI_1 {    # 클러스터 인스턴스 정의
    state MASTER        # 현재 노드를 마스터로 지정
    interface ens33     # VIP가 바인딩될 네트워크 인터페이스
    virtual_router_id 51 # VRRP 그룹 ID (마스터와 백업 동일해야 함)
    priority 100        # 우선순위 (1~254, 높을수록 우선, 마스터가 백업보다 높아야 함)
    advert_int 1        # 멀티캐스트 광고 간격 (초 단위, 마스터와 백업 동일)
    authentication {
        auth_type PASS  # 인증 방식 (PASS: 간단한 비밀번호 인증)
        auth_pass 1111  # 인증 비밀번호 (최대 8자)
    }
    virtual_ipaddress {
        192.168.5.100   # VIP 주소
    }
}

virtual_server 192.168.5.100 80 { # VIP 192.168.5.100:80에 대한 가상 서버 설정
    delay_loop 6        # 리얼 서버 상태 체크 간격 (초)
    lb_algo rr          # LVS 스케줄링 알고리즘 (Round Robin)
    lb_kind DR          # LVS 모드 (Direct Routing)
    # persistence_timeout 50 # 동일 IP의 요청을 50초 동안 동일 서버로 전달 (테스트 시 주석 처리)
    protocol TCP        # 4계층 프로토콜

    real_server 192.168.5.103 80 { # 리얼 서버 1 설정
        weight 1        # 가중치
        TCP_CHECK {     # TCP 연결 확인 방식
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.5.104 80 { # 리얼 서버 2 설정
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

Keepalived 서비스 시작 및 부팅 시 자동 시작 설정:

[root@youxi1 keepalived-1.4.5]# systemctl start keepalived.service
[root@youxi1 keepalived-1.4.5]# systemctl enable keepalived.service
[root@youxi1 keepalived-1.4.5]# systemctl status keepalived.service

IPVS 규칙 및 상태 확인 (서비스는 시작되지 않아도 규칙은 생성됨):

[root@youxi1 keepalived-1.4.5]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.5.100:80 rr persistent 50

방화벽이 활성화된 경우 80번 포트를 허용합니다.

[root@youxi1 keepalived-1.4.5]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload

5.2 백업 디스패처 (youxi2)에 Keepalived + LVS-DR 구축

마스터와 동일하게 설치하되, 설정 파일에서 몇 가지를 변경해야 합니다.

[root@youxi2 keepalived-1.4.5]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server localhost
   smtp_connect_timeout 30
   router_id youxi2   # 변경
}

vrrp_instance VI_1 {
    state BACKUP       # 변경 (백업 역할)
    interface ens33
    virtual_router_id 51
    priority 90        # 변경 (마스터보다 낮게)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.5.100
    }
}

# 가상 서버 설정은 동일
virtual_server 192.168.5.100 80 {
    # ... (생략) ...
}

서비스 시작 및 부팅 자동 설정:

[root@youxi2 keepalived-1.4.5]# systemctl start keepalived.service
[root@youxi2 keepalived-1.4.5]# systemctl enable keepalived.service

방화벽 설정: 80번 포트 외에 VRRP 프로토콜도 허용해야 합니다.

[root@youxi2 keepalived-1.4.5]# firewall-cmd --permanent --zone=public --add-protocol=vrrp
[root@youxi2 keepalived-1.4.5]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload

5.3 VIP 장애 조치 (Failover) 테스트

마스터와 백업의 IP 주소를 확인합니다.

# 마스터 (youxi1)
[root@youxi1 ~]# ip a sh dev ens33
# 출력에 192.168.5.100 (VIP) 이 보여야 함

# 백업 (youxi2)
[root@youxi2 ~]# ip a sh dev ens33
# 출력에 VIP가 없어야 함

마스터의 Keepalived를 중지하고 VIP가 백업으로 이동하는지 확인합니다.

[root@youxi1 ~]# systemctl stop keepalived.service
[root@youxi1 ~]# ip a sh dev ens33
# VIP (192.168.5.100) 가 사라짐

[root@youxi2 ~]# ip a sh dev ens33
# VIP (192.168.5.100) 가 나타남

테스트 완료 후 마스터의 Keepalived를 다시 시작합니다.

5.4 리얼 서버 1 (youxi3) 구축

루프백 인터페이스(lo)에 VIP를 설정합니다.

[root@youxi3 ~]# cd /etc/sysconfig/network-scripts/
[root@youxi3 network-scripts]# cp ifcfg-lo{,:1}
[root@youxi3 network-scripts]# vim ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.5.100
NETMASK=255.255.255.255
#NETWORK=127.0.0.0 # 주석 처리
#BROADCAST=127.255.255.255 # 주석 처리
ONBOOT=yes
NAME=loopback

[root@youxi3 network-scripts]# systemctl restart network

간단한 웹 서버를 설치하고 테스트 페이지를 만듭니다.

[root@youxi3 network-scripts]# yum -y install httpd
[root@youxi3 network-scripts]# systemctl start httpd.service
[root@youxi3 network-scripts]# systemctl enable httpd.service
[root@youxi3 network-scripts]# echo youxi3 > /var/www/html/index.html

방화벽이 활성화된 경우 80번 포트를 허용합니다.

[root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload

5.5 리얼 서버 2 (youxi4) 구축

youxi3와 동일하게 구축하되, 웹 페이지 내용을 "youxi4"로 설정하여 테스트 시 구분할 수 있도록 합니다.

5.6 최종 테스트

클라이언트(예: Windows 브라우저)에서 VIP(192.168.5.100)에 접속하여 요청이 youxi3와 youxi4로 교차되어 전송되는지 확인합니다. (persistence_timeout 설정은 주석 처리하여 RR 알고리즘이 제대로 동작하도록 함). 마스터 Keepalived를 중지해도 VIP가 백업으로 이동하여 서비스가 지속되는지 확인합니다.

6. 두 서버 간 Master/Backup 역할 이중화

기존 구성을 확장하여, youxi1은 192.168.5.100의 마스터, youxi2는 192.168.5.105의 마스터 역할을 하도록 설정합니다. 즉, 서로 상대방 VIP의 백업 역할을 수행합니다.

6.1 youxi1 설정 추가

새로운 VRRP 인스턴스(VI_2)와 가상 서버를 추가합니다.

[root@youxi1 ~]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf
vrrp_instance VI_2 {
    state BACKUP       # youxi1은 VI_2의 백업
    interface ens33
    virtual_router_id 52
    priority 90        # youxi2의 VI_2 우선순위(100)보다 낮아야 함
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.5.105  # 새로운 VIP
    }
}

virtual_server 192.168.5.105 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    # persistence_timeout 50
    protocol TCP

    real_server 192.168.5.103 80 {
        # ... 설정 ...
    }
    real_server 192.168.5.104 80 {
        # ... 설정 ...
    }
}
[root@youxi1 ~]# systemctl restart keepalived.service

6.2 youxi2 설정 추가

youxi2를 VI_2의 마스터로 설정합니다.

[root@youxi2 ~]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf
vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.5.105
    }
}

# 가상 서버 설정 추가 (youxi1과 동일)
virtual_server 192.168.5.105 80 {
    # ... (생략) ...
}
[root@youxi2 ~]# systemctl restart keepalived.service

6.3 리얼 서버에 루프백 인터페이스 추가

youxi3와 youxi4에도 새로운 VIP(192.168.5.105)에 대한 루프백 인터페이스(lo:2)를 생성합니다.

# youxi3
[root@youxi3 ~]# cd /etc/sysconfig/network-scripts/
[root@youxi3 network-scripts]# cp ifcfg-lo{,:2}
[root@youxi3 network-scripts]# vim ifcfg-lo:2
DEVICE=lo:2
IPADDR=192.168.5.105
NETMASK=255.255.255.255
#NETWORK=127.0.0.0
#BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
[root@youxi3 network-scripts]# systemctl restart network

# youxi4 (동일한 방식으로 설정)

6.4 방화벽 설정 확인

youxi1에서도 VRRP 프로토콜을 허용해야 합니다.

[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-protocol=vrrp && firewall-cmd --reload

6.5 결과 확인

설정 후 각 서버에 VIP가 올바르게 할당되었는지 확인합니다. youxi1에는 100만, youxi2에는 105만 할당되어 있어야 하며, 각자 마스터 역할을 수행합니다.

# youxi1
[root@youxi1 ~]# ip a sh dev ens33
# 192.168.5.100 만 보여야 함

# youxi2
[root@youxi2 ~]# ip a sh dev ens33
# 192.168.5.105 만 보여야 함

이제 youxi1 또는 youxi2 중 하나가 다운되어도, 해당 서버가 담당하던 VIP는 다른 서버로 이동하여 가용성이 유지됩니다.

7. 추가 개념

  • VRRP (Virtual Router Redundancy Protocol): 라우터 장애 조치를 위한 표준 프로토콜입니다. 네트워크 내 호스트들은 기본 게이트웨이(Default Gateway)를 사용하는데, 이 게이트웨이 역할을 하는 물리적 라우터가 다운되면 VRRP가 백업 라우터를 활성화하여 통신을 유지합니다. 가상 라우터(VRID)를 통해 다중 물리적 라우터를 하나의 논리적 라우터로 묶는 개념입니다.
  • HSRP (Hot Standby Router Protocol): Cisco 사의 독점 프로토콜로 VRRP와 유사한 목적을 가집니다. HSRP 그룹 내에서 하나의 액티브 라우터가 트래픽을 전달하고, 액티브 라우터에 장애가 발생하면 백업 라우터가 그 역할을 인계받습니다.
  • VRRP와 HSRP의 주요 차이점:
    • 소유권: VRRP는 IETF 표준(IEEE 표준), HSRP는 Cisco 독점 프로토콜입니다.
    • 보안: VRRP는 인증 메커니즘을 지원하지만, HSRP는 기본적으로 지원하지 않습니다.
    • 상태: VRRP는 Initialize, Master, Backup의 3가지 상태, HSRP는 6가지 상태(Initial, Learn, Listen, Speak, Standby, Active)를 가집니다.
    • 패킷: VRRP는 고정된 멀티캐스트 주소(224.0.0.18)를 사용하며, IP 프로토콜 넘버 112를 사용합니다. HSRP는 UDP 포트 1985번을 사용하고 멀티캐스트 주소 224.0.0.2를 사용합니다.

태그: Keepalived LVS-DR vrrp high availability Load Balancing

6월 26일 01:31에 게시됨