티스토리 뷰

◎ Linux 가상 서버(LVS:Linux Virtual Server)

Linux 가상 서버(LVS:Linux Virtual Server)는 Linux에서 제공하는 L4 Load Balancer 솔루션입니다.

LVS는 크게 Packet Load Balacing을 수행하는 Load Balancer와 Packet의 실제 목적지인 Real Server로 구성됩니다.

여러 서버에 네트워크 트래픽을 분산하여 성능을 개선하고 고가용성을 보장하며 개별 시스템의 과부하를 방지하기 위해 널리 사용되는 강력한 로드 밸런싱 솔루션입니다. LVS는 OSI 모델의 전송 계층(Transport Layer, Layer 4)에서 작동하며 다양한 부하 분산 알고리즘을 사용하여 들어오는 요청을 백엔드 서버 풀에 효율적으로 분산합니다.

 

◎ IPVS(IP Virtual Server)
IPVS는 LVS 위에서 동작하는 L4 Load Balancer입니다.

 

◎ 구성도

[AS-IS]

WEB1과 WEB2는 동기화 설정이 되어있어 어느 서버에 접속하더라도 동일한 내용을 보여주고 있으나 부하분산(LB) 구성이 되어 있지않아 특정 서버로만 접속이 몰리는 현상이 발생할 수 있습니다.

[TO-BE]

IPVS를 구성하여 부하를 분산해줍니다. IPVS를 구성할 때는 IP를 총 2개(Real IP와 Virtual IP) 할당해 주어야 합니다.

Virtual IP는 부하분산(LB)용이고, Real IP는 LVS 관리용 IP입니다. Real IP 1개로는 IPVS 구성이 불가합니다.

 

 구성방법

※ CentOS를 기준으로 테스트가 완료된 설정방법입니다.

[공통]

WEB1, WEB2 및 LVS 서버에 아래 명령어를 실행합니다.

> 네트워크 IP 설정(생략)

> DNS IP 설정

# vi /etc/resolv.conf
nameserver 168.126.63.1

vi /etc/resolv.conf : DNS 서버 설정 파일입니다.

> 방화벽 규칙 설정
들어오는 트래픽이 로드 밸런서에 도달하고 백엔드 서버에서 나가는 트래픽이 통과할 수 있도록 방화벽 규칙이 설정되어 있는지 확인합니다. 보통은 방화벽 장비에서 정책으로 통제하기 때문에 서버에서 방화벽 규칙은 비활성화합니다.

# systemctl status firewalld
# systemctl stop firewalld

systemctl status firewalld : 방화벽 서비스 설정상태를 확인합니다.

systemctl stop firewalld : 방화벽 서비스가 동작중이라면 방화벽 서비스를 정지합니다.

> 업데이트 관련 설정

# yum remove epel-release -y
# yum update

yum remove epel-release -y : EPEL(Enterprise Linux용 추가 패키지) 최신 저장소 패키지를 삭제하는 명령어입니다. 이 명령어를 실행하면 epel-release 패키지와 관련된 모든 파일과 설정이 시스템에서 제거됩니다. 패키지를 업데이트 하기 전에 다운로드가 시스템의 다른 소프트웨어와 충돌을 일으키는 경우를 대비해서 epel-release를 제거하는 명령어입니다.

yum update : 업데이트를 적용합니다.

# dnf clean all
# rm -r /var/cache/dnf
# dnf upgrade

dnf clean all : 임시 저장 장소의 DNF 관련 캐시된 패키지와 헤더를 삭제합니다.

 DNF(Dandified Yum)는 Yum(Yellowdog Updater Modified)의 후속으로 개발되었으며, Yum의 대안으로서 더 빠르고 효율적인 패키지 관리를 제공합니다.

rm -r /var/cache/dnf : DNF (Dandified YUM) 패키지 매니저의 캐시를 삭제하는 명령어입니다.

dnf upgrade : 현재 설치되어 있는 패키지들을 최신 버전으로 업그레이드합니다.

 

[IPVS 가상 IP(VIP) 설정]
IPVS에서 가상 IP(VIP)는 로드 밸런서의 프런트엔드를 나타내는 고유 IP 주소입니다. 클라이언트는 이 VIP로 요청을 보내면 백엔드 서버에 트래픽을 분산하는 역할을 담당합니다. 

> 네트워크 설정

부팅 시 자동으로 등록되게 VIP 네트워크를 설정합니다.

# vi /etc/sysconfig/network-scripts/ifcfg-ens1:1
DEVICE=ens1:1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.1
NETMASK=255.255.255.0

vi /etc/sysconfig/network-scripts/ifcfg-ens1:1 : VIP 네트워크를 설정합니다.

# vi /etc/sysconfig/network-scripts/route-ens1:1
192.168.1.1/32 via 0.0.0.0

