준비운동 하기

이번 문서는 전에 작성했던 '기본적인 로드 밸런싱'에 이어지는 문서이다. 이 문서를 읽기전에 전 문서를 읽어보기 바란다. 여기서는 참고로 전에 만들었던 클러스터보다 좀더 똑똑한(?) 클러스터를 만들어 볼 것이다. 만일 real node 중에 한 녀석이 죽었을 경우, 그 녀석은 제외하고, 그 다음 real node 에 로드 밸런싱을 해주는 클러스터이다.
그리고 차후에 죽은 real node 가 복구되어 다시 살아나면, 이를 master node 에서 알아차리고 그 살아녀석을 다시 로드 밸런싱에 추가시키는 클러스터이다. 여기서 Mon을 포함한 Perl Module의 역할은 일정 시간마다 real node가 죽었는지 체크하는 역할이다.

Perl Module 설치하기

우선 필요한 Perl Module를 설치해보도록 하자! 앞의 문서에 다운 받았던 것들을 기억하는가??

  1. fping (http://www.fping.com/download/) ← 이곳에 받은 fping에서만 컴파일에러가 나지 않았다. 반드시 최신버전을 받도록 한다.
    1. mon (mon-0.99.2.tar.gz)
    2. Time::Period (Period-1.20.tar.gz)
    3. Time::HiRes (Time-HiRes-1.4.2.tar.gz)
    4. Convert::BER (Convert-BER-1.31.tar.gz)
    5. Mon::* (Mon-0.11.tar.gz)fping (fping.tar) ← 압축을 풀면 fping-2.4b2_to

우선 perl module 을 설치하기전에 앞서 해주어야 할 작업이 있다.

#cd /usr/include
#h2ph *.h sys/*.h asm/*.h   

그러면, xxx.h → xxx.ph 등의 리스트가 떨어지면서 변환되는 것이 보일 것이다.
위의 작업이 끝났다면, 본격적으로 Perl Module을 설치해보도록 하자!!

설치방법은 다음과 같다.

#tar xvfz Time-Hires-xx.xx.tar.gz <--상응하는 버전
#cd Time-Hires-xx.xx
#perl Makefile.PL
#make
#make test
#make install 

다른 module 들도 마찬 가지 방법으로 설치하기 바란다. 기본적으로 위의 4가지 모듈을 설치했다면, fping을 설치할 차례다. 여기서 fping을 설치하는 이유는 문서 후반부에서 해볼 테스트를 위해서이다.

#tar xvf fping.tar
#cd fping-2.4b2_to
#configure
#make
#make install

설치가 완료 되었다면, 이제 mon을 설치해야 한다.

mon 설치하기

mon 은 압축을 풀면 바로 사용가능한 프로그램이다. 다음과 같이 설치해보자!

#cd /usr/local
#tar xvfz mon-0.99.tar.gz
#mv mon-0.99 mon

잠깐 윗 부분을 설명하자면, mon을 /usr/local 로 옮겨서 디렉토리 이름을 바꾸어 주었다.
우선 mon의 설정파일을 저장할 디렉토리를 만들도록 한다.

#mkdir /etc/mon

그리고 mon 디렉토리 아래 etc 디렉토리 아래에 있는 example.cf 파일을 /etc/mon/mon.cf 파일로 복사한다.

#cp /usr/local/mon/etc/example.cf /etc/mon/mon.cf

여기서 시스템이 m4를 사용할 경우 example.m4 를 /etc/mon 디렉토리에 카피해야 한다.
다음에는 auth.cf 파일을 역시 /etc/mon 디렉토리에 복사한다.

#cp /usr/local/mon/etc/auth.cf /etc/mon/auth.cf

이번에는 /etc/services 파일의 맨 아래에 다음을 추가 시켜준다.

-------------------/etc/services------------------------
mon                2583/tcp                #MON
mon                2583/udp                #MON traps
---------------------------------------------------

다 되었으면, mon의 핵심파일인 /etc/mon/mon.cf 을 손봐(?) 주도록 하겠다.

-------------------/etc/mon/mon.cf----------------------
##  mon.cf 파일 만들기 
#############################################
 
cfbasedir = /etc/mon    
alertdir  = /usr/local/bin/alert.d
mondir  = /usr/local/mon/mon.d
maxprocs  = 20
histlength = 100
randstart  = 30
sauthtype   = getpwnam
 
#
# 그룹을 선언하는 위치 입니다. 호스트네임이나 IP 를 적어야 합니다.
#
#
#  ex) hostgroup      master_server    123.123.123.2
#      ^^^^^^^^^     ^^^^^^^^^^^^^^   
#     그룹 선언문     그룹의 이름        해당 서버의 IP나 호스트네임 (여러개를 적을때는 한칸씩 띄워서 쓰면 된다.)
#
 
hostgroup master_server        210.119.108.177
#
# 선언한 그룹에 대하여 적용할 모니터링 데몬및 설정을 입력한다.
#        
watch master_server
 
# watch 는 선언문이며 master_server 는 위에서 지정한 그룹의 이름이다.
        service        ping
        description        ping to master_server group
        interval 10s        monitor fping.monitor
        period wd {Sun-Sat}
        alert echo.alert "master server is down!!"
        upalert echo.alert "master server is live!!"
---------------------------------------------------

위에 설정해준 내용중에서 echo.alert 파일이 실제로는 없기 때문에 우리가 직접 만들어 주어야 한다.

-------------/usr/local/mon/alert.d/echo.alert--------------------
## /usr/local/mon/alert.d/echo.alert
 
#!/bin/sh
 
echo "`date`$*" >> /var/log/echo.alert.log;
---------------------------------------------------

퍼미션은 755로 해준다. 이제는 마지막으로 mon이 제대로 돌아가는 지 테스트를 해 볼 차례다. 아래와 같이 테스트 해준다.

#/usr/local/mon/mon -f -c /etc/mon/mon.cf

그러면, 잠시후에 터미널에 아래와 비슷한 메세지가 뜰 것이다.

<daemon.crit>mon[1995]: failure for master_Server echo 2314823742 210.119.108.177

만일 저와 같은 메세지가 뜨지 않는 다면, 로그파일을 보도록 하자!! /var/log/message 이것이다.

-----------------/var/log/message------------------------
???------------????--
---------------------------------------------------

헉. 지금은 기억이 안나지만.. 아마도 에러가 난 걸로 기억한다. 그것은 /usr/lib/mon 에 파일이 없다는 내용의 것이었다. 만일 이와 같은 에러가 난다면, /usr/local/mon 디렉토리를 통째로 /usr/lib 아래에 복사해주면 된다. 그리고 다시 실행주면, 에러로그가 없어졌을 것이다.

☞ 만일 위와 같은

'<daemon.crit>mon[1995]: failure for master_Server echo 2314823742 210.119.108.177'

메세지가 안 나오더라도, 절대 걱정하거나, 포기하지 말자!!
실제로 필자도 저와 같은 메세지가 뜨지 않았다.
우리가 여기서 확인하고자 하는 것은 mon이 제대로 실행되는가 하는 여부이다. 로그 파일에서 에러메세지를 보이지 않았다면, 또는 프로세스가 떠 있다면 그것으로 된 것이다.

설정하기

mon으로 ipvsadm을 제어하기 위해 lvs.alert 라는 파일을 아래와 같이 만든다. 여기서 제어라는 뜻은 real node가 죽으면 ipvsadm 테이블에서 지우고, real node가 살면 다시 테이블에 추가하는 것을 의미한다.

--------------------/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:X:u");
       $ipvsadm = "/sbin/ipvsadm";
       $protocol = $opt_P;
       $virtual_service = $opt_V;
       $remote = $opt_R;
       $status = $opt_X;
if ($status eq "down"){
 
        시스템("$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") {
                시스템("$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding");
 exit 0;
                }
                else {
                시스템("$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding");
     exit 0;
                }
exit 0;
};
---------------------------------------

파일의 퍼미션은 755로 해준다. 그리고 이번에 mon의 핵심파일인 mon.cf 을 수정해준다. 아래와 같이!!!

-----------------------/etc/mon.cf---------------------
#
# Example "mon.cf" configuration for "mon".
#
# $Id: _c5_ac_b7_af_bd_ba_c5_cd_20_b1_b8_c3_e0_c7_cf_b1_e2_20_2d_20_a8_e8_20Mon_c0_bb_20_c0_cc_bf_eb
#      _c7_d1_20_b7_ce_b5_e5_20_b9_eb_b7_b1_bd_cc,v 1.1 2008/12/19 22:41:16 root Exp root $
#
 
#
# This works with 0.38pre8
#
 
#
# global options
#
cfbasedir   = /etc/mon
alertdir    = /usr/local/mon/alert.d
mondir      = /usr/local/mon/mon.d
maxprocs    = 20
histlength = 100
randstart = 30s
 
authtype = getpwnam
 
#
# NB:  hostgroup and watch entries are terminated with a blank line (or
# end of file).  Don't forget the blank lines between them or you lose.
#
 
#
# group definitions (hostnames or IP addresses)
#
 
 
 
hostgroup node1 210.119.108.170
 
 
hostgroup node2 210.119.108.175
 
 
 
watch node1
        service http
        interval 3s
        monitor http.monitor
        period wd {Sun-Sat}
        alert lvs.alert -P tcp -V 210.119.108.173:80 -R 210.119.108.170 -W 1 -F dr -X down
        upalert lvs.alert -P tcp -V 210.119.108.173:80 -R 210.119.108.170 -W 1 -F dr
 
 
 
 
watch node2
        service http
        interval 3s
        monitor http.monitor
        period wd {Sun-Sat}
        alert lvs.alert -P tcp -V 210.119.108.173:80 -R 210.119.108.175 -W 1 -F dr -X down
        upalert lvs.alert -P tcp -V 210.119.108.173:80 -R 210.119.108.175 -W 1 -F dr
---------------------------------------------------

위의 파일을 변경하면서, 주의할 점이 있다. 바로 호스트 그룹과 호스트 그룹의 선언 사이는 반드시 한줄 이상 띄워 주어야 한다는 점이다.

☞ 그렇지 않을 경우 매우 황당한 상황을 맞이하게 된다. 맨 마지막에 있는 시스템이 리얼노드에서 탈퇴를 한다. 이것은 mon 의 제작자의 메뉴얼에 있는 내용으로서 반드시 강조를 하고 있는 부분이다. 일어나는 문제는 아래와 같다. 서버의 커넥션을 확인하는 데몬이 입력값을 두개를 받게 되어, 있지도 않은 서버의 상태를 조사하게 된다. 궁금하시면 호스트그룹의 입력을 다닥다닥 예쁘게 왼쪽졍렬로 붙여서 입력 해 보길.

여기 까지 잘 따라왔다면, 우리가 이제까지 한 작업을 한번에 실행시켜줄 init 스크립트를 만들어보자!!
여기서 필자는 punk 라는 이름으로 만들었다.

-----------------------/etc/rc.d/init.d/punk-----------------
#!/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 "$1" in
        start)
        if [ -x $IPVSADM ]
        then
	echo 1 > /proc/sys/net/ipv4/ip_forward
	ifconfig eth0:1 210.119.108.173 netmask 255.255.255.255 broadcast 210.119.108.173 up
	route add -host 210.119.108.173 dev eth0:1
	echo 1 > /proc/sys/net/ipv4/conf/all/hidden
	echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden
        $IPVSADM -A -t 210.119.108.173:80 -s wlc 
        $IPVSADM -a -t 210.119.108.173:80 -r 210.119.108.170 -g
        $IPVSADM -a -t 210.119.108.173:80 -r 210.119.108.175 -g
        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
