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 |
| DB | 192.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_defs | notification_email | 장애 알림 받을 이메일 |
| smtp_server | SMTP 서버 주소 | |
| router_id | 라우터 식별자 | |
| vrrp_instance | state | MASTER 또는 BACKUP |
| interface | VIP를 바인딩할 인터페이스 | |
| virtual_router_id | VRRP 그룹 ID (1-255) | |
| priority | 우선순위 (높을수록 우선) | |
| virtual_ipaddress | VIP 주소 | |
| virtual_server | lb_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_ignore | 1 | 해당 인터페이스의 IP로 온 ARP 요청만 응답 |
| arp_announce | 2 | 가장 적합한 로컬 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 Robin | rr | 순차적으로 분배 | 서버 성능이 동일한 경우 |
| Weighted Round Robin | wrr | 가중치 기반 순차 분배 | 서버 성능이 다른 경우 |
| Least Connection | lc | 연결 수가 가장 적은 서버로 분배 | 세션 길이가 다른 경우 |
| Weighted Least Connection | wlc | 가중치 기반 최소 연결 | 서버 성능 + 연결 수 고려 |
| Shortest Expected Delay | sed | 응답 시간 예측 기반 분배 | 응답 시간 최적화 |
| Never Queue | nq | 유휴 서버 우선 분배 | 짧은 작업 처리 |
알고리즘 변경
# 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보다 낮은 우선순위
...
}
장애 시나리오:
- Master 장애 발생
- Backup이 VRRP Advertising 수신 중단 감지
- Backup이 MASTER 상태로 전환
- Backup이 VIP를 자신에게 바인딩
- 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 등의 대안도 고려하세요.