Skip to content
신선한 자몽 농장
Go back

Keepalived VRRP를 사용한 소프트웨어 HA 환경 구성

장비 가격이 너무나도 비싸다

AI로 인한 메모리 수요와 러시아-우크라이나 전쟁, 그리고 최근 중동 전쟁과 여러 가지 복합적인 이유로 L4 스위치 장비의 가격이 천정부지로 상승했다.

이런 상태에서 이중화 구성을 위해 L4 장비를 구입하자니 큰 부담이 있었고, 과거 CentOS를 사용하던 시절 테스트만 해보고 실제 운영에는 적용하지 않았던 Keepalived VRRP를 활용하여 소프트웨어 기반 이중화 구성을 진행하기로 했다.


기획 단계

필요한 기능

HA 구성을 위해 필요한 기능이 무엇일까 생각해봤다.

가장 중요한 건 역시 복수의 장비를 하나의 가상 IP(VIP)로 묶어서 운영하는 것이다.

기본적으로 Active 서버에서 서비스를 제공하다가, 장애가 발생하면 자동으로 Standby 서버로 전환되어야 한다.

그리고 Standby 서버는 어디까지나 무중단 서비스를 위한 예비책이므로, Active 서버가 복구되면 자동으로 다시 Active로 복귀(Failback)되는 기능도 필요하다.

장애 감지 기준

Rocky Linux 환경에서 구동되는 서비스의 장애를 판단하기 위해 다음 3가지 기준을 책정했다.

1. 서비스 프로세스

2. 서비스 포트

3. 물리적인 장애


Keepalived VRRP란?

본격적인 구축에 앞서 Keepalived가 무엇인지 간단히 알아보자.

VRRP 프로토콜

VRRP(Virtual Router Redundancy Protocol)는 여러 대의 서버를 하나의 가상 IP로 묶어주는 프로토콜이다.

쉽게 말하면 “이 IP 주소는 누가 관리할 거야?”를 서버들끼리 협의해서 정하는 규칙이다.

Keepalived의 역할

Keepalived는 이 VRRP 프로토콜을 리눅스에서 구현한 소프트웨어다.

주요 기능은 다음과 같다:


시스템 구성

이번에 구축한 시스템의 전체 구성은 다음과 같다.

                 사용자 / 관리자
                         |
                         |
                  가상 IP (VIP)
                   192.168.0.100
                         |
            +---------------------------+
            |                           |
         Active 서버               Standby 서버
      Rocky Linux 9              Rocky Linux 9
      192.168.0.10               192.168.0.20
       keepalived                 keepalived
       (VIP 보유)                (BACKUP 상태)
            |                           |
       +---------+                 +---------+
       | Nginx   |                 | Nginx   |
       | MariaDB |                 | MariaDB |
       +---------+                 +---------+
            |                           |
       +----------+  <-- Replication --> +----------+
       | Database |                      | Database |
       +----------+                      +----------+

핵심 포인트

  1. VIP를 통한 접근: 사용자는 VIP(192.168.0.100)로만 접근한다.
  2. Active 서버가 VIP 보유: 평상시에는 Active 서버가 VIP를 가지고 서비스를 제공한다.
  3. 자동 Failover: Active 서버 장애 시 Standby가 자동으로 VIP를 인계받는다.
  4. 데이터 동기화: 데이터베이스는 양방향 Replication으로 동기화된다.
  5. VRRP 유니캐스트: 두 서버는 유니캐스트 방식으로 상태를 주고받는다.

설치 과정

이번에 만든 자동화 스크립트를 활용하면 복잡한 설정 과정을 쉽게 진행할 수 있다.

GitHub: linux-ez-kit/keepalive-guardian

1. 사전 준비

방화벽 VRRP 허용

Keepalived는 일반적인 TCP/UDP 포트가 아닌 **IP Protocol 112 (VRRP)**를 사용한다.

사실 별도로 설정하지 않아도 install.sh 실행 시 반영하도록 해두긴 했으나 혹시 모르니 대비 차원에서 설명한다.

