2009.02.02 09:43

Direct Routing을 통한 LVS(Linux Virtual Server) 구현

따라하기 참고주소: http://kldp.org/KoreanDoc/html/Virtual_Server-KLDP/Virtual_Server-KLDP.html
따라하기 참고주소: http://www.linuxvirtualserver.org/VS-IPTunneling.html
소프트웨어 다운로드: http://www.linuxvirtualserver.org/software/ipvs.html

가상 ip: 192.168.0.5
Load Balancer 1대: 192.168.0.6
Real Server 2대: 192.168.0.7~8

참고: ipvs 는 커널 2.6에 포함되어 있으므로 기존 ipvs 패치 모듈을 따로 설치하지 않아도 된다!!!!

admin tool 다운로드:
# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

# tar xvfz ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
# make
# make install

커널 옵션 설정(load balancer 만)
------------------------------------
cd /usr/src/linux
make menuconfig

Networking --->
  Networking options  --->
    IP: Virtual Server Configuration  --->
<*> IP virtual server support (EXPERIMENTAL)
  x x[ ]   IP virtual server debugging      
  x x(12)  IPVS connection table size (the Nth power of 2) (NEW)
  x x---   IPVS transport protocol load balancing support
  x x[*]   TCP load balancing support                   
  x x[ ]   UDP load balancing support (NEW)             
  x x[ ]   ESP load balancing support (NEW)             
  x x[ ]   AH load balancing support (NEW)              
  x x---   IPVS scheduler                               
  x x<*>   round-robin scheduling                       
  x x<*>   weighted round-robin scheduling              
  x x<*>   least-connection scheduling                  
  x x< >   weighted least-connection scheduling (NEW)   
  x x< >   locality-based least-connection scheduling (NEW)
  x x< >   locality-based least-connection with replication scheduling (NE
  x x< >   destination hashing scheduling (NEW)           
  x x< >   source hashing scheduling (NEW)                
  x x< >   shortest expected delay scheduling (NEW)       
  x x< >   never queue scheduling (NEW)                   
  x x---   IPVS application helper                        
  x x< >   FTP protocol helper (NEW)   

make; make install


1) Load Balancer 서버에서 가상 ip 설정하기
----------------------------------------------
ifconfig eth0:0 192.168.0.5 netmask 255.255.255.255 broadcast 192.168.0.5 dev eth0
route add -host 192.168.0.5 dev eth0:0

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0E:0C:4F:36:AD
          inet addr:192.168.0.6  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:9000  Metric:1
          RX packets:694 errors:0 dropped:0 overruns:0 frame:0
          TX packets:444 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:457783 (447.0 Kb)  TX bytes:43447 (42.4 Kb)
          Base address:0x7440 Memory:fc220000-fc240000

eth0:0    Link encap:Ethernet  HWaddr 00:0E:0C:4F:36:AD
          inet addr:192.168.0.5  Bcast:192.168.0.5  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:9000  Metric:1
          Base address:0x7440 Memory:fc220000-fc240000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.0.5     0.0.0.0         255.255.255.255 UH        0 0          0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U         0 0          0 lo
0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth0


tcp 25번 서비스 추가, 스케쥴링은 round-robin 방식
# ipvsadm -A -t 192.168.0.5:25 -s rr

real server 추가, gateway 방식 사용
#  ipvsadm -a -t 192.168.0.5:25 -r 192.168.0.7 -g
#  ipvsadm -a -t 192.168.0.5:25 -r 192.168.0.8 -g
(load balancer를 real server로 활용하려면... ipvsadm -a -t 192.168.0.5:25 -r 127.0.0.1 -g )

참고: man ipvsadm
       [packet-forwarding-method]
              -g,  --gatewaying   Use gatewaying (direct routing). This is the default.
              -i, --ipip  Use ipip encapsulation (tunneling).
              -m, --masquerading  Use masquerading  (network  access  translation, or NAT).

등록된 서비스 확인하기
# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.5:smtp rr
  -> 192.168.0.8:smtp             Route   1      0          3
  -> 192.168.0.7:smtp             Route   1      0          3

 

