잊지 않겠습니다.

출처 : http://www.cyberlation.net/entry/LVS-IPVS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-DR-Direct-Routing
----------------------------------------------------------------------------------

IPVS Configuration : DR (Direct Routing)


LVS 에서 부하를 분산하는 방법 즉, 패킷을 다른 노드로 전달해 버리는 방법(IP Packet Forwarding Method)에는 크게 NAT (Network Address Translation), TUN (IP Tunneling), DR (Direct Routing) 등 3가지가 있으며, 여기에서는 가장 널리 사용되는 Direct Routing 방법을 위한 설정 사항을 정리한다.

1. Dispatcher Node 설정

Dispatcher Node (또는 Director)는 Clients로부터 서비스 요청 패킷을 받아 미리 설정된 Scheduling 방식으로 Real Servers에게 부하를 분산하는 역할을 수행한다.
1.1. VIP 및 DIP 설정
Dispatcher Node에서는 크게 DIP (Director IP)와 VIP (Virtual IP)를 설정해야 한다. 여기에서 DIP는 Dispatcher Node가 고유하게 가질 IP 주소로서, NIC의 기본 IP 주소가 된다. 반면 VIP는 외부 Clients에게 서비스를 제공하기 위해 사용될 인터페이스 IP 주소 (즉, 외부 Clients가 접속할 IP 주소)로서, Aliasing을 통해 설정할 수 있으며, 부하를 상호 분산할 Real Server도 이 VIP를 반드시 가져야 한다.

따라서, 우선 VIP가 123.234.1.101 이고, DIP가 123.234.1.102 이라고 가정할 때,

>$ su -
Password :
># ifconfig eth0 123.234.1.102 netmask 255.255.255.0 up
># ifconfig eth0:1 123.234.1.101 netmask 255.255.255.0 up
># ifconfig

위와 같이, ifconfig 명령을 이용하여 VIP와 DIP를 각각 설정한 다음, ifconfig로 설정사항을 확인한다. 단, 이미 eth0에 DIP가 설정되어 있는 경우가 대부분이므로, 이 단계에서는 VIP 만을 설정해도 된다.

1.2. Packet Forwarding 활성화
Dispatcher 는 Client로부터 전송된 요청 메시지를 Real Server로 전달해야 하므로, 반드시 Packet Forwarding 기능이 활성화되어 있어야 한다. 이는 proc의 ip_forward의 값을 1로 설정함으로써 가능하다.

># echo 1 > /proc/sys/net/ipv4/ip_forward
1.3. IPTABLES 및 IPVSADM 설정 초기화

Virtual Service를 본격적으로 등록하기 전에 IPTABLES와 IPVSADM의 설정을 다음과 같이 초기화한다. 단, 현재의 설정 사항이 문제를 야기할 소지가 없을 때에는 본 단계를 생략할 수 있다.

># iptables -F                // Clear all iptables rules
># iptables -Z                // Reset iptables counters
># ipvsadm -C               // Clear all ipvsadm rules and services
1.4. Virtual Service 등록 (IPVSADM 설정)
이미 Dispatcher Node에 IPVS Admin이 설치되었다고 가정한다. 정상적으로 설치된 경우, root 계정으로 쉘에서ipvsadm 명령을 실행하면 다음과 같은 화면이 출력되면 정상이다.

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

이 상태에서 부하를 분산시킬 Dispatcher Node의 VIP와 Port 번호 그리고 Scheduling 방식을 다음과 같이 입력한다. 단, 여기에서는 VIP로 접속하는 Web Requests (80 port)를 Round-Robin 방식으로 부하 분산시키는 것을 가정한다.

># ipvsadm -A -t 123.234.1.101:80 -s rr

여기에서 각 옵션은 다음과 같다.
  • -A, --add-service : 가상 서비스의 추가를 위한 옵션으로서, 임의의 가상 서비스는 IP 주소, Port 번호, 프로토콜의 조합으로 유일하게 정의된다.
  • -t, --tcp-service : TCP 서비스를 의미하며, 가상 서비스를 규정하는 한 요소이다.
  • -s, --scheduler : TCP 연결과 UDP Datagram을 Real Server에게 전달(할당)하기 위한 알고리즘으로서, LVS에서는 Kernel 모듈로서 총 10개의 방식이 구현되어 있다.
    • rr : Round Robin
    • wrr : Weighted Round Robin
    • lc : Least-Connection
    • wlc : Weighted Least-Connection
    • lblc : Locality-Based Least-Connection
    • lblcr : Locality-Based Least-Connection with Replication
    • dh : Destination Hashing
    • sh : Source Hashing
    • sed : Shortest Expected Delay
    • nq : Never Queue


2. Real Server 설정

Real Server는 실제 Client에게 서비스를 제공하는 노드로서, Dispatcher Node로부터 전달된 요청을 처리한 뒤 바로 Client에게 응답 메시지를 전송한다.

2.1. ARP Problem 해결 : ARP Hidden
패 킷 전달 방식에 있어 NAT를 제외한 TUN 및 DR 방식은 모두 ARP Flux Problem을 해결해야 한다. 기본적으로 Dispatcher Node와 Real Server 모두 VIP를 갖고 있기 때문에, 클라이언트가 VIP의 MAC 주소를 묻는 ARP Request를 전송했을 때 Dispatcher와 Real Server 모두 이에 응답하게 되면 클라이언트는 이들 중 특정 서버의 MAC 주소를 해당 VIP에 해당하는 MAC 주소로 기억(ARP Caching)하고는 이 서버에게만 모든 서비스 요청 메시지를 전송한다. 결국 부하 분산을 더 이상 제공할 수 없으며, 임의의 클라이언트가 어떤 서버로부터 서비스를 제공받는지 관리할 수 없다. 

