Keepalived 기반 고가용성 클러스터 구성 및 활용

VRRP 기반의 고가용성 솔루션: Keepalived 소개

Keepalived은 VRRP(Virtual Router Redundancy Protocol)를 소프트웨어로 구현한 오픈소스 도구로, 원래는 IPVS 기반 로드 밸런싱 환경에서 고가용성을 제공하기 위해 개발되었습니다. 주요 목적은 가상 IP(VIP)의 자동 이관을 통해 서비스 중단 없이 장애 복구를 가능하게 하는 것입니다.

주요 기능은 다음과 같습니다:

  • VRRP 프로토콜을 이용한 VIP 이동
  • 클러스터 구성 시 IPVS 규칙 자동 생성
  • 실제 서버(RS)에 대한 상태 모니터링
  • 스크립트 연동을 통한 확장성 제공 (Nginx, HAProxy 등 외부 서비스 제어 가능)

아키텍처 및 핵심 컴포넌트

Keepalived은 사용자 공간에서 동작하며, 다음의 주요 모듈로 구성됩니다:

  • VRRP 스택: 마스터/백업 노드 간 상태 메시지 교환
  • 체커(Health Checkers): 백엔드 서버의 생존 여부 감시
  • IPVS Wrapper: 라우팅 테이블과 IPVS 규칙 동기화
  • SMTP 모듈: 장애 발생 시 알림 메일 전송
  • Netlink Reflector: 커널 네트워크 인터페이스와 통신
  • 스크립트 실행기: 상태 변경 시 외부 스크립트 호출

운영 환경 준비 사항

  • 모든 노드 간 시간 동기화 (chronyd 또는 ntpd 사용 권장)
  • 방화벽(iptables/firewalld) 및 SELinux 비활성화 또는 적절한 정책 설정
  • 호스트 이름 기반 통신 가능하도록 /etc/hosts 파일 구성
  • SSH 키페어 기반 원격 접근 설정 (옵션)

설치 및 기본 구성 요소

필수 패키지 설치:

yum install -y keepalived

주요 파일 위치:

  • 실행 바이너리: /usr/sbin/keepalived
  • 기본 설정 파일: /etc/keepalived/keepalived.conf
  • 서비스 정의: /usr/lib/systemd/system/keepalived.service
  • 환경 변수 파일: /etc/sysconfig/keepalived

기본 VRRP 그룹 구성 예제

다음은 두 노드(KA1, KA2) 간 기본 VIP 이관 설정입니다.

KA1 (마스터):

global_defs {
    router_id LVS_DEVEL
    vrrp_skip_check_adv_addr
    vrrp_garp_interval 1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass secret123
    }

    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:0
    }
}

KA2 (백업):

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 80
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass secret123
    }

    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:0
    }
}

서비스 시작 후 tcpdump로 VRRP 패킷 확인 가능:

tcpdump -i eth0 -n proto \\icmp or udp port 6081

로그 관리 최적화

기본적으로 시스템 로그(/var/log/messages)에 출력되므로 분리를 권장합니다.

  1. 옵션 수정:
  2. echo 'KEEPALIVED_OPTIONS="-D -S 5"' > /etc/sysconfig/keepalived
  3. rsyslog 설정 추가:
  4. echo 'local5.* /var/log/keepalived.log' >> /etc/rsyslog.conf
  5. 서비스 재시작:
  6. systemctl restart rsyslog keepalived

구성 파일 모듈화

대규모 환경에서는 include 지시어로 설정 분할이 유리합니다.

! /etc/keepalived/keepalived.conf
include /etc/keepalived/conf.d/*.conf
mkdir -p /etc/keepalived/conf.d
# 각각의 vrrp_instance 또는 virtual_server 정의를 별도 .conf 파일로 저장

선점 모드 제어

기본적으로 우선순위가 높은 노드가 항상 VIP를 가져갑니다. 이를 방지하려면 nopreempt 옵션 사용:

vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    ...
}

또는 일정 시간 후 선점을 허용하는 지연 선점도 가능:

preempt_delay 30

유니캐스트 모드 설정

멀티캐스트가 불가능한 멀티세그먼트 환경에서는 유니캐스트 사용:

vrrp_instance VI_1 {
    ...
    unicast_src_ip 172.25.254.50
    unicast_peer {
        172.25.254.60
    }
}

이메일 알림 설정

장애 발생 시 관리자에게 알림 전송:

global_defs {
    notification_email {
        admin@example.com
    }
    smtp_server localhost
    smtp_connect_timeout 30
}

외부 SMTP 서버 사용 시 /etc/mail.rc 설정 필요:

set smtp=smtp.gmail.com:587
set smtp-auth=login
set smtp-auth-user=username@gmail.com
set smtp-auth-password=app_password
set ssl-verify=ignore

스크립트 기반 상태 모니터링

외부 프로세스 상태에 따라 VIP 이관을 트리거할 수 있습니다.

vrrp_script chk_haproxy {
    script "[[ \$(pidof haproxy | wc -l) -gt 0 ]]"
    interval 2
    weight -30
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    ...
    track_script {
        chk_haproxy
    }
}

이중 활성(Dual-Master) 아키텍처

서로 다른 VIP를 서로 다른 마스터로 운영하여 리소스 활용도 향상:

# KA1 설정
vrrp_instance WEB {
    state MASTER
    virtual_router_id 51
    priority 100
    virtual_ipaddress { 172.25.254.100 }
}

vrrp_instance DB {
    state BACKUP
    virtual_router_id 52
    priority 80
    virtual_ipaddress { 172.25.254.200 }
}

# KA2 설정
vrrp_instance WEB {
    state BACKUP
    virtual_router_id 51
    priority 80
    virtual_ipaddress { 172.25.254.100 }
}

vrrp_instance DB {
    state MASTER
    virtual_router_id 52
    priority 100
    virtual_ipaddress { 172.25.254.200 }
}

IPVS 기반 로드 밸런싱 통합

Keepalived 내부에서 IPVS 규칙을 직접 관리 가능:

virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 172.25.254.10 80 {
        weight 1
        HTTP_GET {
            url { path / status_code 200 }
            connect_timeout 3
        }
    }

    real_server 172.25.254.20 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 4
        }
    }
}

RS 측에는 ARP 필터링 설정 필요:

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

HAProxy와의 통합 활용

Keepalived으로 HAProxy 고가용성을 보장하는 패턴:

  • VIP는 Keepalived이 관리
  • 실제 트래픽 처리는 HAProxy가 수행
  • HAProxy 프로세스 다운 시 Keepalived이 VIP 이관

이를 통해 L4 + L7 계층의 완전한 고가용성 아키텍처를 구축할 수 있습니다.

태그: Keepalived vrrp 고가용성 IPVS 로드밸런싱

5월 24일 20:46에 게시됨