vi /etc/sysconfig/network-scripts/route-ens1:1 : VIP 네트워크 라우팅을 설정합니다.

# systemctl restart NetworkManager

systemctl restart NetworkManager : NetworkManager 서비스를 재시작합니다.

> IP 포워딩을 활성화합니다:
로드 밸런서에서 IP 포워딩을 활성화하여 들어오는 트래픽이 백엔드 서버로 올바르게 전달될 수 있도록 합니다. 이는 net.ipv4.ip_forward 커널 파라미터를 1로 설정하면 됩니다.

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p

vi /etc/sysctl.conf : 커널 파라미터 값을 변경하기 설정파일을 수정합니다.

net.ipv4.ip_forward = 1 : net.ipv4.ip_forward의 값을 1로 변경하며 IP 포워딩을 활성화합니다.

sysctl -p : 커널 파라미터 변경사항을 적용합니다.

> ipvsadm 패키지 설정

# yum install ipvsadm
# rm -rf /etc/sysconfig/ipvsadm
# touch /etc/sysconfig/ipvsadm
# systemctl start ipvsadm
# systemctl enable ipvsadm.service
# systemctl status ipvsadm.service
# ipvsadm -C

yum install ipvsadm : 부하분산(Load Balancing)을 구성하기 위한 ipvsadm 패키지를 설치합니다.

rm -rf /etc/sysconfig/ipvsadm : 설정파일을 삭제합니다.

※ ipvsadm 파일에는 IPVS 규칙 및 설정을 구성하는 데 사용되는 변수와 해당 값이 포함되어 있습니다.

touch /etc/sysconfig/ipvsadm : 빈 설정파일을 생성합니다.

systemctl start ipvsadm : ipvsadm 서비스를 시작합니다.

systemctl enable ipvsadm.service : 시스템이 재시작되더라도 자동실행되도록 ipvsadm.service 이름으로 서비스를 등록합니다.

systemctl status ipvsadm.service : ipvsadm.service 이름으로 등록한 서비스의 상태를 확인합니다.

ipvsadm -C : IPVS테이블에 구성된 모든 가상 서버 항목을 초기화합니다.

> IPVS 테이블 구성
로드 밸런싱 규칙 관리를 담당하는 IPVS 테이블을 구성하려면 ipvsadm 명령을 사용합니다. 새 IPVS 테이블을 만들고 각 백엔드 서버에 대한 항목을 추가하여 해당 서버의 IP 주소와 포트, 선택한 부하 분산 스케줄러를 지정합니다.

# ipvsadm -A -t 192.168.1.1:8000 -s lc -p 30
# ipvsadm -a -t 192.168.1.1:8000 -r 192.168.1.10:8000 -g 
# ipvsadm -a -t 192.168.1.1:8000 -r 192.168.1.20:8000 -g 
# ipvsadm --save

ipvsadm -A -t 192.168.1.1:8000 -s lc -p 30 : 서비스로 IPVS VIP를 등록합니다.

ipvsadm -a -t 192.168.1.1:8000 -r 192.168.1.10:8000 -g : 리얼서버 WEB1을 IPVS서비스로 등록합니다.

ipvsadm -a -t 192.168.1.1:8000 -r 192.168.1.20:8000 -g : 리얼서버 WEB2를 IPVS서비스로 등록합니다.

옵션은 아래 따로 설명하겠습니다.

ipvsadm --save : IPVS의 설정을 저장합니다.

> 로드 밸런서 테스트
로드 밸런서를 구성한 후에는 기능과 성능을 철저하게 테스트해야 합니다. VIP에게 테스트 요청을 보내고 선택한 부하 분산 알고리즘에 따라 트래픽이 백엔드 서버 간에 올바르게 분산되는지 확인합니다.

# ipvsadm -Lcn
# ipvsadm -L --stats

ipvsadm -Lcn : 현재 IPVS의 설정을 확인합니다.

 -L : 서비스/리얼서버 리스트를 출력합니다.
 -n : 숫자형식(호스트네임->아이피주소)로 출력합니다.
 -c : 현재 연결을 출력합니다.

ipvsadm -L --stats : 현재 IPVS의 모든 서비스들을 체크합니다.

# cat /etc/sysconfig/ipvsadm
# vi /etc/sysconfig/ipvsadm

cat /etc/sysconfig/ipvsadm : 설정파일 내용을 보여줍니다.

vi /etc/sysconfig/ipvsadm : 설정파일을 수정할 수 있습니다.

# systemctl disable ipvsadm.service
# systemctl start ipvsadm.service
# systemctl stop ipvsadm.service
# systemctl status ipvsadm.service

systemctl disable ipvsadm.service : ipvsadm.service 를 비활성화합니다.

systemctl start ipvsadm.service : ipvsadm.service를 시작합니다.

systemctl stop ipvsadm.service : ipvsadm.service를 정지합니다.

