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를 쓰되 state와 priority를 낮춥니다.
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 서비스 상태를 봅니다.