/엔지니어/네트워킹 / 서버/keepalived VRRP 완전 가이드 — 가상
네트워킹 / 서버고급UbuntuDebianCentOSkeepalivedvrrp고가용성

keepalived VRRP 완전 가이드 — 가상 IP 페일오버로 고가용성 구성

VRRP로 가상 IP를 여러 노드가 공유해 마스터 장애 시 무중단 전환합니다. MASTER/BACKUP 설정, vrrp_script 헬스체크, split-brain 방지까지 실전 구성.

keepalived와 VRRP — 죽지 않는 가상 IP

로드밸런서나 게이트웨이가 한 대뿐이면, 그 서버가 죽는 순간 서비스 전체가 멈춥니다(SPOF, 단일 장애점). keepalived는 VRRP(Virtual Router Redundancy Protocol)로 **가상 IP(VIP)**를 여러 노드가 공유하게 해, 마스터가 죽으면 백업이 즉시 VIP를 넘겨받도록 만듭니다.

동작 원리는 이렇습니다.

  • 여러 노드가 하나의 VIP를 두고 우선순위(priority)로 경쟁합니다.
  • 우선순위가 가장 높은 노드가 MASTER가 되어 VIP를 보유합니다.
  • MASTER는 주기적으로 VRRP 광고(advertisement)를 멀티캐스트로 보냅니다.
  • 광고가 끊기면(마스터 다운) BACKUP이 이를 감지하고 VIP를 인수합니다. 클라이언트 입장에선 IP가 그대로라 재접속이 필요 없습니다.

keepalived는 "서버를 살려 주는" 도구가 아니라 "IP를 살아 있는 노드로 옮겨 주는" 도구입니다. 실제 트래픽 분산은 뒤에 둔 HAProxy/Nginx가 하고, keepalived는 그 앞단 VIP의 페일오버만 담당하는 조합이 정석입니다.


구성 시나리오

  • VIP: 10.0.0.100 (클라이언트가 바라보는 주소)
  • node1: 10.0.0.11 — 평소 MASTER (priority 높음)
  • node2: 10.0.0.12 — 평소 BACKUP

설치와 커널 설정

Bash
# Ubuntu / Debian
sudo apt update && sudo apt install -y keepalived

# RHEL / CentOS / Rocky
sudo dnf install -y keepalived

로컬에 바인딩되지 않은 VIP를 서비스가 미리 열 수 있도록 커널 옵션을 켜 둡니다(HAProxy 연동 시 유용).

Bash
echo 'net.ipv4.ip_nonlocal_bind = 1' | sudo tee /etc/sysctl.d/60-keepalived.conf
sudo sysctl --system

MASTER 설정 (node1)

/etc/keepalived/keepalived.conf:

Config
vrrp_instance VI_1 {
    state MASTER
    interface eth0            # VIP를 붙일 실제 인터페이스
    virtual_router_id 51      # 같은 그룹의 모든 노드가 동일해야 함(0~255)
    priority 110              # 높을수록 우선 (MASTER를 크게)
    advert_int 1              # 광고 주기(초)

    authentication {
        auth_type PASS
        auth_pass s3cretVRRP   # 8자 이내 권장, 양 노드 동일
    }

    virtual_ipaddress {
        10.0.0.100/24        # 공유할 VIP
    }
}

BACKUP 설정 (node2)

statepriority만 다르고 나머지(virtual_router_id, auth_pass, VIP)는 반드시 동일해야 합니다.

Config
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51      # MASTER와 동일
    priority 100              # MASTER보다 낮게
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass s3cretVRRP   # 동일
    }

    virtual_ipaddress {
        10.0.0.100/24
    }
}

두 노드에서 서비스를 시작합니다.

Bash
sudo systemctl enable --now keepalived
sudo systemctl status keepalived

VIP와 페일오버 확인

MASTER에서만 VIP가 인터페이스에 올라와 있어야 합니다(ip addr로 확인. ifconfig에는 보조 IP가 안 보일 수 있음).