결국 이를 해결하기 위해서는 클라이언트가 ARP 요청 메시지를 전송했을 때 Dispatcher만이 이에 응답하고, Real Server는 모두 ARP 요청 메시지를 무시해야 한다. 여기에서는 가장 간단한 ARP Hidden 방식을 소개한다.

일반적으로 Real Server에 VIP는 lo 장치에 Aliasing으로 설정되기 때문에, lo 장치와 다른 모든 인터페이스에 대해 ARP를 무시하도록 설정한다.

># echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
># echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
># echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
># echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

2.2. VIP 및 RIP 설정
Real Server는 고유의 IP 주소인 RIP (Real Server IP)를 갖고 있으며, Dispatcher는 RIP 주소를 기반으로 서비스 요청을 분산시킨다. 다만, Direct Routing 방식의 특성상 처리된 클라이언트의 요청은 Real Server에서 클라이언트로 직접 전달되므로(NAT 방식에서 Dispatcher를 거치는 것과는 달리), Real Server는 VIP 주소도 함께 lo 장치로서 갖고 있어야 한다. 
따라서, 우선 VIP가 123.234.1.101 이고, RIP가 123.234.1.111 이라고 가정할 때,

># ifconfig eth0 123.234.1.111 netmask 255.255.255.0 up
># ifconfig lo:0 123.234.1.101 netmask 255.255.255.255 up
># ifconfig

위와 같이, ifconfig 명령을 이용하여 VIP와 RIP를 각각 설정한 다음, ifconfig로 설정사항을 확인한다. 단, 이미 eth0에 RIP가 설정되어 있는 경우가 대부분이므로, 이 단계에서는 VIP 만을 설정해도 된다.

2.3. Routing Table 설정
lo:0 장치에 VIP를 설정했으므로, Destination이 VIP인 요청 메시지를 lo:0 장치로 전달해야 한다. 그런 다음에는 이를 Real Server의 커널에 의해 처리된다.

># route add -host 123.234.1.101 dev lo:0


3. Real Server를 Virtual Service에 등록 (on Dispatcher Node)

Dispatcher Node 및  Real Server의 설정이 완료되었고, Virtual Service도 등록되었으므로, 이제 실제 Virtual Service를 제공할 Real Server 노드를 Virtual Service에 등록한다. 일반적으로 Dispatcher Node 또한 부하 분산의 기능 외에 Real Server와 같이 Virtual Service를 제공할 수 있기 때문에, 여기에서는 Dispatcher Node가 Real Server로서 Virtual Service에 등록되는 경우와 일반적인 Real Server가 Virtual Service에 등록되는 경우로 구분하여 정리한다.

참고로 Real Server가 Virtual Service에 등록되는 시점부터 바로 클라이언트는 VIP를 통해 서비스를 제공받을 수 있다.

3.1. Dispatcher를 Real Server로서 등록하기
Dispatcher Node가 Real Server로서 Virtual Service를 제공하기 위해서는 클라이언트로부터 전송된 요청 메시지를 다음과 같이 Local host (127.0.0.1) 로 전송할 수 있도록 등록하면 된다.

># ipvsadm -a -t 123.234.1.101:80 -r 127.0.0.1 -g

여기에서 각 옵션은 다음과 같다.
  • -a, --add-server : 가상 서비스에 Real Server를 추가하기 위한 옵션으로서, 임의의 가상 서비스를 나타내는 IP 주소, Port 번호, 프로토콜의 조합 (Virtual Service 등록시 입력한 값)과 더불어 추가할 Real Server의 IP 주소로서 추가된다.
  • -t, --tcp-service : TCP 서비스를 의미하며, 가상 서비스를 규정하는 한 요소이다.
  • -r, --real-server : Virtual Service에 등록할 Real Server의 IP 주소 또는 호스트명으로서, 경우에 따라 Port 번호를 추가할 수 있다.
  • Packet-forwarding-method : Dispatcher Node에 전달된 클라이언트의 요청 메시지를 Real Server에게 전달하기 위한 방식으로서, LVS에서는 3가지 방식이 있다.
    • -g, --gatewaying : Direct Routing (gatewaying 방식 사용, Default)
    • -i, --ipip : Tunneling (ipip encapsulation 방식 사용)
    • -m, --masquerading : NAT (Masquerading 방식 사용)
3.2. Real Server를 등록하기

일반적인 Real Server를 Virtual Service에 등록하는 방식도 위와 동일하다. 다만 local host 대신 RIP를 입력하는 것만 차이가 있다.

># ipvsadm -a -t 123.234.1.101:80 -r 123.234.1.111 -g
3.3 Virtual Service 설정 확인

위와 같이 Real Server를 Virtual Service에 등록한 다음에는 정상적으로 등록되었는지 그 결과를 확인한다.

># ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  123.234.1.101:80  rr
  ->  127.0.0.1:80                    Route    1         0               0 
  ->  123.234.1.111:80             Route    1         0               0 
>#


4. Virtual Service 상태 모니터링

이상과 같이 Virtual Service에 Real Server가 등록된 이후에는 즉시 VIP를 통한 서비스 제공이 가능하다. 이때 Dispatcher Node에서 주기적으로 서비스 상태(# of Active Connection and # of Inactive Connection)를 계속해서 모니터링하고 싶은 경우 watch 명령을 이용한다.

># watch ipvsadm -Ln



Posted by Y2K
,