systemctl status ipvsadm.service : ipvsadm.service 이름으로 등록한 서비스의 상태를 확인합니다.

 

[백엔드 서버(WEB1, WEB2) 구성]

# vi /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.ens18.arp_ignore = 1
net.ipv4.conf.ens18.arp_announce = 2

# sysctl -p

vi /etc/sysctl.conf : 커널 파라미터 값을 변경하기 설정파일을 추가합니다.

sysctl -p : 커널 파라미터 변경사항을 적용합니다.


들어오는 요청을 처리할 백엔드 서버를 식별하고 설정 및 작동하는지 확인합니다. 클러스터 전체에서 일관성을 유지하려면 각 백엔드 서버에 동일한 콘텐츠 및 서비스가 있어야 합니다.

 

◎ ipvsadm 관련 상세 내용

[ipvsadm의 기본 문법]

ipvsadm [명령] [프로토콜 옵션] [서비스] [스케줄링 방법] [세션유지 옵션] : 서비스 등록 옵션입니다.
ipvsadm [명령] [프로토콜 옵션] [서비스] -r [리얼서버 옵션] [가중치 옵션] : 리얼서버 등록 옵션입니다.

[서비스/리얼서버 관련 옵션]

> 명령

 -A : 서비스 추가
 -E : 서비스 수정
 -D : 서비스 삭제
 -a : 리얼서버 추가
 -e : 리얼서버 수정
 -d : 리얼서버 삭제
> 프로토콜
 -t : TCP
 -u : UDP
 -f : firewall 서비스 추가(NAT 방식에서 사용)

 

> 기타
 -s [ rr | wrr | lc | wlc | lblc | lblcr | dh | sh | sed | nq ] : 스케줄링 방법 설정

[로드 밸런싱 스케줄링 방식]에서 설명하겠습니다.
 -p [timeout]: 세션 타임아웃 설정
 -r [서버주소:서비스포트] : 리얼서버 설정
 -w [가중치] : 가중치 설정


[설정 확인]
 -L : 서비스/리얼서버 리스트 출력
 -n : 숫자형식(호스트네임->아이피주소)으로 출력
 -c : 현재 연결 출력

[입/출력]
 -S : 표준출력(화면프린트)으로 현재 설정을 내보냅니다.
 -R : 표준입력을 통해 설정을 가져옵니다


[로드 밸런싱 스케줄링 방식]
IPVS는 스케줄러라고도 하는 여러 로드 밸런싱 알고리즘을 지원합니다. 일반적으로 사용되는 알고리즘은 다음과 같습니다:

 

> 라운드 로빈(rr)
round-robin방식은 가장 기본적인 스케줄링 방식으로 "순차적으로" 작업을 각각의 노드에 분배하는 방식입니다. 만약 3 대의 노드(A,B,C)에 round robin 방식을 사용하면, A->B->C->A->B->C와 같이 실행이 됩니다.
> 가중치 라운드 로빈(wrr)
노드별로 가중치를 설정하여 작업을 순차적으로 분배하는 방식으로 여러대의 서버가 각각 성능이 다른경우 성능에 맞춰 가중치를 설정해 주면 성능이 낮은 서버에 과도한 부하가 걸리는 것을 방지할 수 있습니다.
> 최소 연결(lc)
"현재 활성화 되어있는(ESTABLISHED)" 접속량이 적은 서버부터 작업을 할당하는 방식으로, 불필요한 유휴자원이 발생하는 것을 막을 수 있습니다. 만약 접속이 오래 유지되지 않는 경우 이 방식을 사용하면, A->A->A->A->...와 같이 리스트 위쪽에 있는 노드 위주로 작업이 할당됩니다.
> 가중치 최소 연결(wlc)
노드별로 가중치를 설정하여 접속량이 적은 서버부터 작업을 할당하는 방식으로 lc보다 효율적인 자원분배가 가능합니다.

 

[타임아웃]
> 세션 타임아웃
ipvsadm에서 -p 옵션을 이용하여 어떤 서비스에 세션 타임아웃 시간을 설정하면, 한번 세션이 열린후 타임아웃 시간 내에 동일한 주소에서 세션이 다시 열렸을 때 처음에 접속했던 RIP로 접속이 됩니다.
> Idle 타임아웃
ipvsadm --set옵션을 이용하면 프로토콜의 Idle timeout 시간을 설정할 수 있습니다. timeout 시간이 지나면 연결이 끊어지게 됩니다.다. 예를 들어,
ivpsadm --set 10 20 30
로 설정을 해 주게 되고 ftp연결후 10초간 아무것도 하지 않으면 연결이 끊어집니다. 이는 http와 같이 한번 보내면 해당 연결이 끊겨도 별 문제가 없는 서비스의 경우는 상관없지만, ftp, nfs와 같은 서비스를 사용할 때에는 신중하게 값을 설정해야 합니다.

댓글
공지사항