Keepalived 소개와 설치 가이드

Keepalived와 VRRP 기반 VIP 고가용성 구성 가이드입니다. 설치, check script, MASTER/BACKUP 설정, VRRP packet 확인, failover 테스트와 split-brain 점검을 정리했습니다.

Keepalived는 VRRP를 이용해 여러 서버가 하나의 Virtual IP(VIP)를 공유하도록 만드는 고가용성 도구입니다. 보통 두 대 이상의 서버에 같은 VIP를 구성하고, active 서버가 장애나 서비스 실패 상태가 되면 standby 서버가 VIP를 넘겨받게 합니다.

설치

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

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

설치 후 바로 시작하기 전에 네트워크 인터페이스 이름과 VIP 대역을 확인합니다.

ip -br addr
ip route

헬스체크 스크립트

VIP를 가진 서버의 웹 서비스가 죽으면 VIP를 내려야 하므로, 먼저 서비스 확인 스크립트를 만듭니다.

sudo tee /etc/keepalived/check_nginx.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

systemctl is-active --quiet nginx
curl -fsS --max-time 2 http://127.0.0.1/ >/dev/null
EOF

sudo chmod 755 /etc/keepalived/check_nginx.sh

track_script는 스크립트 종료 코드가 0인지 아닌지로 상태를 판단합니다. 단순히 프로세스만 확인하지 말고 실제 로컬 응답까지 확인하는 편이 안전합니다.

active 서버 설정 예시

/etc/keepalived/keepalived.conf 예시입니다. 인터페이스와 VIP는 환경에 맞게 바꿔야 합니다.

global_defs {
 router_id web-ha-01
}

vrrp_script chk_nginx {
 script "/etc/keepalived/check_nginx.sh"
 interval 2
 timeout 2
 fall 2
 rise 2
 weight -30
}

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

 authentication {
 auth_type PASS
 auth_pass CHANGE_ME
 }

 virtual_ipaddress {
 192.168.0.100/24 dev eth0
 }

 track_script {
 chk_nginx
 }
}

standby 서버 설정 차이

standby 서버는 같은 virtual_router_id와 VIP를 쓰되 statepriority를 낮춥니다.

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

 authentication {
 auth_type PASS
 auth_pass CHANGE_ME
 }

 virtual_ipaddress {
 192.168.0.100/24 dev eth0
 }

 track_script {
 chk_nginx
 }
}

auth_pass는 예시값을 그대로 쓰면 안 됩니다. 같은 VRRP 그룹 안에서는 맞춰야 하지만, 문서나 저장소에 실제 운영값을 노출하지 않습니다.

시작과 검증

sudo keepalived -t -f /etc/keepalived/keepalived.conf
sudo systemctl enable --now keepalived
sudo systemctl status keepalived --no-pager
ip addr show dev eth0 | grep 192.168.0.100
journalctl -u keepalived -n 100 --no-pager

VRRP는 IP protocol 112를 사용합니다. 방화벽이나 보안 장비가 VRRP를 막으면 양쪽 서버가 모두 MASTER처럼 동작하는 split-brain이 날 수 있습니다.

sudo tcpdump -ni eth0 proto 112

장애 전환 테스트

운영 반영 전에는 반드시 서비스 장애와 노드 장애를 나눠 테스트합니다.

# active 서버에서 nginx만 중지
sudo systemctl stop nginx
journalctl -u keepalived -f

# VIP가 standby로 넘어갔는지 확인
ip addr show dev eth0 | grep 192.168.0.100
curl -I http://192.168.0.100/

테스트 후 원복합니다.

sudo systemctl start nginx
sudo systemctl restart keepalived

자주 보는 문제

  • VIP가 안 붙음: 인터페이스 이름, VIP 대역, keepalived 설정 문법을 확인합니다.
  • 두 서버 모두 MASTER: VRRP 패킷 차단, virtual_router_id 불일치, L2 네트워크 분리를 의심합니다.
  • 서비스가 죽었는데 전환 안 됨: track_script exit code, weight, priority 차이를 확인합니다.
  • 전환은 됐는데 접속 안 됨: ARP cache, 방화벽, backend 서비스 상태를 봅니다.

문서 링크

BGM EVER