Bash
# node1 (MASTER)에서
ip addr show eth0
# inet 10.0.0.11/24 ...
# inet 10.0.0.100/24 scope global secondary eth0   ← VIP 보유

# node2 (BACKUP)에는 VIP가 없어야 정상

페일오버 테스트:

Bash
# node1에서 keepalived 중지 → 장애 시뮬레이션
sudo systemctl stop keepalived

# node2에서 즉시 확인 → VIP가 넘어와 있어야 함
ip addr show eth0 | grep 10.0.0.100

# 로그로 전환 관찰
sudo journalctl -u keepalived -f
# ... Entering MASTER STATE

node1의 keepalived를 다시 시작하면 우선순위가 높아 VIP를 되찾아옵니다(preemption).


서비스 헬스체크 — vrrp_script

기본 VRRP는 "keepalived 프로세스"의 생존만 봅니다. 정작 중요한 건 뒤의 HAProxy/Nginx가 살아 있느냐입니다. vrrp_script로 애플리케이션 상태를 감시해, 서비스가 죽으면 우선순위를 낮춰 VIP를 넘기게 합니다.

Config
vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"  # 프로세스 존재 확인(참이면 0)
    interval 2      # 2초마다
    weight -20      # 실패 시 priority 20 감소
    fall 2          # 2회 연속 실패하면 DOWN
    rise 2          # 2회 연속 성공하면 UP
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 110
    advert_int 1
    authentication { auth_type PASS; auth_pass s3cretVRRP }
    virtual_ipaddress { 10.0.0.100/24 }

    track_script {
        chk_haproxy        # 이 스크립트 결과를 우선순위에 반영
    }
}

이제 node1의 HAProxy가 죽으면 priority가 110→90으로 떨어져 node2(100)보다 낮아지고, VIP가 자동으로 node2로 넘어갑니다. 서버는 살아 있어도 서비스가 죽으면 페일오버되는 것이 핵심입니다.


알림과 상태 전환 훅

전환 시점에 알림을 받거나 후처리를 하려면 notify 스크립트를 걸 수 있습니다.

Config
vrrp_instance VI_1 {
    # ...
    notify_master "/etc/keepalived/to_master.sh"
    notify_backup "/etc/keepalived/to_backup.sh"
    notify_fault  "/etc/keepalived/to_fault.sh"
}

split-brain과 주의사항

  • virtual_router_id 충돌: 같은 L2 네트워크에 다른 keepalived 그룹이 같은 VRID를 쓰면 서로를 오인합니다. 세그먼트 내에서 유일한 값을 쓰세요.
  • 방화벽에서 VRRP 허용: VRRP는 IP 프로토콜 112와 멀티캐스트(224.0.0.18)를 씁니다. 광고가 막히면 양쪽 다 MASTER가 되는 split-brain(VIP 중복)이 발생합니다.
Bash
# 예: firewalld에서 VRRP 멀티캐스트 허용
sudo firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept'
sudo firewall-cmd --reload
  • 클라우드 환경: AWS/GCP는 멀티캐스트를 막고 IP 이동을 자체 제어하므로, keepalived VRRP가 그대로 동작하지 않습니다. 클라우드에서는 ENI/보조 IP 재할당(unicast peer 설정) 또는 매니지드 로드밸런서를 쓰세요. unicast_src_ip / unicast_peer 설정으로 유니캐스트 VRRP를 구성할 수 있습니다.

keepalived는 HAProxy·Nginx 앞단의 VIP를 무중단으로 유지시켜 주는 가장 가벼운 HA 수단입니다. "VRID·auth·VIP는 양 노드 동일, state·priority만 다르게, 서비스 감시는 vrrp_script"라는 세 원칙만 지키면 안정적인 2노드 페일오버를 어렵지 않게 구성할 수 있습니다.

#keepalived#vrrp#고가용성#ha#가상ip
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.