2013년 4월 17일 수요일

Linux Fail Over Cluster System 구축하기

[출처 : http://thinkit.or.kr/ ]
일반적으로 Linux Fail Over Cluster System 을 구축하기 위한 솔루션으로는 리눅스 라우팅 박스 아래에 서비스 서버들을 여러대 놓고, 리눅스 라우팅 박스의 Fail Over 를 구성하고, 서비스 서버들끼리 부하분산 Cluster 구성한다.
하지만, 이번 문서에서는 단지 두대의 리얼 서비스 리눅스 박스만으로 Fail Over Cluster 를 구성하기 위한 방법을 기술한다. 단 두대로 서비스 데몬까지 Fail Over Cluster 를 구성해주는 솔루션을 찾을 수 없어서 직접 작성한 스크립트를 추가하였다.

Linux Fail Over Cluster How To

1. 개요.
• 고가용성이란 하나의 노드에 문제가 생긴 경우 다른 노드에서 서비스나 기능을 대신 제공하는 것을 말한다. 공개소스로서 이러한 기능을 구현하고 있는 것이 High-Availability Linux Project 이다. Heartbeat 등의 프로그램을 이용하여, 서비스 서버에 장애가 발생하더라도 예비 서버를 이용하여 계속적인 서비스가 가능하도록 구성하는 것이다.

2. 환경
서버 2대 (Redhat Linux 9.0)
virtual ip  lvstest.com (210.xxx.xxx.225)
server 1  lvs1.lvstest.com (210.xxx.xxx.226)
server 2  lvs2.lvstest.com (210.xxx.xxx.227)

만약 랜카드가 두개씩 장착되어진 시스템이라면 크로스 케이블을 이용 eht1 번
카드로 클러스터링을 구성하도록 할 수 있다. 본 문서는 랜카드가 한 개씩 일 때를
기준으로 작성되었으나, 추가적으로 ▶ Private IP 라는 표시를 하여 두번째
랜카드를 클러스터링용도로 사용하는 방법에 대해서도 함께 기술한다. 만약
랜카드가 하나씩인 시스템에 설치시에는 ▶ Private IP 표시가 된 항목은
무시하도록 한다.

▶ Private IP
Server 1  lvs1.lvstest.com (PublicIP: 210.xxx.xxx.226 / PrivateIP: 192.168.0.226)
Server 2  lvs2.lvstest.com (PublicIP: 210.xxx.xxx.227 / PrivateIP: 192.168.0.227)

3. 설치 프로그램 (lvs1, lvs2 공통)
A. 설치되어 있어야 하는 프로그램들.
autoconf, automake, libtool, glib-devel, lynx
RHN, 혹은 Red carpet 을 통하여 RPM 설치를 한다.
Apache, MySQL, PHP 를 설치한다.

B. 설치할 프로그램들.
libnet, heartbeat
libnet 은 http://www.packetfactory.net/libnet 에서 구할 수 있다. 다운 받은 후 다음의 명령으로 기본 설치한다.

# gzip –cd libnet.tar.gz | tar xvf –
# cd Libnet-latest
# ./configure
# make && make install

heartbeat 은 http://www.linux-ha.org/download/ 에서 구할 수 있다.
다음의 명령으로 기본 설치한다.

# gzip –cd heartbeat-1.0.3.tar.gz | tar xvf –
# cd heartbeat-1.0.3
# ./ConfigureMe configure
# gmake && gmake install (gmake 를 권장한다.)

4. server, heartbeat 설정.
A. Server 설정
Lvs1, lvs2 공통으로 /etc/hosts 파일을 열어 다음 라인을 추가해 준다.

# vi /etc/hosts
210.xxx.xxx.226 lvs1.lvstest.com lvs1
210.xxx.xxx.227 lvs2.lvstest.com lvs2
:wq

▶ Private IP
# vi /etc/hosts
192.168.0.226 lvs1.lvstest.com lvs1
192.168.0.227 lvs2.lvstest.com lvs2

/etc/sysconfig/network 파일을 열어 다음과 같이 개별적으로 편집한다.

Lvs1  HOSTNAME=lvs1
Lvs2  HOSTNAME=lvs2

B. Heartbeat 설정
이하는 모두 공통 설정이다.
우선 각각의 서버에 /etc/rc.d/init.d/heartbeat 이라는 스크립트가 존재하는지를 확인한다. 또한 /etc/ha.d 디렉터리가 존재하는지도 확인한다.
다음으로 각각의 서버에 3개의 환경파일을 생성 및 편집한다. 파일은 다음과 같다.
/etc/ha.d/authkeys, /etc/ha.d/ha.cf, /etc/ha.d/haresources

# vi authkeys
auth1
1 crc
:wq

# vi ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
keepalive 2  두 노드간에 얼마나 자주 heartbeat를 주고받을 것인가. 2초
deadtime 5  호스트가 죽었다고 판단하는 시간. 5초가 지나면 failover를 시작한다.
udpport 694  UDP heartbeat 패킷을 보낼 포트.
udp eth0  heartbeat를 보낼 인터페이스 (eth1 등의 추가적인 장치가 있다면 서비스에 영향을 주지 않도록 eth1 등의 디바이스를 사용한다.)
▶ Private IP
udp eth1
node lvs1
node lvs2
:wq

vi haresources
lvs1 210.xxx.xxx.225  가상 아이피를 적어준다. (두 서버 모두 동일하게 세팅한다.)
:wq

마지막으로 authkeys 파일의 퍼미션을 변경해준다.

# chmod 600 authkeys

부팅시 자동으로 실행될 수 있도록 각각의 서버에서 부트 스크립트 링크를 걸어준다.

# ln –s /etc/rc.d/init.d/heartbeat /etc/rc.d/rc0.d/K05heartbeat
# ln –s /etc/rc.d/init.d/heartbeat /etc/rc.d/rc3.d/S99heartbeat
# ln –s /etc/rc.d/init.d/heartbeat /etc/rc.d/rc5.d/S99heartbeat
# ln –s /etc/rc.d/init.d/heartbeat /etc/rc.d/rc6.d/K05heartbeat

5. Heartbeat 설정 확인
각각의 서버에서 /etc/rc.d/init.d/heartbeat start(enter)
lvs1 에서 ifconfig 명령어로 확인해 보았을 때 eth0:0 가 생성되고 210.xxx.xxx.225 의 가상 아이피가 할당된다. (LVS1, LVS2 순서대로 실행 추천)
lvs1 의 전원을 끄거나 /etc/rc.d/rc3.d/S99heartbeat stop(enter)를 해본다. 잠시후에 lvs2 에서 ifconfig 명령어로 확인해 보았을 때 eth0:0 가 새로 생성되면서 210.xxx.xxx.225 의 가상 아이피가 할당된다.
lvs1 의 전원을 킨다. 혹은 /etc/rc.d/rc3.d/S99heartbeat start(enter)를 한다. 잠시후 lvs2 의 eth0:0 가 없어지고 lvs1 에 eth0:0 가 생성되면서 210.xxx.xxx.225 의 아이피가 할당된다.

6. 서비스 데몬 모니터링
A. 서비스 데몬 체크를 위한 시스템 설정 (LVS1 에만 해당된다)
MySQL root 패스워드를 설정한다. (혹은 데몬 체크를 위한 DB 유저 / 패스워드를 생성한다.)

# /usr/local/mysql/bin/mysql mysql
mysql> update user set password = password(‘$NEWPASSWD’) where user = ‘root’;
mysql> flush privileges;

데몬 체크 스크립트에서 확인 할 수 있도록 아파치 웹 디렉터리에 다음과 같은 파일을 생성한다.

# cd /usr/local/apache/htdocs
# vi apache_mysql_chk.html
$dbcheck=mysql_connect(“:/tmp/mysql.sock”,”root”,”$NEWPASSWD”);  MySQL 의 소켓 값(여기서는 /tmp/mysql.sock)은 netstat –an | grep LIST 하면 확인 할 수 있다. 아이디와 패스워드(여기서는 root) 위에서 설정한 아이디, 패스워드를 사용한다.
If($dbcheck) echo “GOOD”;
else echo “BAD”;
?>
:wq!

B. 서비스 데몬을 모니터링하기 위한 heartbeat 의 추가설정 및 스크립트 (LVS1 에만 해당된다)
/etc/ha.d/resource.d/daemon_chk 스크립트를 생성한다.

vi daemon_chk
#! /bin/sh
# scripted by brainjam at inet.co.kr

# 필요에 따라 SLEEP_TIME 과 LYNX_TIME_OUT 값을 변경해 줄 수 있다.

CHK_FILE=lvstest.com/apache_mysql_chk.html
SLEEP_TIME=2  서비스 데몬 체크 후 다음 체크까지의 초.
LYNX_TIME_OUT=5  서비스 데몬 체크시 응답 까지의 타임아웃 초.
ORIG_SYNTAX=” GOOD”
 터미널에서 다음 명령어를 실행해서 나오는 결과값을 입력. 앞쪽의 space 도 포함해서 입력해 준다. # lynx –dump lvstest.com/apache_mysql_chk.html 일반적으로 spacespacespaceGOOD (space 세개) 일 것 이다.

# 아래 스크립트는 변경하지 않도록 한다.

case $1 in

start)