2) Real Server ip 설정하기(7, 8번 장비에서)
-----------------------------------------------
# ifconfig lo:0 192.168.0.5 netmask 255.255.255.255 broadcast 192.168.0.5 up
# route add -host 192.168.0.5 dev lo:0


# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:04:23:C4:A8:02
          inet addr:192.168.0.7  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2215 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1891 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2891980 (2.7 Mb)  TX bytes:146520 (143.0 Kb)
          Base address:0xec80 Memory:febe0000-fec00000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:24 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1401 (1.3 Kb)  TX bytes:1401 (1.3 Kb)

lo:0      Link encap:Local Loopback
          inet addr:192.168.0.5  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1


# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.0.5     0.0.0.0         255.255.255.255 UH        0 0          0 lo
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U         0 0          0 lo
0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth0


3) 테스트
-------------
telnet 192.168.0.5 25 하면
7번 및 8번 장비의 smtp 데몬이 차례로 응답을 하게 된다.


부가설명: http://www.linuxvirtualserver.org/how.html
virtual server(이하 가상서버)는 3가지 방식으로 구현된다.
1) NAT를 이용한 가상서버
   TCP/IP 프로토콜을 지원하는 어떤 서버든 적용가능하지만, 시스템의 병목현상으로 10여대 정도가 적당하다.
2) IP 터널링을 이용한 가상서버
3) Direct Routing을 이용한 가상서버
   IP 터널링을 이용한 가상서버와 마찬가지로 가상서버의 확장성을 증가시켜 주지만, 동일 물리적 segment안에 load balancer와 real server가 같이 있어야 한다.
   위의 가이드는 Direct Routing을 이용한 가상서버 셋팅이다. 


참고, ktcpvs 툴 다운로드 및 설치: 어플리케이션 레벨의 load balancing 구현
svn co http://svn.linuxvirtualserver.org/repos/ktcpvs/trunk/ ktcpvs

참고, tcpsp: tcp splicing 구현
svn co http://svn.linuxvirtualserver.org/repos/tcpsp/trunk/ tcpsp

http://blog.naver.com/hackies?Redirect=Log&logNo=20013591898
오래된 다운로드 주소: http://tunelinux.pe.kr/clustering/lvs/software/

참고, NAT 이용한 LVS 구성: http://kldp.org/node/20158



회사에서 Load Balancing을 하기위해 LVS를 구축해봤습니다.

저는 그냥 Round Robin으로 구축했습니다만, 부하 분산 알고리즘은 여러가지가 있으니 그중에 하나만 선택하시면 될것 같습니다.

 

인터넷에서 찾아보니 LVS/NAT라는 방식이 제일 간단하고 쉽다고 나와있는데 제가 해본봐로는 절대 쉬운방법이 아니었습니다.

쉬운 방법이 맞을 순 있는데, 인터넷상의 자료들이 꼭 한두개를 빼먹은것 같더군요.

또한 다들 옛날 버전만 있어서 명령어도 약간씩 안맞습니다.

그리고 LVS/DR이라는 방법이 많은 수의 서버도 커버할 수 있으니 좋은 방법입니다.

 

제가 한 방법을 설명드리지요..

우선 커널은 2.4.23-8버전을 이용했습니다.

커널 컴파일시 다음의 옵션은 꼭 체크해주세요.

 

Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers

Networking options --->
    [*] Network packet filtering (replaces ipchains)
    [ ]   Network packet filtering debugging
    ...
      IP: Netfilter Configuration  --->
      IP: Virtual Server Configuration  --->
<M> virtual server support (EXPERIMENTAL)
[*]   IP virtual server debugging
(12)   IPVS connection table size (the Nth power of 2)
--- IPVS scheduler
<M>   round-robin scheduling
<M>   weighted round-robin scheduling
<M>   least-connection scheduling scheduling
<M>   weighted least-connection scheduling
<M>   locality-based least-connection scheduling
<M>   locality-based least-connection with replication scheduling
<M>   destination hashing scheduling
<M>   source hashing scheduling
--- IPVS application helper
<M>   FTP protocol helper