---------------------------------------------------

자~아 이제 지긋지긋한 설정은 모두 끝이 났다. 이제 신나는 테스트 해보는 시간이 돌아왔다.
우선 master node에서 방금 만들어준 punk 스크립트를 시작하자!! 시작하는 방법은

#punk start

그리고 나서, ipvsadm 명령어를 약 2초간 단위로 계속 입력해서 테이블의 상태를 확인해본다. 아마도 처음에는 위에서 적어준 read node 2대가 모두 나오겠지만, 시간이 지나면 모두 테이블에서 삭제될 것이다. 이제는 real node를 실행해보자!
이 문서에서는 read node에 대한 설정은 없었으므로 전에 문서에서 만들어 두었던, 스크립트 파일을 실행시켜준다.
그리고 나서 다시 master node에서 ipvsadm 명령어를 쳐보자!! 그럼 테이블이 다시 등록되어 있음을 볼수 있을 것이다. 여기서 우리가 확인해야 할 것들은 다음과 같다.

1. 제대로 노드가 분산이 되는지?
2. read node가 죽었을 때, master node에서 어떻게 분산을 하는지?

위의 항목들이 제대로 된다면, 성공이다.

  • computer/networking/클러스터_구축하기_-_2.mon을_이용한_로드밸런싱.txt
  • Last modified: 4 years ago
  • by likewind