Keepalived
Keepalived는 리눅스 서버를 위한 고가용성(High Availability) 솔루션입니다.
이름 그대로 '살아있음을 유지한다'는 뜻이죠.
여기서 아주 중요한 개념이 등장하는데, 바로 가상 IP(Virtual IP) 입니다.
사실 네트워크에서의 게이트웨이 이중화를 구성해본 적이 있는 네트워크 엔지니어분들이라면 익숙한 개념일 것입니다.
- 실제 IP(Real IP): 각 서버가 물리적으로 가지고 있는 고유한 IP 주소입니다.
- 가상 IP(Virtual IP): 여러 서버가 공유하는 '대표' IP 주소입니다. 사용자들은 이 가상 IP로만 서비스를 요청합니다.
Keepalived는 이 가상 IP를 마치 'VIP'처럼 다룹니다.
평소에는 건강한 서버(Master)가 이 VIP를 가지고 서비스를 제공하다가,
해당 서버에 문제가 생기면 즉시 대기하던 다른 서버(Backup)가 VIP를 넘겨받아 서비스를 이어가는 방식이죠!
Keepalived의 동작 원리
Keepalived의 페일오버(Failover)는 어떻게 가능한걸까요?
바로 VRRP(Virtual Redundancy Protocol) 라는 프로토콜 덕분입니다.
그럼 Keepalived의 동작원리를 알아볼까요?
팀 결성 (Master & Backup)
먼저, 동일한 서비스를 제공하는 서버들을 하나의 팀으로 묶습니다.
그리고 그 안에서 우선순위(priority)에 따라 '대장(Master)'과 '부하(Backup)' 역할을 나눕니다.
생존 신호 전송
대장 서버는 "나 아직 살아있어!"라는 신호(VRRP 광고)를 팀원들에게 주기적으로 보냅니다.
대장의 위기 감지
부하 서버들은 이 신호가 오는지 계속 귀를 기울입니다. 만약 약속된 시간 동안 신호가 오지 않으면, "대장에게 무슨 일이 생겼구나!"라고 판단합니다.
새로운 대장의 등장
부하들 중에서 가장 우선순위가 높은 서버가 "이제부터 내가 대장이다!"라고 선언하며 쓰러진 대장이 가지고 있던 **가상 IP(VIP)**를 넘겨받습니다.
그리고 네트워크에 "이제부터 이 IP는 내 거야!"라고 외쳐서 모든 트래픽이 자신에게 오도록 만듭니다.
이해가 되셨나요? 위 흐름을 요약해볼게요.
- VRRP 그룹으로 묶인 서버들이 같은 VRID를 사용합니다.
- 마스터는 일정 주기(기본 1초)에
VRRP Advertisement
패킷을 멀티캐스트로 보냅니다. - 백업 노드는 이 패킷을 듣고 "마스터가 살아있네"라고 판단합니다.
- 일정 시간 동안(기본 3초) 이 패킷을 못 받으면, 백업 노드가 마스터로 승격됩니다.
장애 감지가 어떻게 이루어지는거죠?
위에서 마스터가 일정 주기마다 VRRP Advertisement
를 보낸다고 했었죠?
이 패킷은 IP 프로토콜 번호 112
번을 사용하고, 멀티캐스트 주소(224.0.0.18
)로 전송됩니다.
동일한 네트워크 대역(또는 VLAN)에 소속되어 있다면,
Master가 보낸 멀티캐스트 패킷을 Backup 서버에서 주기적으로 받으며 마스터 서버가 살아있다는 것을 인지한답니다!
또한, 장애 감지에 대한 조건을 /etc/keepalived/keepalived.conf
에서 설정할 수 있어요.
예를 들어 nginx
서비스가 죽으면 마스터에서 내려오도록 구성할 수 있어요.
vrrp_script chk_nginx {
script "/usr/bin/pgrep nginx"
interval 2
weight -10
}
이렇게 하면 nginx가 죽었을 때 weight
가 낮아지며 우선순위(priority
)가 떨어지고, 백업 노드가 승격될 수 있는거죠.
Keepalived 실습해보기
이제 Keepalived의 진가를 알아보기 위해 직접 실습을 해볼거에요!
먼저, 두 대의 웹 서버(하나는 Master, 다른 하나는 Backup)를 준비하고, 외부 사용자는 가상 IP(VIP)를 통해 웹 서버에 접속할겁니다.
평상시에는 Master 서버가 VIP를 소유하고 모든 요청을 처리합니다.
만약 Master 서버에 장애가 발생하면(예: 웹 서버 데몬 중지, 시스템 다운 등), Keepalived가 이를 감지하여 Backup 서버로 VIP를 이전할겁니다.
이로써 Backup 서버가 Master 역할을 이어받아 중단 없이 웹 서비스를 제공하게 되겠죠?
구성도
Pnetlab
시뮬레이터를 활용하여 간단한 구성도를 작성하여 실습해볼겁니다.
사전 준비
- 서버 2대: Master, Backup 역할을 수행할 리눅스 서버 2대
- 웹 서버 소프트웨어: Nginx (각 서버에 동일하게 설치)
- 가상 IP (VIP): 외부에서 접속할 공용 IP 주소 (예: 192.168.0.100)
- 서버별 실제 IP
- Master: 192.168.0.101
- Backup: 192.168.0.102
keepalived 설치 전에 Virtual IP 세팅을 위해 2가지 Kernel Parameter를 추가해줘야 합니다.
echo "net.ipv4.ip_nonlocal_bind" | sudo tee -a /etc/sysctp.conf
echo "net.ipv4.forward" | sudo tee -a /etc/sysctp.conf
sudo sysctl -p # 추가한 커널 파라메터 적용
net.ipv4.ip_nonlocal_bind
: Localhost 주소 외에 Virtual IP를 bind 할 수 있는 parameternet.ipv4.forward
: IP를 포워딩할 수 있게 하는 parameter
패키지 설치 및 테스트 페이지 생성
Master와 Backup 서버 양쪽에 모두 nginx를 설치하고, 각 서버를 구분할 수 있도록 간단한 테스트 페이지를 만들어줄게요.
nginx 설치 (두 서버 모두 실행)
sudo apt-get update
sudo apt-get install -y nginx
테스트 페이지 생성
master (192.168.0.101
)
echo "<h1>This is the Master Server (192.168.0.101)</h1>" | sudo tee /var/www/html/index.html
backup (192.168.0.102
)
echo "<h1>This is the Backup Server (192.168.0.102)</h1>" | sudo tee /var/www/html/index.html
Keepalived 설치
Master와 Backup 서버 양쪽에 Keepalived를 설치하겠습니다.
sudo apt-get install -y keepalived
Keepalived 설정
Keepalived의 핵심 설정 파일인 /etc/keepalived/keepalived.conf
를 각 서버의 역할에 맞게 수정해줄게요.
Master (192.168.0.101
)
/etc/keepalived/keepalived.conf
파일을 열어 아래 내용으로 수정해주세요.
# 설정 파일 예시: MASTER 서버 (/etc/keepalived/keepalived.conf)
# 전역 설정 블록
global_defs {
# 라우터 ID: 각 서버를 식별하는 고유한 이름. 다른 서버와 겹치지 않게 설정합니다.
router_id LVS_DEVEL
}
# Health Check를 위한 스크립트 정의
# Nginx 프로세스가 살아있는지 확인하는 스크립트
vrrp_script chk_nginx {
script "/usr/bin/pgrep nginx" # 이 명령어가 성공(exit code 0)하면 정상
interval 2 # 2초마다 스크립트 실행
weight -20 # 스크립트 실패 시 priority를 20만큼 낮춤
fall 2 # 2번 연속 실패 시 장애로 간주
rise 2 # 2번 연속 성공 시 정상으로 간주
}
# VRRP 인스턴스(가상 라우터) 정의
vrrp_instance VI_1 {
# 1. 역할 및 인터페이스 설정
state MASTER # 이 서버의 초기 상태를 MASTER로 지정합니다.
interface ens33 # VRRP 패킷을 주고받을 네트워크 인터페이스 (ip a 명령어로 확인)
virtual_router_id 51 # 가상 라우터 ID. MASTER와 BACKUP이 반드시 동일해야 함.
# 2. 우선순위 설정 (중요!)
priority 101 # 우선순위. 숫자가 높을수록 MASTER가 될 확률이 높음. BACKUP보다 높게 설정.
# 3. VRRP 광고 주기
advert_int 1 # VRRP 패킷을 1초마다 전송 (살아있음을 알림)
# 4. 인증 설정
authentication {
auth_type PASS # 인증 방식 (PASS: 단순 비밀번호)
auth_pass 1111 # 인증 비밀번호. MASTER와 BACKUP이 반드시 동일해야 함.
}
# 5. 가상 IP(VIP) 설정
virtual_ipaddress {
192.168.0.100/24 # 외부 서비스에 사용할 가상 IP와 서브넷 마스크
}
# 6. Health Check 스크립트 추적
track_script {
chk_nginx # 위에서 정의한 vrrp_script(chk_nginx)를 추적
}
}
Backup (192.168.0.102
)
# 설정 파일 예시: BACKUP 서버 (/etc/keepalived/keepalived.conf)
global_defs {
router_id LVS_DEVEL_BACKUP # MASTER와 다른 고유 ID 사용
}
vrrp_script chk_nginx {
script "/usr/bin/pgrep nginx"
interval 2
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP # 초기 상태를 BACKUP으로 지정
interface ens33 # MASTER와 동일한 인터페이스
virtual_router_id 51 # MASTER와 반드시 동일
priority 100 # MASTER(101)보다 낮은 우선순위 설정 (매우 중요!)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 # MASTER와 반드시 동일
}
virtual_ipaddress {
192.168.0.100/24
}
track_script {
chk_nginx
}
}
설정한 주요 항목을 설명해볼게요.
항목 | 설명 |
---|---|
vrrp_script chk_nginx |
서비스(Nginx)의 상태를 확인하는 스크립트를 정의합니다. pidof nginx 명령어로 Nginx 프로세스 ID를 확인하여 실행 여부를 판단합니다. |
state |
서버의 초기 상태를 지정합니다. MASTER 또는 BACKUP으로 설정합니다. |
interface |
VRRP 패킷을 주고받을 네트워크 인터페이스 이름을 지정합니다. ip addr 명령어로 확인 후 정확하게 입력해야 합니다. |
virtual_router_id |
가상 라우터의 고유 ID입니다. Master와 Backup 서버가 동일한 값을 가져야 합니다. |
priority |
우선순위를 나타냅니다. 숫자가 높을수록 우선순위가 높으며, Master 서버의 priority 값을 Backup 서버보다 높게 설정해야 합니다. |
authentication |
Master와 Backup 서버 간의 인증 설정입니다. auth_type과 auth_pass를 동일하게 설정합니다. |
virtual_ipaddress |
외부 서비스에 사용될 가상 IP(VIP) 주소를 지정합니다. |
track_script |
vrrp_script에서 정의한 스크립트를 추적하여 스크립트가 실패하면 장애로 간주하고 Failover를 수행합니다. |
keepalived 서비스 재시작
설정이 완료되면 양쪽 서버에서 keepalived 서비스를 재시작하여 설정을 적용해줍시다.
sudo systemctl restart keepalived
IP 주소 확인
MASTER 서버에서 ip a
명령어를 실행하면, 설정한 interface(예: ens3
)에 가상 IP(192.168.0.100
)가 할당된 것을 볼 수 있습니다.
백업 서버에서는 ip a
실행 시 가상 IP가 보이지 않아야 정상입니다!
백업 서버에서는 마스터 서버에 장애가 발생해 백업 서버가 마스터로 승격한 이후에 VIP를 소유할 수 있게 됩니다.
로그 확인
마스터와 백업이 각각 잘 넘어갔는지 로그를 확인해봅시다.
sudo journalctl -xeu keepalived
- MASTER 서버 로그:
... becoming MASTER
와 같은 메시지가 보입니다. - BACKUP 서버 로그:
... becoming BACKUP
와 같은 메시지가 보입니다.
장애 테스트
모든 설정이 완료되었다면 이제 Failover(장애 극복)가 정상적으로 동작하는지 테스트해볼게요.
1. 초기 상태 확인
먼저 Master 서버에서 ip addr
명령어를 실행하여 VIP(192.168.0.100)가 ens33
(설정한 인터페이스)에 할당되었는지 확인합니다.
ip addr
그리고 클라이언트 PC의 웹 브라우저에서 http://192.168.0.100
으로 접속하여 This is the Master Server
페이지가 보이는지 확인해보세요.
2. Failover 테스트: Master 서버 장애 유발
이제 Master 서버의 nginx 서비스를 강제로 중지시켜 장애 상황을 만들어보겠습니다.
# Master 서버에서 실행하세요.
sudo systemctl stop nginx
3. Failover 테스트.
- VIP 이전 확인: Master 서버의 Nginx가 중지되면 Keepalived는 이를 감지하고 약 2~3초 내에 Backup 서버로 VIP를 이전합니다. Backup 서버에서 ip addr 명령어를 실행하여 VIP(192.168.0.100)가 할당되었는지 확인합니다.
- 서비스 연속성 확인: 클라이언트 PC의 웹 브라우저에서
http://192.168.0.100
페이지를 새로고침합니다. "This is the Backup Server" 페이지가 나타나면 성공적으로 Failover가 이루어진 것입니다.
4. Failback 테스트 (원상 복구)
장애가 해결된 Master 서버의 nginx 서비스를 다시 올려볼게요.
sudo systemctl start nginx
Master 서버의 Nginx가 정상적으로 실행되면,
priority
값에 따라 다시 Master 서버로 VIP가 이전됩니다.
웹 브라우저를 새로고침하면 "This is the Master Server" 페이지가 다시 표시되는 것을 확인할 수 있습니다.