LOOP_NUM=0
CHK_NUM=0
while [ $LOOP_NUM = 0 ]
do

CHK_NUM=$CHK_NUM
if [ $CHK_NUM = 5 ]
then
/etc/rc.d/init.d/heartbeat stop
exit 0
else
GET_SYNTAX=`lynx –dump –connect_timeout=$LYNX_TIME_OUT –nolog $CHK_FILE | grep GOOD 2>/dev/null`
if [ “$ORIG_SYNTAX” = “$GET_SYNTAX” ]
then
CHK_NUM=0
sleep $SLEEP_TIME
else
CHK_NUM=`expr $CHK_NUM + 1`
sleep $SLEEP_TIME
fi
fi

done
;;

stop)
DAEMON_CHK_PID=`ps aux | awk ‘/daemon_chk/ && !/awk/ {print $2}’ | head -1`
kill -9 $DAEMON_CHK_PID
;;

*)
echo “daemon_chk start or stop”
;;

esac
:wq!

# chmod +x daemon_chk  실행 퍼미션을 적용한다.

서비스에 필요한 스크립트를 /etc/ha.d/resource.d 에 소프트 링크를 건다.

# cd /etc/ha.d/resource.d
# ln –s /usr/local/apache/bin/apachectl ./apache
# ln –s /usr/local/mysql/share/mysql/mysql.server ./mysql