# 양쪽 서버 모두 실행
sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
sudo firewall-cmd --reload

# 적용 확인
firewall-cmd --list-rich-rules | grep vrrp

2. 헬스 체크 설정

conf/service_check.conf 파일을 환경에 맞게 수정한다.

이 또한 install.sh 실행 시 내용을 제공해 편집할 수 있도록 제공해뒀다.

미리 서비스 설정을 반영하고 싶다면 아래 과정을 진행하고 설치 과정에서 변경 가능하다.

# 체크할 프로세스 목록 (프로세스명 또는 명령어 일부)
PROCESS_LIST=(nginx mysqld)

# 체크할 포트 목록
PORT_LIST=(80 443 3306)

# Failback 안정화 시간 (초, 권장 60초 이상)
FAILBACK_DELAY=300

FAILBACK_DELAY는 서비스가 복구된 후 바로 Active로 복귀하지 않고, 일정 시간 동안 안정성을 확인하는 시간이다.

3. 설치 실행

대화형 설치 (추천)

실행하면서 설정을 입력하는 방식이다.

sudo ./install.sh

설치 과정에서 다음 정보를 입력하게 된다:

비대화형 설치

conf/install.conf 파일을 미리 작성하고 실행하는 방식이다.

# Active 서버용 설정 예시
ROLE=active
VIP=192.168.0.100
PEER_IP=192.168.0.20        # Standby 서버 IP
AUTH_PASSWORD=KAGrd251       # 양쪽 동일하게 설정
VRRP_INTERFACE=ens18         # 네트워크 인터페이스

# 실행
sudo ./install.sh --config conf/install.conf --yes

4. 자동 수행 작업

설치 스크립트는 다음 작업을 자동으로 처리한다:

  1. keepalived 패키지 설치 (오프라인 RPM 포함)
  2. 사전 조건 확인 (Root 권한, OS 버전)
  3. 기존 설정 파일 백업 (/backup/keepalive-guardian/)
  4. keepalived.conf 자동 생성
  5. 헬스 체크 스크립트 배포
  6. 방화벽 VRRP 규칙 추가
  7. 로그 로테이션 설정
  8. keepalived 서비스 시작 및 자동 시작 등록

동작 방식

Failover (장애 전환)

Active 서버에 장애가 발생하면 어떻게 동작할까?

1. Active 서버에서 헬스 체크 실패
   (nginx 프로세스 종료 또는 포트 응답 없음)

2. Keepalived priority 하락 (100 → 80)
   (weight 값만큼 감소)

3. Standby의 priority(90) > Active의 priority(80)

4. Standby 서버가 MASTER로 승격

5. VIP가 Standby 서버로 이동

6. 사용자 트래픽 자동 전환

전환 감지 시간

Failback (복구 후 원복)

Active 서버가 복구되면 즉시 VIP를 되찾을까?

아니다. 안정화 시간을 거친 후 복귀한다.

1. Active 서버 서비스 복구

2. 헬스 체크 연속 성공

3. 안정화 타이머 시작 (기본 300초)
   "복구되었지만 안정적인지 확인 중..."

4. 안정화 시간 동안 연속 정상 유지

5. Keepalived priority 원복 (80 → 100)

6. VIP가 Active 서버로 복귀

이렇게 안정화 시간을 두는 이유는 서비스가 잠깐 복구되었다가 다시 장애가 발생하는 상황을 방지하기 위함이다.


실제 테스트

설치가 완료되면 실제로 동작하는지 테스트해보자.

1. 초기 상태 확인

# VIP 할당 확인 (Active 서버에서)
ip addr show | grep 192.168.0.100

# Keepalived 상태 확인
sudo systemctl status keepalived

# 로그 확인
tail -f /var/log/service_ha_check.log

2. 서비스 장애 시뮬레이션

Active 서버에서 의도적으로 서비스를 중지해본다.

# Nginx 중지
sudo systemctl stop nginx

# 약 10초 후 VIP 이동 확인
watch -n 1 "ip addr show | grep 192.168.0.100"