그리고 커널 컴파일을 해서 새로운 커널로 부팅하세요.

 

http://www.linuxvirtualserver.org/software/ipvs.html

이곳에서 ipvsadm을 다운 받으세요.

요놈이 로드 분산을 control하는 놈입니다. 실 서비스에 넣었다 뺏다를 조절한다든지 로드 분산 알고리즘을 고를 수 있게 하는 놈입니다.

하여간. 위 링크에서 ipvsadm-1.21-10.src.rpm (for 1.0.4 or later) - October 27, 2004 를 다운받으세요. 아니면 http://www.linuxvirtualserver.org/software/kernel-2.4/ipvsadm-1.21-10.src.rpm 에서 직접 받으시던지.

 

아무튼 이놈을 받아서 rpm -ivh ipvsadm-1.21-10.src.rpm 를 실행시키세요.

그럼 /usr/src/redhat/SOURCES/밑에 ipvsadm-1.21.tar.gz파일이 보이죠?

이걸 압축푸세요. 그럼 ipvsadm-1.21디렉토리가 생성되고 ipvsamd-1.21디렉토리로 들어가세요

README파일을 열어서 보시면 내용이 나와있습니다.

 

//-- 1차수정

cd /usr/include

mv asm asm.old

mv linux linux.old

ln -s /usr/src/linux/include/asm-i386 asm

ln -s /usr/src/linux/include/asm-generic asm-generic

ln -s /usr/src/linux/include/linux linux

mv net net.old

ln -s /usr/src/linux/include/net net

 

여기까지 무엇을 한것이냐하면, 기존 커널에서 새로운 커널로 업그레이드 되면서 include파일안에 새로운 파일들이 추가가 된것을 링크를 걸어준것입니다.

따라서 /usr/src/linux 까지는 여러분이 다운받으신 새로운 커널의 패스입니다.

그 다음부터는 아래를 따라하시면 됩니다.

//-- 1차수정 끝

 

간단히 명령어만 서술한다면

/usr/src/redhat/SOURCES/ipvsadm-1.21/에서

make

make install

이렇게만 하면 ipvsadm파일이 생성되서 /sbin 디렉토리에 들어가 있습니다.

 

자. 이제 준비는 거의 끝난것 같군요..

ip정의를 다음과 같다고 합시다.

Balancer(로드를 분산해 주는놈)

  실제 IP : 192.168.0.20

  서비스용 IP : 192.168.0.50 (이건 아래서 설정하는게 나옵니다.)

실제 서비스할 서버들

  실제 서버1 IP : 192.168.0.100

  실제 서버2 IP : 192.168.0.101

이렇다고 가정합시다. (여기서는 사설 IP를 썻지만 실제 서비스 상황에 맞는 IP로만 바꿔주시면 됩니다.)

 

우선 Balancer에서 ifconfig를 해보세요.

eth0      Link encap:Ethernet  HWaddr 00:C0:XX:EA:71:EC
          inet addr:192.168.0.20  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2327 errors:0 dropped:0 overruns:0 frame:0
          TX packets:192 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:173161 (169.1 Kb)  TX bytes:23786 (23.2 Kb)
          Interrupt:12 Base address:0xd000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:700 (700.0 b)  TX bytes:700 (700.0 b)

이런식으로 나오겠죠?

이제 eth0에 서비스용 가상 ip를 매핑합니다.

ifconfig eth0:0 192.168.0.50  이렇게 명령을 치고 ifconfig를 해보면

eth0      Link encap:Ethernet  HWaddr 00:C0:26:EA:71:EC
          inet addr:192.168.0.20  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2703 errors:0 dropped:0 overruns:0 frame:0
          TX packets:311 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:206594 (201.7 Kb)  TX bytes:35052 (34.2 Kb)
          Interrupt:12 Base address:0xd000

