[클러스터] Direct Routing 을 이용한 Load Balancing 서버 구성
##################################################
Direct Routing 을 이용한 Load Balancing 서버 구성
##################################################
작성 : 넷센터 홍석범
## 개요
가상 서버(Virtual Server)를 구성하는 방식은
1) NAT를 이용한 가상 서버
2) IP 터널링을 이용한 가상 서버
3) 다이렉트 라우팅(Direct Routing) 을 이용한 가상서버등이 있으나
이중 3)번 방식이 가장 성능적인 측면에서 효율적이므로 이 방식을 이용하
기로 한다.
0.필요한 서버 및 IP
L4 스위치 기능을 하는 Direct Routing 서버 1대, 2대면 더욱 좋다.
실제 서비스되는 리얼서버 2대 이상.
Direct Routing(이하 DR) 에서 사용하는 IP 1개
실제 서비스를 위한 VIP(Virtual IP-일종의 Floating IP) 1개
서버 갯수만큼의 실제 서버에서의 IP(Real IP 2개이상) 이하 총 4개. (모
두 공인IP)
1. 필요한 소프트웨어
DR : 커널 패치, eth0:0 으로 IP Aliasing 또는 eth1 로 별도 구성.
Real Server : 커널 패치, lo:0 으로 IP Aliasing
커널 패치는 아래와 같은 두가지 이유로 하게 된다.
(1) ARP Problem 을 해결하기 위해
(2) Director 에서 Round Robin등 스케쥴 방식을 설정하기 위해
2. 커널 패치 방법
http://www.linuxvirtualserver.org/software/index.html 에서
최신커널에 해당하는 패키지를 받는다.
현재의 경우 최신버전인 ipvs-0.8.1.tar.gz 를 다운로드하였다.
커널 소스 설치후 아래와 같이 패치한다.
# Director 에서 커널패치
cd /usr/src/linux
tar zxvfp ipvs-0.8.1.tar.gz
cat ipvs-0.8.1/linux_kernel_ksyms_c.diff | patch -p1
cat ipvs-0.8.1/linux_net_Makefile.diff | patch -p1
cat ipvs-0.8.1/linux_net_ipv4_Config_in.diff | patch -p1
cat ipvs-0.8.1/linux_ip_fw_compat_c.diff | patch -p1
cp -rp ipvs-0.8.1/ipvs net/ipv4
mv net/ipv4/ipvs/linux_net_ipv4_ipvs_Makefile net/ipv4/ipvs/Makefile
make menuconfig 로 커널 패치 설정
Networking options —> IP: Virtual Server Configuration —>
<*> virtual server support (EXPERIMENTAL)
[*] IP virtual server debugging
(12) IPVS connection table size (the Nth power of 2)
— IPVS scheduler
<*> round-robin scheduling
<*> weighted round-robin scheduling
<*> least-connection scheduling scheduling
<*> weighted least-connection scheduling
<*> locality-based least-connection scheduling
<*> locality-based least-connection with replication scheduling
<*> destination hashing scheduling
<*> source hashing scheduling
— IPVS application helper
<*> FTP protocol helper (NEW)
# Real Server 에서 커널패치
http://www.linuxvirtualserver.org/~julian/hidden-2.4.5-1.diff 에서 다
운
mv hidden-2.4.5-1.diff /usr/src/linux/
cd /usr/src/linux
patch -p1 < hidden-2.4.5-1.diff
## ipvsadm 설치 (Director에서만 설치한다.)
http://www.rpmfind.net/ 에서 ipvsadm 으로 검색하여 다운로드 후
설치
Virtual Server 커널 패치가 되어야만이 ipvsadm 이 정상적으로 작동하며
vs 패치 여부에 대한 확인은 sysctl -a|grep .vs. 로 확인 가능하다.
Director Server IP 211.47.65.1
Virtual IP 211.47.65.2
Real Server1 IP 211.47.65.3
Real Server2 IP 211.47.65.4
이중 실제 서비스되는 IP 는 VIP 인 211.47.65.2 이고 아래와 같이 IP 를
설정한다.
## DR 설치
ifconfig eth0 211.47.65.1 netmask 255.255.255.0
route add -net 211.47.65.0 netmask 255.255.255.0 dev eth0
ifconfig eth0:0 211.47.65.2 netmask 255.255.255.255 broadcast
211.47.65.2 up
route add -host 211.47.65.2 dev eth0:0
echo 1 > /proc/sys/net/ipvs/ip_forward
ipvsadm -A -t 211.47.65.2:80 -s wlc
ipvsadm -a -t 211.47.65.2:80 -r 211.47.65.3 -g
ipvsadm -a -t 211.47.65.2:80 -r 211.47.65.4 -g
위에서 ipvsadm에 대한 명령어에 대한 설명이다.
-A : 서비스를 추가 한다. (add-service로서 하나의 새로운 설정을 시작)
-s : 스케줄러 방식을 선택 (wlc : weight least connection scheduling)
-a : add server의 약자 ( -e : Edit , -d : Delete )
-t : TCP service를 추가( -u : UDP , -f : Firewall )
-r : 옵션 다음에 Real Server(실제로 서비스할 서버)의 IP를 적는다.
-g : Direct Routing 방식( -i : ip tunneling 방식 )
-g w 1 와 같이 가중치 설정이 가능하다.
ipvsadm -a -t 211.47.65.2:80 -r 211.47.65.3 -w 1 -g 나
ipvsadm -a -t 211.47.65.2:80 -r 211.47.65.3 -g 나 동일한 방법이다.
## 스케쥴러 방식에 대해 .
rr (round robin) 그냥 순서대로 돌린다.
wrr (weight round robin) 서버의 용량에 따라 가중치를 둔다.
연결된 커넥션 수는 신경쓰지 않는다.
lc (least connection) 현재 서버상태에서 가장 커넥션 수가 적은 것을 우
선 서비스 한다.
wlc ( weight least connection) 위에 이야기 한 대로 설정시 가중치를 부
여할 수 있다.
이 설정을 마치고 ipvsadm 명령을 실행하면 다음과 같이 나온다.
IP Virtual Server version 0.8.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 211.47.65.2:www wlc
-> 211.47.65.3:www Route 1 0 0
-> 211.47.65.4:www Route 1 0 0
## Real Server(1) 에서의 설정
ifconfig eth0 211.47.65.3 netmask 255.255.255.0
route add -net 211.47.65.0 dev eth0
ifconfig lo:0 211.47.65.2 netmask 255.255.255.255 broadcast
211.47.65.2 up
route add -host 211.47.65.2 dev lo:0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/lo/hidden
## Real Server(2) 에서의 설정
ifconfig eth0 211.47.65.4 netmask 255.255.255.0
route add -net 211.47.65.0 dev eth0
ifconfig lo:0 211.47.65.2 netmask 255.255.255.255 broadcast
211.47.65.2 up
route add -host 211.47.65.2 dev lo:0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/lo/hidden
## ARP Problem 에 대해
clinet
|
|
GateWay
|
|
Director –|
|
|
—————–
| |
| |
Real Server1 Real Server2
어디에서 ARP Problem 이 생기는가?
1) client 의 요청을 받은 GateWay가 request 를 처리하기 위해
arp broadcasting 시 Real Server는 응답하지 않고 DR만이 응답해야 한
다.
2) Real Server 가 포워딩받은 요청에 대해 응답시에는 Source IP 가 VIP
가 되는데,
VIP가 아닌 RIP 이어야 한다.
–> GW에서는 VIP 에 대한 MAC 주소를 DR에 대한 주소로 기억하여야 하는
데,
만약 RealServer 에서 소스 IP가 VIP 일 경우에는 문제가 생기게 된다.
Kernel 2.0.x 에서는 ifconfig eth0:0 192.168.1.2 -arp up 을 이용하여
apr 요청에
응답하지 않도록 할 수 있으나 2.2 나 2.4 에서는 이것이 없어져 결국 커
널패치를
하여야 한다.
이를 위해 라우터에서 Static 하게 VIP 의 MAC 주소를 설정해 줄 수 있
다.
예) arp -s 211.47.65.2 00:00:03:BF:ER:04
또는 Director 와 Real Server 모두 2개의 NIC 를 설치하여 다른 IP 대역
으로 설치해도 된다.
Real Server 에서 arp patch 를 위해
http://www.linuxvirtualserver.org/~julian/
에서 패치를 한다.
그리고
#!/usr/bin/perl
while (1){
sleep 600;
system “/root/clutser/arp/arp.sh”;
}
exit;
파일을 백그라운드로 실행하여 무한루프로 돌리고
/root/cluster/arp/arp.sh 에
/usr/sbin/send_arp -i eth0 211.47.65.2 00508B9A1B1B 211.47.65.255
ffffffffffff 를 설정하여 arp cache 를 refresh 할 수도 있다.
## DR 에서 자동 스크립트 설정하기.
(1) 부팅시 자동 실행 스크립트
Director 에서 lvs stop 을 하면 Load Balancing 설정이 멈추게 되고
lvs start 를 하면 Load Balancing 설정이 시작된다.
/etc/rc.d/rc3.d/S50lvs 를 생성후 /etc/rc.d/init.d/lvs 로 링크함.
/etc/rc.d/init.d/lvs 파일
#!/bin/sh
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
IPVSADM=/sbin/ipvsadm
case “$1” in
start)
if [ -x $IPVSADM ]
then
ifconfig eth0:0 211.47.65.2 netmask 255.255.255.255 broadcast
211.47.65.2 up
route add -host 211.47.65.2 dev eth0:0
sysctl -w net.ipv4.ip_forward=1
$IPVSADM -A -t 211.47.65.2:80
$IPVSADM -a -t 211.47.65.2:80 -r 211.47.65.3 -w 1 -g
$IPVSADM -a -t 211.47.65.2:80 -r 211.47.65.4 -w 1 -g
fi
;;
stop)
if [ -x $IPVSADM ]
then
$IPVSADM -C
fi
;;
*)
echo “Usage: lvs {start|stop}”
exit 1
esac
exit 0
(2) lvs_check cgi 설정하기
/root/cluster/check.cgi & 를 실행하면 지속적으로 Real Server 에 대한
모니터링후 만약 특정 Real Server 가 다운을 발견하였을 때에는 다운된
서버는 자동으로 라우팅 테이블에서 제외하여 다운된 서버로는 접속이 가
지 않도록 한다.
## /root/cluster/lvs_check.cgi
#!/usr/bin/perl
#####################################################
# #
# Script for Load Balancing Server by Hong sukbum #
# antihong at tt.co.kr #
#####################################################
require “require.cgi”;
while(1){
$real_http1 = `./http.monitor -p 80 $real_server1 2>&1`;
$real_http2 = `./http.monitor -p 80 $real_server2 2>&1`;
if(($real_http1 =~ /OK/) && ($real_http2 =~ /OK/)) {
}
else{
$real_ping1 = `./ping.monitor $real_server1 2>&1`;
$real_ping2 = `./ping.monitor $real_server2 2>&1`;
if($real_ping1 !~ /alive/){
&real_server1_down;
}
if($real_ping2 !~ /alive/){
&real_server2_down;
}
else{
}
}
sub real_server1_down {
system “/sbin/ipvsadm -d -t $direct_server:80 -r $real_server1”;
open(MAIL, “|$MAIL_PROGRAM -t”);
print MAIL “To: $TO_MAIL \\n”;
print MAIL “Subject: $real_server1 is down!!! \\n”;
print MAIL “Content-type: text/html\\n\\n”;
print MAIL “<p><font face=\\”Times New Roman\\”>\\n”;
print MAIL “<b> $real_server1 에 ping 이 되지 않습니다.</b><p>\\n”;
print MAIL “<b>## $real_server1 Server의 다운여부를 확인하세
요.</b><p>\\n”;
print MAIL “<b>## $real_server1 이 Virtual Server 에서 제외되었습니
다.</b><br>\\n”;
close(MAIL);
}
sub real_server2_down {
system “/sbin/ipvsadm -d -t $direct_server:80 -r $real_server2”;
open(MAIL, “|$MAIL_PROGRAM -t”);
print MAIL “To: $TO_MAIL \\n”;
print MAIL “Subject: $real_server2 is down!!! \\n”;
print MAIL “Content-type: text/html\\n\\n”;
print MAIL “<p><font face=\\”Times New Roman\\”>\\n”;
print MAIL “<b> $real_server2 에 ping 이 되지 않습니다.</b><p>\\n”;
print MAIL “<b>## $real_server2 Server의 다운여부를 확인하세
요.</b><p>\\n”;
print MAIL “<b>## $real_server2 이 Virtual Server 에서 제외되었습니
다.</b><br>\\n”;
close(MAIL);
}
}
3) require.cgi 설정하기
## /root/cluster/require.cgi
#!/usr/bin/perl
$TO_MAIL = ‘antihong at tt.co.kr’;
# Real Server가 다운시 담당자에게 메일이 발송된다.
$MAIL_PROGRAM = “/usr/sbin/sendmail”;
# sendmail 의 경로
$direct_server =”211.47.65.2″;
# Real-Server1 Server 의 IP
$real_server1 =”211.47.65.3″;
# Real-Server1 Server 의 IP
$real_server2 =”211.47.65.4″;
# Real-Server2 Server 의 IP
#### 마치면서
(1) 만약 Director Server 가 다운된다면 어떻게 대처할 것인가?
해결책) Director 를 Mirroring 으로 설정하여 운영한다.
해결책) DR 의 역할을 Real_Server1 에서 받아오도록 하는 방법도 있다.
(2) 모든 Real Server 가 다운된다면 어떻게 대처할 것인가?
해결책) 모든 Real Server 가 다운된다면 Director 가 웹서비스도 대신하
도록
할 수 있지만 성능적인 측면에서 별로 효과적이지 않다.
(3) 현재는 웹에 대해서만 감시하도록 되어 있으나 다른 감시도 할 수 있
다.
(4) Director 에 또는 Real Server 에 이더넷 카드를 두장 설치하여 운영
하는 것이
더욱 효과적이다.
(5) 만약 Real_Sever 가 다운시 DR 에서 라우팅 테이블이 삭제된 후 추가
는
수작업으로 하여야 한다. 물론 자동으로 할 수도 있다.
(6) 만약 상품으로 한다면 몇 가지 부가 기능을 더 추가할 수 있으나
실용적인 면에서는 그리 필요하지 않다고 보아 추가하지 않았다.
주의] 만약 특정 Real Server가 다운된 후 복구하여 Load Balancing 에 추
가하려면 수작업으로 추가하여야 하며(lvs start만 하면 된다.) 아울러
Director 에서는 arp 를 Refresh 하여야 한다.(/root/cluster/arp/arp.sh
를 실행하면 된다.)
참고문서 : http://www.linuxvirtualserver.org/Joseph.Mack/HOWTO/LVS-
HOWTO.html
http://kldp.org/Translations/html/Virtual_Server-KLDP/index.htm
http://linux.clusterkorea.org/