리눅스 LVS 로드밸런서 구성

CentOS에서 LVS 사용하기

LVS(Linux Virtual Server)는 리눅스에서 구현된 로드밸런스 솔루션으로,  L4 스위치의 역할을 한다.

1. 설치
LVS는 ipsvadm 패키지를 설치하면 된다.

# yum install ipvsadm

설치후 ipsvadm 커맨드를 실행하면 아래와 같은 결과를 볼 수 있다.

# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

2. 구성 및 설정

LVS/NAT 구성
로드밸런서(LVS) :  192.168.100.51(외부망), 172.16.1.51(내부망), CentOS 6
웹서버1 : 172.16.1.31(게이트웨이는 로드밸런서의 내부망 ip 주소), CentOS 6
웹서버2 : 172.16.1.32(게이트웨이는 로드밸런서의 내부망 ip 주소), CentOS 6

커널 파라에타에서 패킷 포워딩을 허용하도록 해준다. /etc/sysctl.conf에서 아래 부분을 수정하고 적용한다.

[root@fox1 ~]# cat /etc/sysctl.conf | grep -i forward
# Controls IP packet forwarding
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

[root@fox1 ~]# sysctl -p

재부팅시 서비스를 자동으로 실행하도록 아래 커맨드를 실행한다.

[root@fox1 ~]# chkconfig --level 345 ipvsadm on

2.1. 룰 초기화
기존의 룰을 삭제한다. 물론, 지금은 처음 설치했기 때문에 수행하지 않아도 된다.

[root@fox1 ~]# ipvsadm -C

2.2. 가상 서비스 등록
여기서는 웹서비스를 등록하도록 할 것이다. 등록은 아래와 같은 형식으로 한다.
ipvsadm -A -t (서비스 IP 주소:Port 번호) -s (할당 방법) 아래에서 할당방법은 라운드로빈 방식이다.

[root@fox1 ~]# ipvsadm -A -t 192.168.100.51:80 -s rr

할당방식은 라운드로빈외 여러가지가 존재하며, 아래와 같다.

  • rr(Robin Robin): 실 서버에 한번씩 번갈아가며 접속하는 방법
  • wrr(Weighted Round Robin): 라운드로빈 방식에서 실제 서버에 가중치를 주어 가중치가 높은 서버에 더 자주 접속하는 방법
  • lc(Least-Connection): 가장 접속이 적은 실제 서버로 더 많은 요청을 배분하는 방식.
  • wlc(Weighted Least-Connection): lc 방식에 가중치(Ci/Wi)를주어 특정 서버에 더 많은 작업을 할당하는 방식. 옵션 없을경우 기본값.
  • lblc(Locality-Based Least-Connection): 목적지 IP와 관련하여 가장 접속이 적은 서버로 더 많은 요청을 배분하는 방식.
  • lblcr(Locality-Based Least-Connection with Replication): 목적지 IP와 관련하여 가장 접속이 적은 서버로 더 많은 요청을 배분하는 방식. LBLC 스케줄과의 차이는 대상 IP 주소를 실제 서버 노드의 서브셋으로 묶는것.
  • dh(Destination Hashing): 정적 해쉬 테이블에 있는 목저지 IP를 찾아 실제 서버의 풀로 요청을 배분하는 방식.
  • sh(Source Hashing): .정적 해쉬 테이블에 있는 소스 IP를 찾아 실제 서버의 풀로 요청을 배분하는 방식.
  • sed(Shortest Expected Delay): 예상 지연이 가장 짧은 서버에 들어오는 작업을 할당하는 방식.
  • nq(Never Queue): 빠른 작업을 기다리는 대신 들어오는 작업을 유휴 서버에 할당하는 방식. 모든 서버가 사용중인 경우 가장 짧은 예상 지연 정책을 적용하여 작업을 할당함.

2.3. 물리 서버 등록
ipvsadm -a -t (서비스 IP 주소:Port 번호) -r (실제 서버의 IP 주소:Port 번호) -m (“m” 은 masquerading (NAT)을 의미함) 형식으로 등록해준다.