# Standby 서버에서 VIP 확인
ip addr show | grep 192.168.0.100  # VIP가 이동되어 있어야 함

3. Failback 테스트

# Active 서버에서 서비스 재시작
sudo systemctl start nginx

# 로그에서 안정화 진행 상황 확인
tail -f /var/log/service_ha_check.log
# "Failback stabilization in progress: 60/300s" 같은 메시지 출력

# 5분 후 VIP 복귀 확인
ip addr show | grep 192.168.0.100

4. 네트워크 장애 시뮬레이션

# Active 서버에서 네트워크 인터페이스 다운
sudo ip link set ens18 down

# 약 3초 후 즉시 Failover 발생
# (VRRP 신호 중단 감지가 헬스 체크보다 빠름)

Split-Brain 주의사항

HA 구성에서 가장 주의해야 할 상황이 바로 Split-Brain이다.

Split-Brain이란?

두 서버가 서로 간의 통신은 단절되었지만 외부 네트워크는 각각 정상인 경우, 두 서버가 모두 MASTER로 동작하며 VIP가 충돌하는 상황이다.

정상 상태:
  Active ◀──── VRRP 신호 ────▶ Standby
     ↓                              ↓
  VIP 보유                    BACKUP 대기

Split-Brain 발생:
  Active ✕──── 통신 단절 ────✕ Standby
     ↓                              ↓
  VIP 보유 (충돌!)            VIP 보유 (충돌!)

발생 가능한 상황

예방 방법

가장 현실적인 예방책은 Heartbeat 전용 링크를 구성하는 것이다.

두 서버에 NIC를 추가로 장착하고, 다이렉트 케이블로 직결한다.

[Active 서버 ens18]──── 서비스 트래픽 ────[Standby 서버 ens18]
        ↓                                          ↓
      VIP 보유                               BACKUP 대기

[Active 서버 ens19]──── VRRP 신호 (직결) ──[Standby 서버 ens19]

설치 스크립트에서 Heartbeat 인터페이스를 설정할 수 있다.

# install.conf에 추가
HEARTBEAT_INTERFACE=ens19
PEER_HB_IP=10.0.0.2

이렇게 하면 서비스 스위치에 장애가 발생해도 VRRP 신호는 직결 케이블로 유지되어 Split-Brain을 방지할 수 있다.


설치 후 관리

설정 변경

설치 후 설정을 변경해야 할 때는 다음과 같이 진행한다.

변경 항목수정 파일적용 방법
감시 포트/프로세스/etc/keepalived/service_check.confsystemctl restart keepalived
Failback 대기 시간/etc/keepalived/service_check.confsystemctl restart keepalived
VIP / 서버 IP/etc/keepalived/keepalived.conf양쪽 동시 수정 후 재시작

※ VIP나 VRRP 패스워드 변경 시에는 반드시 양쪽 서버를 동시에 중지한 후 수정하고 재시작해야 한다.

로그 확인

# HA 이벤트 로그
tail -f /var/log/service_ha_check.log

# Failover/Failback 이벤트만 확인
grep -E "MASTER|RECOVERY|FAIL" /var/log/service_ha_check.log

# Keepalived 서비스 로그
sudo journalctl -u keepalived -f

마무리

L4 장비 없이도 Keepalived를 활용하면 충분히 안정적인 HA 환경을 구축할 수 있다.

이번 프로젝트를 통해 자동화 스크립트를 만들어두었으니, 앞으로 다른 서비스에도 쉽게 적용할 수 있게 되었다.

특히 다음과 같은 장점이 있었다:

다만 Split-Brain 문제는 여전히 주의해야 하며, 운영 환경에서는 Heartbeat 전용 링크 구성을 권장한다.

이후에는 실제 운영 환경에서의 경험을 바탕으로 추가적인 개선 사항을 정리해볼 계획이다.


※ 프로젝트 소스코드: GitHub - linux-ez-kit/keepalive-guardian



Previous Post
[Game] 마인크래프트 서버 내 아이템 사용 제한하기
Next Post
Github CI/CD 구성