LVS_MON
1. 시스템을 로드발란서로 세팅하기
이번 항목은 조금 길것 같습니다.
지금까지 한것을 다시한번 요약하구요 그 다음 실제 가동을 위한 스크립트를 생성 할 것입니다.
실제로 작동 되는것 까지 확인 하셨으면 그 다음엔 실제 업무에 사용할 수 있나 확인 해 보아야 겠지요.
자 우선 ipvsadm 을 마음대로 제어할 수 있게 lvs.alert 라는 파일을 만듭니다.
/usr/local/mon/alert.d/lvs.alert 의 내용
소스코드:
#!/usr/bin/perl
#
# lvs.alert – Linux Virtual Server alert for mon
#
# It can be activated by mon to remove a real server when the
# service is down, or add the server when the service is up.
#
#
use Getopt::Std;
getopts (“s:g:h:t:l:P:V:R:W:F:u”);
$ipvsadm = “/sbin/ipvsadm”;
$protocol = $opt_P;
$virtual_service = $opt_V;
$remote = $opt_R;
if ($opt_u) {
$weight = $opt_W;
if ($opt_F eq “nat”) {
$forwarding = “-m”;
} elsif ($opt_F eq “tun”) {
$forwarding = “-i”;
} else {
$forwarding = “-g”;
}
if ($protocol eq “tcp”) {
system(“$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding”);
} else {
system(“$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding”);
}
} else {
if ($protocol eq “tcp”) {
system(“$ipvsadm -d -t $virtual_service -r $remote”);
} else {
system(“$ipvsadm -d -u $virtual_service -r $remote”);
}
};
위의 스크립트는 www.linuxvirtualserver.org 에 있는 스크립트 입니다. 그런데 쓰고 보니 이 스크립트를 바로 사용하기에는 문제가 있더군요.
제 경우엔 alert 와 upalert 의 구분이 모호 해지는 현상이 있었습니다.
그래서 아래처럼 바꿨습니다. 윗 부분만 고쳐서 아래의 udp 부분은 그냥 두었네요..udp 를 사용하시려면 윗 부분에서 프로토콜 체크를 한번 더 하셔야 합니다.
소스코드:
#!/usr/bin/perl
#
# lvs.alert – Linux Virtual Server alert for mon
#
# It can be activated by mon to remove a real server when the
# service is down, or add the server when the service is up.
#
#
use Getopt::Std;
getopts (“s:g:h:t:l:P:V:R:W:F:X:u”);
$ipvsadm = “/sbin/ipvsadm”;
$protocol = $opt_P;
$virtual_service = $opt_V;
$remote = $opt_R;
$status = $opt_X;
if ($status eq “down”){
# <“udp 를 사용 하시려면 이 부분에 프로토콜 체크를 한번 더 하셔야 합니다.”>
system(“$ipvsadm -d -t $virtual_service -r $remote”);
exit 0;
}
else {
$weight = $opt_W;
if ($opt_F eq “nat”) {
$forwarding = “-m”;
}
elsif ($opt_F eq “tun”) {
$forwarding = “-i”;
}
else {
$forwarding = “-g”;
}
if ($protocol eq “tcp”) {
system(“$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding”);
exit 0;
}
else {
system(“$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding”);
exit 0;
}
exit 0;
};
보시는 바와 같이 -X 라는 옵션을 하나 추가하여 시각적으로 명확히 구분되게 하였습니다.
이 파일을 mon 이 설치된 디렉토리 (여기서는 /usr/local/mon 입니다.)의 alert.d 디렉토리에 생성 합니다. 그리고 퍼미션은 755로 놓습니다.
그리고 /etc/mon/mon.cf 파일을 아래와 같이 수정 합니다. 여기서는 ping 으로 서버의 생존유무를 파악하지 않고 웹서버의 포트를 이용한 생존여부를 파악하겠습니다.
실제로 네트웍이 끊어져도 arp 의 캐쉬때문인지 http의 접속을 계속 확인하고 있는 경우가 있었습니다.
/etc/mon/mon.cf 파일의 내용
소스코드:
cfbasedir = /etc/mon
alertdir = /usr/local/mon/alert.d
mondir = /usr/local/mon/mon.d
maxprocs = 20
histlength = 100
randstart = 30s
authtype = getpwnam
#
# group definitions (hostnames or IP addresses)
#
hostgroup node_1st 123.123.123.3
hostgroup node_2st 123.123.123.4
hostgroup node_3st 123.123.123.5
#
# Web server 1
#
watch node_1st
service http
interval 5s
monitor http.monitor
period wd {Sun-Sat}
alert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.3 -W 1 -F dr -X down
upalert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.3 -W 1 -F dr
#
#web3 Server 2
#
watch node_2st
service http
interval 3s
monitor http.monitor
period wd {Sun-Sat}
alert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.4 -W 1 -F dr -X down
upalert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.4 -W 1 -F dr
#
#web4 Server 3
#
watch node_3st
service http
interval 3s
monitor http.monitor
period wd {Sun-Sat}
alert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.5 -W 1 -F dr -X down
upalert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.5 -W 1 -F dr
위의 예처럼 호스트그룹과 호스트그룹의 선언 사이는 반드시 한줄 이상 띄워 주셔야 합니다.
그렇지 않을 경우 매우 황당한 상황을 맞이하게 됩니다. 맨 마지막에 있는 시스템이 리얼노드에서 탈퇴를 하고말죠.
이것은 mon 의 제작자의 메뉴얼에 있는 내용으로서 반드시 강조를 하고 있는 부분입니다. 일어나는 문제는 아래와 같습니다.
서버의 커넥션을 확인하는 데몬이 입력값을 두개를 받게 되어, 있지도 않은 서버의 상태를 조사하게 됩니다. 궁금하시면 호스트그룹의 입력을 다닥다닥 예쁘게 왼쪽졍렬로 붙여서 입력 해 보세요.^^
여기까지 되셨으면 이제는 이 데몬들을 전부 한번에 실행 할 수 있는 init 파일을 한개 맹글어야겠지여.. 그럼 아래에 맹글어 보겠습니다.
—-/etc/rc.d/init.d/punk.init 파일 내용(파일 이름은 아무래도 상관 없습니다.)
소스코드:
#!/bin/sh
#
# load balancer daemon scripts
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
IPVSADM=/sbin/ipvsadm
MON=/usr/local/mon/mon
RETVAL=0
#Source function library.
. /etc/rc.d/init.d/functions
case “” in
start)
if [ -x $IPVSADM ]
then
echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig eth0:0 123.123.123.1 netmask 255.255.255.255 broadcast 123.123.123.1 up
route add -host 123.123.123.1 dev eth0:0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden
$IPVSADM -A -t 123.123.123.1:80 -s wlc
$IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.3 -g -w 1
$IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.4 -g -w 1
$IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.5 -g -w 1
echo -n “started loadbalancer daemon:”
daemon $MON -f -c /etc/mon/mon.cf
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/punk
echo
fi
;;
stop)
if [ -x $IPVSADM ]
then
echo -n “punk daemon stopping…”
$IPVSADM -C
ifconfig eth0:0 down
killproc mon
rm -f /var/lock/subsys/punk
killall http.monitor
echo -n “punk daemon killed”
echo
fi
;;
*)
echo “Usage : punk {start|stop}”
exit 1
esac
exit 0
다 하셨으면 역시 퍼미션은 755로 변환 해 주시구요…
자..이제 정리하고 가동해보는 일만 남았군요.
짧게 정리해 보겠습니다. 시스템 설정 및 구동 순서 입니다.
1. 시스템을 적게는 2대, 많게는 4대 정도를 준비한다.
2. 각 시스템에 ip를 할당하고 웹서버를 설치하고 실행한다.
실제로 일어나는 변화를 확실히 하기위하여 웹서버에서 KeepAlive 를 off 로 설정하고 MaxKeepAliveRequest 값을 1로 변환한다.
인터넷 익스플로러의 도구->인터넷옵션->임시 인터넷파일->페이지를 열때마다로 체크해 놓는다.
시각적으로 구분하기 위하여 각 노드들마다 인덱스 페이지를 틀리게 한다.
3. 마스터 서버에 mon 을 설치한다.
4. 마스터 노드에 ipvsadm 을 설치할 수 있는 커널을 설치하고 필요시 컴파일한다.
5. mon의 설정화일을 편집하고 전체 프로그램을 가동시키고 종료시킬 init 데몬 스크립트를 만든다.
6. 마스터를 제외한 서버들에 arp 캐쉬를 감추고 lo:0 디바이스에다가 VIP 를 추가한다.
7. 마스터 서버를 구동한다.
8. 잘 된다.
..이상 입니다.
마스터 서버의 캐쉬를 감추고 이더넷을 추가하는 스크립트는 init 스크립트에 들어 있습니다. 그럼 마스터 서버를 가동해 보도록 하겠습니다.
/etc/rc.d/init.d/punk start
그리고 익스플로러로 123.123.123.1 로 접속해 봅니다. 할당된 도메인이 있다면 더더욱 좋습니다. 되셨나요..? 축하드립니다. 아시겠지만 여기는 마스터 노드의 웹 서버에 대한 내용은 나와있지 않습니다. 그것은 마스터 서버가 받을 부하를 위하여 그런건데요…
만약을 위하여 마스터 노드는 많은 여유을 가지고 있어야 하기 때문입니다. 마스터가 죽으면 죽도밥도 안되니까요…
그렇지만 마스터 노드도 웹서비스를 함께 하실 원하신다면 그냥 웹서버 띄우고 ipvsadm 에 한줄 더 추가해 주시면 그냥 됩니다.
흔히 말하는 두대짜리 active-active 서버가 한개는 마스터겸 웹서버고 한대는 백업겸 웹서버랍니다. 나중에 heartbeat 할때 해보겠습니다.