LVS 기반 로드밸런싱 아키텍처와 운영 가이드

클러스터와 분산 아키텍처 개요

리눅스 클러스터(Cluster) 정의

리눅스 클러스터는 다수의 독립 컴퓨팅 노드가 하나의 논리적 시스템처럼 동작하도록 구성된 인프라입니다. 사용자 입장에서는 개별 노드의 존재를 인지하지 못하며, 관리자는 필요에 따라 노드를 유연하게 확장하거나 축소할 수 있습니다.

클러스터의 핵심 장점

  • 탄력적 확장성: 노드의 추가/제거가 용이하여 수요 변화에 즉각 대응
  • 고가용성 보장: 특정 노드 장애 시 자동 페일오버로 서비스 중단 방지
  • 높은 처리량: 동시 접속을 여러 노드로 분산 처리
  • 비용 효율성: 상용 하드웨어로 고성능 시스템 구축 가능

주요 클러스터 유형

유형설명
LB (Load Balancing)스케줄러가 다수 서버 중 최적의 노드를 선정해 요청 분산
HA (High Availability)장애 발생 시 자동으로 대체 노드로 서비스 이전
HP (High Performance)대규모 계산 작업을 병렬 처리하는 과학/엔지니어링 환경

확장 방식 비교

Scale-Up (수직 확장): 기존 서버의 CPU, 메모리, 스토리지 등 하드웨어 사양을 업그레이드. 단기적 성능 향상에 유효하나 비용 대비 효율이 낮고 확장 한계 존재.

Scale-Out (수평 확장): 동일 사양의 서버를 추가로 배치하여 부하 분산. 비용 효율적이며理論상 무한 확장 가능.

분산 시스템과의 차이

클러스터는 동일한 코드베이스와 데이터를 모든 노드가 공유하며 동일한 서비스를 제공. 반면 분산 시스템은 업무를 기능별로 쪼개어 각 노드가 고유한 역할 수행. 클러스터는 단위 시간당 처리량 증대에, 분산은 개별 작업의 처리 시간 단축에 초점.

LVS(Linux Virtual Server) 동작 메커니즘

프로젝트 배경

LVS는 리눅스 커널 공간에서 TCP/IP 4계층 부하 분산을 수행하는 오픈소스 프로젝트. 2.4 커널부터 기본 모로 내장되어 별도 패치 없이 바로 사용 가능.

핵심 구성 요소

  • VS (Virtual Server): 클라이언트 요청을 스케줄링하는 디렉터
  • RS (Real Server): 실제 서비스를 처리하는 백엔드 노드

3계층 아키텍처

부하 분산 계층 (Load Balancer/Director): 사용자 요청을 수신하여 적절한 RS로 라우팅

서버 풀 계층 (Server Pool/Real Server): WEB, MAIL, FTP 등 실제 업무 처리

공유 스토리지 계층: 모든 RS가 동일한 콘텐츠를 제공하도록 데이터 동기화

네트워크 흐름

사용자 요청이 VIP(가상 IP)로 진입하면, 디렉터가 스케줄링 알고리즘에 따라 특정 RS로 전달. RS 처리 결과는 모드별로 다른 경로로 클라이언트에 반환.

LVS 전달 모드 상세 분석

NAT (Network Address Translation)

다중 대상 DNAT를 활용해 요청 패킷의 목적지 주소를 RS의 RIP로 변경. 응답 트래픽은 반드시 디렉터를 경유하므로 병목 가능성 존재.

덝 흐름: 클라이언트(CIP) → VIP:9000 → 디렉터 DNAT 변환 → RIP:9000 → RS 응답(RIP→CIP) → 디렉터에서 RIP를 VIP로, 9000을 80으로 변환 → 클라이언트

장점: RS가 사설 IP 사용, 디렉터와 동일 네트워크 구성으로 보안성 우수

단점: 모든 트래픽이 디렉터를 통과하여 대규모 환경에서 병목

NAT 모드 실습

환경 구성:

디렉터(lvs):    VIP 192.168.10.129/24, DIP 192.168.94.130/24
RS1(node1):     RIP 192.168.94.135/24, 게이트웨이 192.168.94.130
RS2(node2):     RIP 192.168.94.140/24, 게이트웨이 192.168.94.130
클라이언트:      CIP 192.168.10.160/24

디렉터 IP 포워딩 활성화:

[root@lvs ~]# grep 'ip_forward' /etc/sysctl.conf || echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1

RS 게이트웨이 설정:

[root@node1 ~]# nmcli con mod ens160 ipv4.gateway 192.168.94.130
[root@node1 ~]# nmcli con up ens160
[root@node1 ~]# systemctl stop firewalld; setenforce 0
[root@node1 ~]# yum install httpd -y
[root@node1 ~]# echo "Backend-01 $(hostname -I | awk '{print $1}')" > /var/www/html/index.html
[root@node1 ~]# systemctl enable --now httpd

ipvsadm 규칙 설정:

[root@lvs ~]# yum install ipvsadm -y
[root@lvs ~]# ipvsadm -A -t 192.168.10.129:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.10.129:80 -r 192.168.94.135:80 -m
[root@lvs ~]# ipvsadm -a -t 192.168.10.129:80 -r 192.168.94.140:80 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.129:80 rr
  -> 192.168.94.135:80            Masq    1      0          0
  -> 192.168.94.140:80            Masq    1      0          0

부하 분산 검증:

[root@lvs ~]# for i in {1..6}; do curl -s 192.168.10.129; done
Backend-01 192.168.94.135
Backend-02 192.168.94.140
Backend-01 192.168.94.135
Backend-02 192.168.94.140
Backend-01 192.168.94.135
Backend-02 192.168.94.140

