HeartBeat로 High Availability(active-standby)를 구성하는 방법.
구성환경은 box1과 box2 동일한 환경이며, OS는 CentOS6.3을 사용했다.
box1
hostname: cent63-a
192.168.100.22
box2
hostname: cent63-b
192.168.100.23
Virtual IP(VIP) : 192.168.100.24
FreeNAS
hostname: freenas
192.168.100.18
공유디렉토리: /mnt/nas1/nfs-s
적용할 서비스는 웹서비스로 접속할 ip주소는 VIP를 사용한다.
1. heartbeat 설치(box1, box2에 모두 설치)
heartbeat 패키지는 RedHat(CentOS6.3) 기본 repository에는 포함되어 있지 않다. 따라서 소스화일을 다운로드 받아 컴파일하거나, repo에 epel을 등록해서 rpm 설치하면 된다.
epel 등록(버전별로 선택한다. 여기서는 Cent6.3, 64bit 용 epel-release-6-8.noarch.rpm 을 다운로드 받아 설치했다.
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh epel-release-6-8.noarch.rpm
warning: epel-release-6-8.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing... ########################################### [100%]
1:epel-release ########################################### [100%]
# yum repolist
Loaded plugins: fastestmirror, presto
Loading mirror speeds from cached hostfile
epel/metalink | 4.0 kB 00:00
* base: mirror.yongbok.net
* epel: ftp.riken.jp
* extras: mirrors.grandcloud.cn
* updates: mirror.yongbok.net
epel | 4.3 kB 00:00
epel/primary_db | 5.0 MB 00:05
repo id repo name status
base CentOS-6 - Base 6,346
epel Extra Packages for Enterprise Linux 6 - x86_64 8,284
extras CentOS-6 - Extras 17
updates CentOS-6 - Updates 1,063
repolist: 15,710
repository에 epeo이 등록되었다.
# yum install heartbeat
2. 설정(box1, box2 동일 설정)
/etc/ha.d에 ha.cf, authkey, haresources 세개의 화일을 만들어야 한다. 예제 화일이 /usr/share/doc/heartbeat-3.0.4 에 있으므로, 이것을 복사하여 사용한다.
# cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/
# cp /usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/
# cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/
authkeys 화일에 아래 줄을 추가한다.
auth 2
2 sha1 cent63-ha
화일속성을 600 으로 바꿔준다. 바꿔주지 않으면 아래와 같은 에러가 발생한다.
# /etc/init.d/heartbeat start
Starting High-Availability services: INFO: Resource is stopped
Heartbeat failure [rc=6]. Failed.heartbeat: udpport setting must precede media statementsheartbeat[1760]: 2013/01/09_13:03:13 ERROR: Bad permissions on keyfile [/etc/ha.d//authkeys], 600 recommended.
heartbeat[1760]: 2013/01/09_13:03:13 ERROR: Authentication configuration error.
heartbeat[1760]: 2013/01/09_13:03:13 ERROR: Configuration error, heartbeat not started.# chmod 600 /etc/ha.d/authkeys
ha.cf 화일에 아래 내용 추가
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
initdead 120
bcast eth0
udpport 694
auto_failback on
node cent63-a
node cent63-b
haresources 화일에 아래 내용 추가(웹서비스 관련)
cent63-a 192.168.100.24 httpd
3. 서비스 시작
box1 과, box2 에서 /etc/init.d/heartbeat start 해주면, HA 서비스가 실행된다. 웹서버의 index.html을 각각 다른 내용으로 만든 후, box1의 heartbeat 서비스를 정지시키면, box2 에서 웹서비스가 실행 되는 것을 확인 할 수 있다. 이때, 웹서비스는 VIP를 통해 접속한다.
4. NFS의 httpd DocumentRoot 이용(box1, box2 모두 적용해야함).
NFS서버는 freeNAS를 사용했다.
NFS는 autofs로 필요할때만 마운트하도록 한다.
/etc/auto.master에 아래 내용 추가 하고, /nas 디렉토리를 만든다.
/nas /etc/auto.nas
# mkdir /nas
/etc/auto.nas 화일을 만들고 아래 내용을 추가한다.
data -rw freenas:/mnt/nas1/nfs-s
/etc/init.d/autofs start 한 후, df -h 로, nfs가 정상 작동하는지 확인한다.
이제, box1, box2에서 /etc/httpd/conf/httpd.conf에서 DocumentRoot를 /nas/data로 바꾸고, 페이지들을 여기에 옮겨놓는다. 그리고, /etc/ha.d/haresources화일에 아래처럼 autofs를 등록해준다.
cent63-a 192.168.100.24 autofs httpd
이제 heartbeat가 제대로 작동하는지 확인한다. – 잘 된다!!
5. NFS 대신 DRBD 사용하기.
참고: http://www.drbd.org/users-guide-8.4/p-work.html
drbd를 설치한다. rpm 패키지는 역시 공식 repository에는 없으므로, elrepo를 추가해주면 된다. (자세한 내용은 http://elrepo.org/tiki/tiki-index.php 를 참고하면 됨).
# yum install drbd84-utils kmod-drbd84
drbd는 block device단위로(Partition 또는 Disk) 설정가능하다. 남아있는 disk가 없으므로, 1GB짜리 가상 disk를 추가했다.(box1, box2 모두)
DRBD 를 사용하기 위해 /etc/drbd.conf 에 아래 내용을 추가한다.(box1, box2 모두 동일하게 설정)
resource r0 {
on cent63-a {
device /dev/drbd0;
disk /dev/vdb1;
address 192.168.100.22:7789;
meta-disk internal;
}
on cent63-b {
device /dev/drbd0;
disk /dev/vdb1;
address 192.168.100.23:7789;
meta-disk internal;
}
}
/etc/drbd.d/global_common.conf 에서 network protocol을 설정해준다. protocol은 A(Asynchronus replication protocol), B(Memory Synchronus replication protocol), C(Synchronous replication protocol) 세가지가 있으며, C가 가장 최근 만들어진 프로토콜이다.
net {
protocol C;
}
box1 에서 drbd를 실행한다.(/etc/init.d/drbd start)
drbd 메타디바이스를 만들어준다.
# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
Box2 에서 drbd 를 실행하고, drbd 메타 디바이스를 만들어준다(drbdadm create-md r0).
/proc/drbd 를 보면, 양쪽서버 모두 아래와 같이 나온다.
# cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@Build64R6, 2012-09-06 08:16:10
0: cs:Connected ro:Secondary/Secondary ds:Diskless/Diskless C r—–
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
이제, Master로 사용할 서버를 정한다.(여기서는 cent63-a)
# drbdadm primary –force r0
# cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@Build64R6, 2012-09-06 08:16:10
0: cs:Connected ro:Primary/Secondary ds:UpToDate/Diskless C r—–
ns:0 nr:0 dw:0 dr:664 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1048220
화일시스템을 만들고, 마운트하면 사용할 준비가 끝났다.
# mkfs -t ext4 /dev/drbd0
# mount /dev/drbd0 /mnt
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
7.5G 1.1G 6.1G 15% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/vda1 485M 92M 369M 20% /boot
/dev/drbd0 1008M 18M 940M 2% /mnt
/dev/drbd0의 동기화가 끝난 후, box1의 drbd를 정지시킨후, box2에서 drbd0를 마운트하면 오류가 발생한다. 이것은, drbd 장치를 primary로 만들어주지 않아서 발생한다.
box2에서 drbdadm primary r0 한 후 마운트하면 된다. box2의 drbd를 언마운트한후, box1의 drbd장치를 primary로 바꾸는 시도를 하면 아래와 같은 오류가 발생한다.
# drbdadm primary r0
0: State change failed: (-1) Multiple primaries not allowed by config
Command ‘drbdsetup primary 0’ terminated with exit code 11
box2의 drbd장치를 secondary로 만들어주고, box1의 drbd장치를 primary로 만들어 주면 해결된다.
box2: # drbdadm secondary r0
box1: # drbdadm primary r0
이제, 동기화가 필요한 디렉토리 drbd를 사용하면된다.