[root@fox1 ~]# ipvsadm -a -t 192.168.100.51:80 -r 172.16.1.31:80 -m
[root@fox1 ~]# ipvsadm -a -t 192.168.100.51:80 -r 172.16.1.32:80 -m

2.4. 등록된 서비스 확인.
아래 커맨드로 등록된 서비스 테이블을 확인 할 수 있다.

[root@fox1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  fox1:http rr
  -> 172.16.1.31:http             Masq    1      0          0         
  -> 172.16.1.32:http             Masq    1      0          0

2.5. 설정 저장.
아래 커맨드로 저장한다. 설정은 /etc/sysconfig/ipvsadm에 저장된다.

[root@fox1 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]

3. 테스트

웹서버1, 웹서버2에 각각 apache 웹서버를 설치하고, index.html을 서로 다른 내용으로 만들고, 접속해 본다.

[root@fox1 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  fox1:http wlc
  -> 172.16.1.31:http             Masq    1      0          4         
  -> 172.16.1.32:http             Masq    1      0          4

접속할 때 마다, 서로 다른 서버에 접속됨을 확인 할 수 있다.

6 comments

Skip to comment form

    • mongyi on 2019년 1월 16일 at 2:09 오후
    • Reply

    안녕하세요. 좋은 정보 감사합니다. LVS 서버 만들어서 테스트 중인데 웹 서버를 만들어서 번갈아가면서 나오는지 확인하고 싶습니다. 그런데 VIP라서 저는 작성자님처럼 PC에서는 확인이 어려우니 LVS서버에서 curl을 이용해 VIP를 이용했는데
    [root@e_cent html]# curl 192.168.0.125
    curl: (7) Failed connect to 192.168.0.125:80; 호스트로 갈 루트가 없음 이렇게 나오더라구요.
    혹시 어떻게 해야하는 지 도움을 주실 수 있나요?
    참고로 LVS VIP가 192.168.0.125입니다.

    • snowffox on 2019년 1월 16일 at 6:26 오후
    • Reply

    ipvsadm 실행 결과가 3번과 비슷하게 나오면 설정 문제는 아닐것 같고요.
    혹시 방화벽이 올라가서 차단될 수도 있으니,
    iptables -L -v 로 방화벽 룰도 확인해 보셔요.

    • test on 2020년 4월 18일 at 5:42 오후
    • Reply

    쿠버네티스의 kube-proxy의 모드를 ipvs로 바꾼 뒤 pod3개와 서비스를 생성했습니다.

    ipvsadm -E -a {클러스터ip:80} -s lc
    ipvsadm-save

    위 명령을 통해 쿠버네티스의 해당 서비스 클러스터로 들어가는 스케쥴링을 rr에서 lc로 바꿨습니다. 하지만 다른 노드에서 curl 명령으로 해당 클러스터로 접근하거나 일정 시간이 지마녀 다시 rr로 바뀝니다. 이유를 알 수 있을까요?

      • snowffox on 2020년 4월 20일 at 11:18 오전
      • Reply

      http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.ipvsadm.html
      이 문서에 의하면
      lc는 매우 긴 세션에 적합하지만로드가 짧은 시간 단위로 변하는 웹 서버에는 적합하지 않으며, LVS에는 실제 서버에 대한로드 모니터링이 없다고 하네요.
      그럼에도 불구하고 설정 자체가 바뀐다는것은…

    • changho kim on 2021년 11월 17일 at 1:07 오후
    • Reply

    lvs 설치한 곳 서버에서 80 이 LISTENING 상태인가요 ?!

    1. LVS 서버 말이죠?
      LVS는 스위치 역할을 하기 때문에, 80 포트가 열려있지 않을 것으로 생각됩니다(추측입니다). 현재, 구현해 놓은 LVS가 없어서 확인은 못해봤어요..

답글 남기기

Your email address will not be published.