본문으로 건너뛰기

LVS 서버에서 keepalived를 설치하고 구성하는 방법은 무엇인가요?

💡 요약 정리

  • LVS와 keepalived로 고가용성 로드 밸런서를 구성할 수 있습니다.
  • VRRP 프로토콜로 VIP를 관리하고 장애 시 자동 페일오버를 제공합니다.
  • IPVS를 통해 L4 레벨 로드 밸런싱을 수행합니다.
  • Direct Routing(DR) 방식으로 높은 성능을 제공합니다.
  • Real Server의 ARP 설정과 loopback VIP 등록이 필수적입니다.

설치환경

서버 구성

역할IP 주소설명
LVS (Director)192.168.0.101로드 밸런서 서버
VIP (Virtual IP)192.168.0.100외부에 노출되는 가상 IP
www1 (Real Server)192.168.0.102웹 서버 1
www2 (Real Server)192.168.0.103웹 서버 2
DB192.168.0.104데이터베이스 서버

개요

LVS (Linux Virtual Server)

Linux 커널 기반의 로드 밸런싱 솔루션으로, L4 레벨에서 트래픽을 분산합니다.

주요 특징:

  • 고성능: 커널 레벨에서 동작하여 빠른 처리 속도
  • 무료: 오픈소스 솔루션
  • 다양한 알고리즘: Round Robin, Least Connection, Weighted 등
  • 세 가지 방식: NAT, DR(Direct Routing), TUN(Tunneling)

keepalived

VRRP 프로토콜을 이용한 고가용성 솔루션으로, LVS를 관리합니다.

주요 기능:

  • VIP 관리: VRRP로 Virtual IP 페일오버
  • 헬스체크: Real Server 상태 모니터링
  • 자동 페일오버: 장애 발생 시 자동 전환

Direct Routing (DR) 방식

본 가이드에서 사용하는 로드 밸런싱 방식:

[Client]
    ↓ (Request to VIP)
[LVS Director]
    ↓ (MAC address forwarding)
[Real Server]
    ↓ (Direct response to Client)
[Client]

장점:

  • 응답 트래픽이 LVS를 거치지 않아 고성능
  • Real Server가 직접 응답하여 확장성 우수

요구사항:

  • LVS와 Real Server가 같은 네트워크에 존재
  • Real Server에 VIP를 loopback으로 설정

1. LVS Director 설정

1.1 IP 포워딩 활성화

# /etc/sysctl.conf 편집
vi /etc/sysctl.conf

# IP 포워딩 활성화
net.ipv4.ip_forward = 1

# 설정 적용
sysctl -p

확인:

cat /proc/sys/net/ipv4/ip_forward
# 출력: 1

1.2 ipvsadm 설치

IPVS 관리 도구인 ipvsadm을 설치합니다.

yum install -y ipvsadm

설치 확인:

ipvsadm --version
# 출력: ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)

1.3 keepalived 소스 다운로드 및 컴파일

압축 해제:

[root@localhost ~]# tar xvzfp keepalived-1.2.1.tar.gz
[root@localhost ~]# cd keepalived-1.2.1

컴파일 설정:

[root@localhost keepalived-1.2.1]# ./configure \
  --with-kernel-dir=/usr/src/kernels/2.6.18-164.11.1.el5-x86_64

Keepalived configuration
------------------------
Keepalived version       : 1.2.1
Compiler                 : gcc
Compiler flags           : -g -O2 -DETHERTYPE_IPV6=0x86dd
Extra Lib                : -lpopt -lssl -lcrypto
Use IPVS Framework       : Yes
IPVS sync daemon support : Yes
Use VRRP Framework       : Yes
Use Debug flags          : No

중요:

  • Use IPVS Framework : Yes 확인 필수
  • Use VRRP Framework : Yes 확인 필수

컴파일 및 설치:

[root@localhost keepalived-1.2.1]# make

Building ../bin/genhash
strip ../bin/genhash

Make complete
make[1]: Leaving directory `/root/src/keepalived-1.2.1/genhash'

Make complete

[root@localhost keepalived-1.2.1]# make install

make[1]: Leaving directory `/root/src/keepalived-1.2.1/keepalived'
make -C genhash install
make[1]: Entering directory `/root/src/keepalived-1.2.1/genhash'
install -d /usr/local/bin
install -m 755 ../bin/genhash /usr/local/bin/
install -d /usr/local/share/man/man1
install -m 644 ../doc/man/man1/genhash.1 /usr/local/share/man/man1
make[1]: Leaving directory `/root/src/keepalived-1.2.1/genhash'