DR (Direct Routing) - 기본 모드

MAC 주소만 변경하여 프레임 전달. RS는 루프백 인터페이스에 VIP를 설정하고, 응답을 클라이언트로 직접 전송하여 디렉터 부하 최소화.

핵심 제약: 디렉터와 RS는 동일 브로드캐스트 도메인 필수

ARP 충돌 해결:

# RS에서 VIP 노출 방지
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

DR 모드 실습

환경 구성:

클라이언트:     192.168.10.130/24, 게이트웨이 192.168.10.133
라우터:         192.168.10.133/24 (NAT), 192.168.94.140/24 (Host-Only)
디렉터:         192.168.94.129/24, VIP(lo) 192.168.94.200/32
RS1:            192.168.94.131/24, VIP(lo) 192.168.94.200/32
RS2:            192.168.94.130/24, VIP(lo) 192.168.94.200/32

디렉터 VIP 설정:

[root@lvs ~]# ip addr add 192.168.94.200/32 dev lo
[root@lvs ~]# nmcli con mod ens160 ipv4.gateway 192.168.94.140
[root@lvs ~]# nmcli con up ens160

RS 설정 (node2 예시):

[root@node2 ~]# ip addr add 192.168.94.200/32 dev lo
[root@node2 ~]# nmcli con mod ens160 ipv4.gateway 192.168.94.140
[root@node2 ~]# nmcli con up ens160
[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

가중치 라운드 로빈 적용:

[root@lvs ~]# ipvsadm -A -t 192.168.94.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.94.200:80 -r 192.168.94.130:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.94.200:80 -r 192.168.94.131:80 -g -w 2

방화벽 마크(FWM)를 활용한 세션 일관성

HTTP(80)과 HTTPS(443)을 동일한 실서버로 라우팅:

[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.94.200 -p tcp \
  -m multiport --dports 80,443 -j MARK --set-mark 6666
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.94.130 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.94.131 -g

TUN (IP Tunneling)

원본 IP 패킷을 DIP→RIP 터널 헤더로 캡슐화. RS는 터널을 해제하고 VIP를 소스로 응답 직접 반환.

적용 조건: VIP/DIP/RIP 모두 공인 IP, RS 터널 기능 지원 필수

장점: 지리적으로 분산된 데이터센터 간 부하 분산(재해 복구)

단점: RS 구성 복잡도 증가

FULLNAT

요청 패킷의 출발지와 목적지 IP를 모두 변경. DIP→RIP, CIP→DIP 형태로 변환.

특징: VIP는 공인, DIP/RIP는 사설 IP 사용 가능. 포트 매핑 지원. 단, 커널 재컴파일 필요.

LVS 스케줄링 알고리즘

정적 알고리즘

알고리즘설명
RR (Round Robin)순차적으로 RS에 분배, 균등 처리
WRR (Weighted RR)가중치에 따른 순환 분배, 서버 사양 차이 반영
SH (Source Hashing)동일 출발 IP는 항상 동일 RS로 (세션 고정)
DH (Destination Hashing)목적지 IP 해시, 캐시 프록시 환경에 최적

동적 알고리즘

알고리즘설명
LC (Least Connections)활성 연결 수가 가장 적은 RS 우선 선택
WLC (Weighted LC)가중치를 고려한 LC, 기본 스케줄러
SED (Shortest Expected Delay)(활성연결+1)*256/가중치, 초기 연결 시 높은 가중치 우선
NQ (Never Queue)1차 라운드는 균등 배분, 이후 SED 적용
LBLC/LBLCR지역성 기반 동적 스케줄링, 캐시 복제 고려

ipvsadm 명령어 체계

패키지 구성

  • 바이너리: /usr/sbin/ipvsadm
  • 저장 도구: /usr/sbin/ipvsadm-save, /usr/sbin/ipvsadm-restore
  • 설정 파일: /etc/sysconfig/ipvsadm

가상 서비스 관리

# 가상 서비스 생성
ipvsadm -A -t 192.168.1.100:80 -s wlc

# 가상 서비스 수정 (알고리즘 변경)
ipvsadm -E -t 192.168.1.100:80 -s rr

# 가상 서비스 삭제
ipvsadm -D -t 192.168.1.100:80

# 전체 규칙 삭제
ipvsadm -C

실서버(RS) 관리

# RS 추가 (-m: NAT, -g: DR, -i: TUN)
ipvsadm -a -t 192.168.1.100:80 -r 172.16.16.2:80 -m -w 2

# RS 수정 (가중치 변경)
ipvsadm -e -t 192.168.1.100:80 -r 172.16.16.2:80 -m -w 5

# RS 제거
ipvsadm -d -t 192.168.1.100:80 -r 172.16.16.2:80

모니터링 및 유틸리티

# 규칙 조회 (숫자로 표시, 역참조 없음)
ipvsadm -Ln

# 처리량 확인
ipvsadm -Ln --rate

# 카운터 초기화
ipvsadm -Z

# 규칙 영구 저장
ipvsadm-save -n > /etc/sysconfig/ipvsadm

# 규칙 복원
ipvsadm-restore < /etc/sysconfig/ipvsadm

주요 옵션 요약

옵션기능
-A/-E/-D가상 서비스 추가/수정/삭제
-a/-e/-dRS 추가/수정/삭제
-t/-u/-fTCP/UDP/방화벽 마크 서비스 지정
-s스케줄링 알고리즘 지정
-r실서버 주소 지정
-g/-i/-mDR/TUN/NAT 모드 지정
-w가중치 설정
-p지속성 연결 타임아웃
-C/-Z전체 삭제/카운터 초기화

태그: LVS IPVS 로드밸런서 NAT DR

8월 8일 21:03에 게시됨