다음은 Direcet Routing request dispatching 기술을 이용 어떻게 리눅스 가상 서버를 구축하는지 설명한다.
요청 디스패칭 접근방법은 IBM의 NetDispatcher가 수행하는 것과 비슷하다. 실제 서버와 부하분산 서버에서 가상 IP 주소를 공유한다. 부하분산서버에는 마찬가지로 가상 IP 주소를 설정한 인터페이스가 있어야하며 이 인터페이스를 이용, 요청 패킷을 받아들이고 선택한 서버에 직접 라우팅할 수 있다. 모든 실제 서버는 가상 IP주소로 설정한 non-arp alias 인터페이스가 있거나 가상 IP 주소로 향하는 패킷을 지역 소켓으로 재지향한다. 그래서 실제 서버에서 패킷을 지역적으로 처리할 수 있다. 부하분산 서버와 실제 서버는 허브/스위치를 이용 물리적으로 링크된 그들만의 인터페이스를 가지고 하나 가지고 있어야한다.구조는 다음과 같다.
사용자가 서버 클러스터에서 제공하는 서비스에 접근할때, 가상 IP 주소(가상 서버의 IP 주소)로 향하는 요구 패킷이 부하분산서버로 간다. 부하분산서버(LinuxDirector)에서 패킷의 목적지 주소와 포트 번호를 검사한다. 그 내용이 가상 서버 서비스와 일치하면 스케쥴링 알고리즘에 따라 클러스터에서 실제 서버를 선택하고, 접속을 기록하는 해쉬 테이블에 새로운 접속을 추가한다. 그러고나서 부하분산서버에서 선택한 서버로 직접 패킷을 전송한다. 들어오는 패킷이 이러한 접속에 해당하고 해쉬 테이블에서 선택한 서버를 찾을 수 있으면 패킷은 다시 서버로 직접 전송된다. 서버에서 전송(포워딩)된 패킷을 받으면, 서버는 패킷에서 알리아스 인터페이스나 지역 소켓의 주소를 찾아서 요청을 처리하고 결과를 사용자에게 직접 전송한다. 접속이 해제되거나 시간을 초과하면, 해쉬 테이블에서 연결 기록을 제거한다. 작업의 흐름은 다음과 같다.
부하분산 서버는 단순히 데이터 프레임의 MAC 주소만 선택한 서버로 바꾸며 이를 다시 LAN에 재전송한다. 이런 이유 때문에 부하분산 서버와 각 서버가 단일한 물리적 세그먼트안에서 연결되어야한다. 클러스터에서 arp 문제가 생기면 the arp problem page를 참고하자.
먼저 적당한 버전의 리눅스 커널 소스를 구한다. 그러고 커널에 가상 서버 패치(version 0.9 이상)를 적용한다. 세 번째로 최소한 여기서 선택한 커널 컴파일 옵션을 선택했는지 확인한다.
커널 컴파일 옵션:
Code maturity level options ---> [*] Prompt for development and/or incomplete code/drivers Networking options ---> [*] Network firewalls ... [*] IP: forwarding/gatewaying ... [*] IP: firewalling ... [*] IP: masquerading ... [*] IP: ippfvs(LinuxDirector) masquerading (EXPERIMENTAL) Virtual server request dispatching technique--- ( ) VS-NAT ( ) VS-Tunneling (X) VS-DRouting
그리고 하나의 스케쥴링 알고리즘을 선택해야한다.
Virtual server scheduling algorithm (X) WeightedRoundRobin ( ) LeastConnection ( ) WeightedLeastConnection [ ] IP: enabling ippfvs with the local node feature
그다음 커널을 컴파일한다. 적절하게 커널이 컴파일되었다면, 시스템 커널을 업데이트하고 재부팅한다.
Kernel Compile Options:
Code maturity level options ---> [*] Prompt for development and/or incomplete code/drivers Networking options ---> [*] Network firewalls ... [*] IP: forwarding/gatewaying ... [*] IP: firewalling ... [*] IP: masquerading ... [*] IP: masquerading virtual server support (EXPERIMENTAL) (12) IP masquerading table size (the Nth power of 2) <M> IPVS: round-robin scheduling(NEW) <M> IPVS: weighted round-robin scheduling(NEW) <M> IPVS: weighted least-connection scheduling(NEW) <M> IPVS: persistent client connection scheduling(NEW)
그다음 커널을 컴파일한다. 적절하게 커널이 컴파일되었다면, 시스템 커널을 업데이트하고 재부팅한다. 마지막으로 cd 명령을 이용, ipvsadm 소스 디렉토리로 이동하여 "make install" 이라고 명령을 치면 ipvsadm 프로그램을 시스템 디렉토리에 설치한다.
터널링을 사용한 가상 서버 실험 예제
다음은 터널링을 이용 가상 서버를 실험한 예제이다. 설정은 다음과 같다. 이건 이 글을 보는 사람들에게 하나의 실마리를 주기 바란다. 부하 분산서버은 172.26.20.111 주소를 가지고 있고 실제 서버는 172.26.112이다. 가상 IP 주소는 172.26.20.110 이다. 이 예제에서 "telnet 172.26.20.110"을 하면 실제 서버에 접속할 것이다.
The load balancer (LinuxDirector), kernel 2.0.36
ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0 ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up route add -host 172.26.20.110 dev eth0:0 ippfvsadm -A -t 172.26.20.110:23 -R 172.26.20.112
The real server 1, kernel 2.0.36 (IP forwarding enabled)
ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0 ifconfig lo:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up route add -host 172.26.20.110 dev lo:0
When I am on other hosts, 'telnet 172.26.20.110' will actually connect the real server 1.
The load balancer (LinuxDirector), kernel 2.2.14
ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0 ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up route add -host 172.26.20.110 dev eth0:0 echo 1 > /proc/sys/net/ipv4/ip_forward ipvsadm -A -t 172.26.20.110:23 -s wlc ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -g
The real server 1, kernel 2.0.36 (IP forwarding enabled)
ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0 ifconfig lo:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up route add -host 172.26.20.110 dev lo:0
The load balancer (LinuxDirector), kernel 2.2.14
echo 1 > /proc/sys/net/ipv4/ip_forward ipvsadm -A -t 172.26.20.110:23 -s wlc ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -g
The real server 1, kernel 2.2.14
echo 1 > /proc/sys/net/ipv4/ip_forward ifconfig lo:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up route add -host 172.26.20.110 dev lo:0 echo 1 > /proc/sys/net/ipv4/conf/all/hidden echo 1 > /proc/sys/net/ipv4/conf/lo/hidden
VIP를 dummy와 같은 다른 디바이스의 알리아스로 설정하거나 감출 수 있다. 알리아스 인터페이스이므로, 원하는만큼 VIP를 설정할 수 있다. dummy 디바이스를 사용한 예제는 아래와 같다.
echo 1 > /proc/sys/net/ipv4/ip_forward ifconfig dummy0 up echo 1 > /proc/sys/net/ipv4/conf/all/hidden echo 1 > /proc/sys/net/ipv4/conf/dummy0/hidden ifconfig dummy0:0 172.26.20.110 up route add -host 172.26.20.110 dev dummy0:0 ifconfig dummy0:1 <Another-VIP> up ...
부하분산서버의 설정은 위 예제와 같다. 커널 2.2.x를 가지고 운영하는 리얼 서버는 다음과 같이 설정할 수 있다:
echo 1 > /proc/sys/net/ipv4/ip_forward ipchains -A input -j REDIRECT 23 -d 172.26.20.110 23 -p tcp ...
ipchains redirect 명령어를 이용, 172.26.20.110 포트 23를 향하는 TCP 프로토콜을 가진 패킷은 지역 소켓으로 재지향된다. 서비스 대몬은 반드시 모든 주소(0.0.0.0)이나 VIP 주소(여기서는 172.26.20.110)에 귀를 기울이고 있어야한다.
다이렉트 라우팅을 이용한 가상 서버에서, 실제 서버는 다른 네트웍 라우트를 이용해 클라이언테에게 결과를 보내줄수 있다. 이런 방법을 이용하면 성능향상에 좋을 것이다. 부하 분산 서버와 시제 서버는 사설 LAN을 이용해 통신할 수 있다. 설정 예제는 다음과 같다.
The load balancer (LinuxDirector), kernel 2.2.14
ifconfig eth0 <an IP address> ... ... ifconfig eth0:0 <VIP> netmask 255.255.255.255 broadcast <VIP> up route add -host <VIP> dev eth0:0 ifconfig eth1 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255 up route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1 ipvsadm -A -t <VIP>:23 ipvsadm -A -t <VIP>:23 -r 192.168.0.2 -g ...
The real server 1, kernel 2.0.36
ifconfig eth0 <a seperate IP address> ... # Follow the different network route ... ifconfig eth1 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255 up route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1 ifconfig lo:0 <VIP> netmask 255.255.255.255 broadcast <VIP> up route add -host <VIP> dev lo:0
Created on: 1999/5/1