1.4 심볼릭 링크 설정

표준 경로에서 keepalived 설정 및 실행 파일에 접근할 수 있도록 심볼릭 링크를 생성합니다.

# 설정 디렉토리 링크
ln -s /usr/local/etc/keepalived /etc/keepalived

# init 스크립트 링크
ln -s /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived

# sysconfig 파일 링크
ln -s /usr/local/etc/sysconfig/keepalived /etc/sysconfig/keepalived

1.5 keepalived.conf 설정

/etc/keepalived/keepalived.conf 생성:

vi /etc/keepalived/keepalived.conf

설정 내용:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.0.101
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    garp_master_delay 5
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.100
    }
}

virtual_server 192.168.0.100 80 {
    delay_loop 6
    lb_algo lc
    lb_kind DR
!   persistence_timeout 50
    protocol TCP

!   sorry_server 192.168.0.101 1358

    real_server 192.168.0.102 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              digest 8b97db165eaf8d8d3a549418aee46738
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.0.103 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              digest 78d20f502a13c1b23c2fbc91614cbba3
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

설정 설명:

섹션항목설명
global_defsnotification_email장애 알림 받을 이메일
smtp_serverSMTP 서버 주소
router_id라우터 식별자
vrrp_instancestateMASTER 또는 BACKUP
interfaceVIP를 바인딩할 인터페이스
virtual_router_idVRRP 그룹 ID (1-255)
priority우선순위 (높을수록 우선)
virtual_ipaddressVIP 주소
virtual_serverlb_algo로드 밸런싱 알고리즘 (rr, wrr, lc, wlc 등)
lb_kind로드 밸런싱 방식 (NAT, DR, TUN)
protocol프로토콜 (TCP, UDP)
real_server실제 서버 주소 및 포트
weight서버 가중치
digest헬스체크용 MD5 해시

1.6 Real Server의 digest 값 확인

keepalived는 HTTP_GET으로 헬스체크를 수행하며, 응답 내용의 MD5 해시를 비교합니다.

# www1 서버 digest 확인
[root@localhost ~]# genhash -s 192.168.0.102 -p 80 --url /
MD5SUM = 8b97db165eaf8d8d3a549418aee46738

# www2 서버 digest 확인
[root@localhost ~]# genhash -s 192.168.0.103 -p 80 --url /
MD5SUM = 78d20f502a13c1b23c2fbc91614cbba3

참고:

  • Real Server의 웹 페이지 내용이 다르면 digest 값도 다릅니다.
  • 동일한 페이지를 제공하려면 digest 값도 동일해야 합니다.
  • 또는 각 서버의 고유 digest를 설정에 반영합니다.

1.7 keepalived 데몬 실행

[root@localhost ~]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]

# 부팅 시 자동 시작 설정
chkconfig keepalived on

1.8 오류 해결: "command not found"

오류 발생:

[root@localhost ~]# /etc/init.d/keepalived start
Starting keepalived: /bin/bash: keepalived: command not found
                                                           [FAILED]

해결 방법 1: PATH 환경변수 추가

vi /etc/rc.d/init.d/keepalived

# 파일 상단에 추가
PATH=/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/sbin

해결 방법 2: 절대 경로 사용

vi /etc/rc.d/init.d/keepalived

# daemon keepalived 부분을 아래와 같이 수정
daemon /usr/local/sbin/keepalived

1.9 VIP 및 로드 밸런싱 상태 확인

VIP 확인:

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:30:48:fb:d1:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.101/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.100/32 scope global eth0    # ← VIP가 바인딩됨
    inet6 fe80::230:48ff:fefb:d14e/64 scope link
       valid_lft forever preferred_lft forever

IPVS 상태 확인:

[root@localhost ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:http lc
  -> 192.168.0.102:http          Route   1      0          0
  -> 192.168.0.103:http          Route   1      0          0

출력 설명:

  • Scheduler: lc (Least Connection 알고리즘)
  • Forward: Route (Direct Routing 방식)
  • Weight: 가중치 (1)
  • ActiveConn: 현재 활성 연결 수
  • InActConn: 비활성 연결 수

2. Real Server 설정

2.1 ARP 파라미터 변경

중요: 이 설정이 없으면 하나의 Real Server가 VIP를 점유하여 로드 밸런싱이 작동하지 않습니다.

각 Real Server (www1, www2)에서 실행:

# /etc/sysctl.conf 편집
vi /etc/sysctl.conf

# ARP 파라미터 추가
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2

# 설정 적용
sysctl -p

파라미터 설명:

파라미터설명
arp_ignore1해당 인터페이스의 IP로 온 ARP 요청만 응답
arp_announce2가장 적합한 로컬 IP로만 ARP 응답

목적:

  • Real Server가 VIP에 대한 ARP 요청에 응답하지 않도록 설정
  • LVS Director만 VIP의 MAC 주소를 제공

2.2 Loopback에 VIP 등록

방법 1: 명령어로 직접 등록 (재부팅 시 사라짐)

ifconfig lo:0 192.168.0.100 netmask 255.255.255.255 broadcast 192.168.0.100 up

방법 2: 설정 파일로 영구 등록 (권장)

# ifcfg-lo:0 파일 생성
vi /etc/sysconfig/network-scripts/ifcfg-lo:0

# 내용 입력
DEVICE=lo:0
IPADDR=192.168.0.100
NETMASK=255.255.255.255
BROADCAST=192.168.0.100
ONBOOT=yes
NAME=loopback

# 네트워크 재시작
service network restart

확인:

ip addr show lo

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet 192.168.0.100/32 brd 192.168.0.100 scope global lo:0
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

목적:

  • Real Server가 VIP로 온 패킷을 자신의 것으로 인식
  • Direct Routing 방식에서 필수 설정

3. 로드 밸런싱 테스트

3.1 웹 접속 테스트

여러 클라이언트에서 VIP로 웹 접속을 시도합니다.

# 여러 번 접속 시도
for i in {1..10}; do
  curl http://192.168.0.100
done

3.2 연결 분산 확인

LVS Director에서 연결 상태를 확인합니다.

[root@localhost ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:http lc
  -> 192.168.0.102:http          Route   1      3          0
  -> 192.168.0.103:http          Route   1      2          0

결과 분석:

  • 192.168.0.102: 3개의 활성 연결
  • 192.168.0.103: 2개의 활성 연결
  • Least Connection 알고리즘에 따라 연결 수가 적은 서버로 새 연결 할당

3.3 실시간 모니터링

# 1초마다 IPVS 상태 갱신
watch -n 1 ipvsadm -l

# 상세 통계 확인
ipvsadm -Ln --stats

# 연결 정보 확인
ipvsadm -Ln --connection

4. 로드 밸런싱 알고리즘

주요 알고리즘

알고리즘약어설명적합한 환경
Round Robinrr순차적으로 분배서버 성능이 동일한 경우
Weighted Round Robinwrr가중치 기반 순차 분배서버 성능이 다른 경우
Least Connectionlc연결 수가 가장 적은 서버로 분배세션 길이가 다른 경우
Weighted Least Connectionwlc가중치 기반 최소 연결서버 성능 + 연결 수 고려
Shortest Expected Delaysed응답 시간 예측 기반 분배응답 시간 최적화
Never Queuenq유휴 서버 우선 분배짧은 작업 처리

알고리즘 변경

# keepalived.conf에서 lb_algo 변경
vi /etc/keepalived/keepalived.conf

virtual_server 192.168.0.100 80 {
    delay_loop 6
    lb_algo wrr    # Round Robin → Weighted Round Robin으로 변경
    lb_kind DR
    ...
}

# keepalived 재시작
service keepalived restart

5. 고급 설정

5.1 세션 지속성 (Session Persistence)

동일 클라이언트를 같은 서버로 연결:

virtual_server 192.168.0.100 80 {
    delay_loop 6
    lb_algo lc
    lb_kind DR
    persistence_timeout 300    # 5분 동안 세션 유지
    protocol TCP
    ...
}

5.2 Sorry Server 설정

모든 Real Server 장애 시 표시할 서버:

virtual_server 192.168.0.100 80 {
    delay_loop 6
    lb_algo lc
    lb_kind DR
    protocol TCP

    sorry_server 192.168.0.101 8080    # LVS 자체를 Sorry Server로

    real_server 192.168.0.102 80 {
        ...
    }
}

5.3 가중치 조정

서버 성능에 따라 가중치 설정:

    real_server 192.168.0.102 80 {
        weight 3    # 고성능 서버
        ...
    }

    real_server 192.168.0.103 80 {
        weight 1    # 저성능 서버
        ...
    }

5.4 헬스체크 방법

TCP 체크:

    real_server 192.168.0.102 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

HTTP 체크 (현재 설정):

    real_server 192.168.0.102 80 {
        weight 1
        HTTP_GET {
            url {
              path /health.html
              digest 8b97db165eaf8d8d3a549418aee46738
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

SSL 체크:

    real_server 192.168.0.102 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest 8b97db165eaf8d8d3a549418aee46738
            }
            connect_timeout 3
        }
    }

6. 문제 해결

로드 밸런싱이 작동하지 않음

증상:

  • 모든 연결이 하나의 Real Server로만 집중

원인:

  • Real Server의 ARP 설정 누락

해결:

# Real Server에서 확인
sysctl -a | grep arp_ignore
sysctl -a | grep arp_announce

# 값이 0이면 설정 적용 안 된 것
vi /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2

sysctl -p

VIP가 바인딩되지 않음

증상:

  • ip addr에 VIP가 표시되지 않음

원인:

  • keepalived 데몬 실행 오류
  • VRRP 설정 오류

해결:

# keepalived 로그 확인
tail -f /var/log/messages | grep Keepalived

# 설정 파일 문법 확인
keepalived -t -f /etc/keepalived/keepalived.conf

# 인터페이스 이름 확인 (eth0, ens33 등)
ip link show

Real Server가 Down으로 표시됨

증상:

  • ipvsadm -l에서 Real Server가 표시되지 않음

원인:

  • 헬스체크 실패

해결:

# LVS Director에서 직접 접속 테스트
curl http://192.168.0.102/

# digest 재확인
genhash -s 192.168.0.102 -p 80 --url /

# keepalived 로그 확인
grep "HTTP" /var/log/messages

keepalived 시작 실패

증상:

Starting keepalived: /bin/bash: keepalived: command not found [FAILED]

해결:

# keepalived 실행 파일 위치 확인
which keepalived
find / -name keepalived -type f

# PATH 설정 또는 절대 경로 사용
vi /etc/rc.d/init.d/keepalived
PATH=/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/sbin

7. 모니터링 및 관리

ipvsadm 주요 명령어

# 기본 상태 확인
ipvsadm -l

# 상세 통계
ipvsadm -Ln --stats

# 연결 정보
ipvsadm -Ln --connection

# 속도 통계
ipvsadm -Ln --rate

# 설정 저장
ipvsadm-save > /etc/sysconfig/ipvsadm

# 설정 복원
ipvsadm-restore < /etc/sysconfig/ipvsadm

# 모든 규칙 삭제
ipvsadm -C

# 특정 Real Server 제거
ipvsadm -d -t 192.168.0.100:80 -r 192.168.0.102:80

# 특정 Real Server 추가
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.104:80 -g -w 1

로그 모니터링

# keepalived 로그 실시간 확인
tail -f /var/log/messages | grep Keepalived

# VRRP 상태 변경 확인
grep "VRRP" /var/log/messages

# 헬스체크 실패 확인
grep "HTTP" /var/log/messages

8. 고가용성 구성 (HA)

Master-Backup 구성

두 대의 LVS Director 구성:

Master (192.168.0.101):

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101    # Backup보다 높은 우선순위
    ...
}

Backup (192.168.0.105):

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100    # Master보다 낮은 우선순위
    ...
}

장애 시나리오:

  1. Master 장애 발생
  2. Backup이 VRRP Advertising 수신 중단 감지
  3. Backup이 MASTER 상태로 전환
  4. Backup이 VIP를 자신에게 바인딩
  5. Gratuitous ARP로 네트워크에 VIP MAC 주소 변경 알림

참고사항

  • LVS와 Real Server는 반드시 같은 네트워크에 있어야 합니다 (DR 방식).
  • Real Server의 ARP 설정loopback VIP 등록은 필수입니다.
  • digest 값은 Real Server의 웹 페이지가 변경될 때마다 업데이트해야 합니다.
  • VRRP 인증을 설정하여 보안을 강화하세요 (auth_pass).
  • 헬스체크 간격을 적절히 조정하여 불필요한 페일오버를 방지하세요.
  • 프로덕션 환경에서는 반드시 HA 구성(Master-Backup)을 권장합니다.
  • ipvsadm-save로 정기적으로 설정을 백업하세요.
  • 최신 환경에서는 HAProxy, Nginx Plus, Traefik 등의 대안도 고려하세요.