eth0:0    Link encap:Ethernet  HWaddr 00:C0:26:EA:71:EC
          inet addr:192.168.0.50  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2703 errors:0 dropped:0 overruns:0 frame:0
          TX packets:312 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:206594 (201.7 Kb)  TX bytes:35390 (34.5 Kb)
          Interrupt:12 Base address:0xd000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:700 (700.0 b)  TX bytes:700 (700.0 b)

이렇게 나오죠? 그럼 eth0에 2개의 ip가 매핑이 된겁니다.

즉 eth0장치는 192.168.0.20, 192.168.0.50의 2개의 ip가 매핑이 되었습니다.

 

이제 ipvsadm를 설정하겠습니다.

balancer에서 다음 명령을 입력하세요.

echo 1 > /proc/sys/net/ipv4/ip_forward

ipvsadm -A -t 192.168.0.50:80 -s wlc

ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.100:80 -g

ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.101:80 -g

echo부분은 ipvsadm를 하기위한 커널 설정부분이며

ipvsamd -A -t 192.168.0.50:80... 부분은 Load Balancer에 192.168.0.50서버의 80번 포트로 들어오는 서비스를 Load Balance를 하겠다는 걸 설정한겁니다.

그리고 wlc는 Load Balance 알고리즘을 least connection(적은 수의 서비스를 하는 놈에게 우선 배당)알고리즘으로 한다는 것이고 wrr로 하면 Load Balance알고리즘을 Round Robin(그냥 평등하게 한번씩만 서비스를 분배)알고리즘으로 하겠다는 겁니다.

각각의 서비스에 맞는걸 골라 쓰시면 됩니다.

그리고 밑에 2개는 192.168.0.50:80 으로 들어오는 요청을 192.168.0.100:80과 192.168.0.101:80번의 2대의 서버가 나누어서 처리를 하겠다는 겁니다.

 

이제 Balancer쪽은 모두다 된것 같군요.

이제 실제 서비스를 하는 쪽을 설정을 할 차례입니다.

실제 서비스를 할 서버들은 hidden patch라는걸 해야 합니다.

뭐 복잡하건 아니니 찾아서 해보세요.
 

실제 서비스할 서버들에서 다음명령들을 입력합니다.

echo 1 > /proc/sys/net/ipv4/conf/lo/hidden
echo 1 > /proc/sys/net/ipv4/conf/default/hidden
echo 1 > /proc/sys/net/ipv4/conf/all/hidden

복잡한 설명이 필요하니 그냥 한다고만 생각하세요.

그리고 이렇게 할경우 매번 부팅 될때마다 최기화 되어버리니 다음과 같이 해주면

재부팅 되도 위의 값이 그대로 적용됩니다.

/etc/sysctl.conf 수정

net.ipv4.conf.all.hidden = 1
net.ipv4.conf.lo.hidden = 1
net.ipv4.conf.default.hidden = 1

이제 실서비스할 서버에서 남은 명령은 다음것 한개 뿐입니다.

 

/sbin/ifconfig lo:0 192.168.0.50 netmask 255.255.255.255 up

이렇게 하면 이제 http://192.168.0.50을 치면 그에 대한 응답은 192.168.0.100, 192.168.0.101 2개의 서버가 응답을 해줍니다.

/sbin/ifconfig lo:0 192.168.0.50 netmask 255.255.255.255 up 이것도 /etc/rc.d/rc.local 파일에 등록을 해주면 서버가 다시 시작하면서 자동으로 서비스에 붙게 됩니다.

이것으로 LVS설정 끝..

 

다음에는 hidden patch와 Heart Beat를 프로그램 소스로 올려보도록 하겠습니다. ^^;

Heart Beat란 서버 3대로 서비스를 하다가 한개가 죽으면 죽은 놈에겐 요청을 하지 않도록

Load Balancer의 설정을 변경해야겠죠? 이런건 Heart Beat라고 합니다.

심장이 뛰는지 안뛰는지 감시하는거죠.. ( 죽은 서버에게 일시키면 너무 잔인하잖아요... )



LVS 모니터링은 아래와 같이...

- watch -n 1 '/sbin/ipvsadm -l --rate'

- watch -n 1 '/sbin/ipvsadm --list'


Trackback 0 Comment 0