만약 /etc/rc.d 아래에 S99apache, S99mysql 등의 스크립트가 설정되어 있다면 모두 삭제한다. Fail Over 를 위해서 apache, mysql 등의 시작 종료를 heartbeat 가 관장하게 된다.

/etc/ha.d/haresources 를 수정한다.

LVS1 의 haresources 파일
# vi haresources
lvs1 IPaddr::210.xxx.xxx.225 apache mysql daemon_chk

LVS2 의 haresources 파일
# vi haresources
lvs1 IPaddr::210.xxx.xxx.225 apache mysql

7. High Availability Fail Over Clustering 설정 확인
각각의 서버에서 /etc/rc.d/init.d/heartbeat start(enter) 를 실행한다. (LVS1, LVS2 순서대로 실행 추천) LVS1 에 apache 와 mysql 이 실행되었는지 확인한다. (heartbeat 이 올라간 후 실행되기 때문에 5초 정도의 딜레이가 있을 수 있다.) LVS2 에서는 heartbeat 가 실행되더라도 apache 와 mysql 이 실행되지 않는다. 이는 추후에 LVS1 이 서비스 불능시 LVS2 가 Virtual IP (여기서는 210.xxx.xxx.225)를 가져오면서 자동 실행된다.
테스트를 위해서 apache 혹은 mysql 데몬을 종료시킨다. 위의 설정대로 하였다면 10초 뒤 LVS1 의 heartbeat 이 종료되면서 LVS2 가 Virtual IP 를 가져간다. 동시에 LVS2 에서 apache 와 mysql 이 서비스 됨을 확인 할 수 있을 것이다. (LVS1 은 자동으로 apache 와 mysql 데몬을 종료되었을 것이다.)
다시 LVS1 에서 heartbeat 를 실행시키면 다시 Virtual IP 를 LVS1 으로 가져오면서 LVS1 에서 서비스 되는 것을 확인 할 수 있다.