DRBD 설치 편.
DRBD를 가지고 응용할 수 있는게 생각보다 많이 있다.
기본적으로는 DRBD + Heartbeat 를 이용해서 local 에서 마운트 해서 사용을 하는 방법이다. 그리고 조금 더 나가면 DRBD + HeartBeat + NFS 방식 혹은 DRBD + Heartbeat + iscsitarget 내지는 DRBD + Heartbeat + GFS2 + GNBD 로 사용도 가능하다.
개인적으로 가장 많은 시간을 보낸 것은 GFS를 Debian 에서 구현시킬 때 였다.
자 이제 가장 기본인 DRBD + Heartbeat 를 먼저 설치해 보도록 한다.
준비 사항
서버 : Debian Etch 기본 설치 버전 2대
프로그램 :
kernel 2.6.26.3
DRBD 8.2.6
Heartbeat-2
일단 설치 파일에 사용할 프로그램을 다운로드 받는다.
먼저 커널을 압축을 풀고 컴파일을 한다.
그리고 부트로드 grub나 lilo 를 사용하여 적용하고 리붓 한다.
dongho7:/usr/src# tar jxvf linux-2.6.26.3.tar.bz2
dongho7:/usr/src# cd linux-2.6.26.3 dongho7:/usr/src/linux-2.6.26.3# make menuconfig dongho7:/usr/src/linux-2.6.26.3# make dongho7:/usr/src/linux-2.6.26.3# make install dongho7:/usr/src/linux-2.6.26.3# make modules_install dongho7:/usr/src/linux-2.6.26.3# vi /etc/lilo.conf dongho7:/usr/src/linux-2.6.26.3# lilo Added linux * dongho7:/usr/src/linux-2.6.26.3# reboot |
DRBD patch 를 /usr/src/patch-drbd_main 파일명으로 만든다.
patch 를 하지 않으면 컴파일 시에 오류가 발생한다.
dongho7:/usr/src# cat patch-drbd_main — drbd/drbd_main.c 2008-09-01 12:01:56.000000000 +0900 +++ drbd/drbd_main.c 2008-09-01 12:02:14.000000000 +0900 @@ -2564,7 +2564,7 @@
if (minor_table) { if (drbd_proc) – remove_proc_entry(“drbd”, &proc_root); + remove_proc_entry(“drbd”, NULL); i = minor_count; while (i–) { struct drbd_conf *mdev = minor_to_mdev(i); @@ -2786,7 +2786,7 @@ /* * register with procfs */ – drbd_proc = create_proc_entry(“drbd”, S_IFREG | S_IRUGO , &proc_root); + drbd_proc = create_proc_entry(“drbd”, S_IFREG | S_IRUGO , NULL);
if (!drbd_proc) { printk(KERN_ERR “drbd: unable to register proc file\n”);
|
DRBD 원본 tar 파일을 풀고 패치를 한 뒤 컴파일을 한다.
dongho7:/usr/src# tar zxvf drbd-8.2.6.tar.gz dongho7:/usr/src# cd drbd-8.2.6 dongho7:/usr/src/drbd-8.2.6# patch -p0 -l < ../patch-drbd_main patching file drbd/drbd_main.c
dongho7:/usr/src/drbd-8.2.6# make clean all … make -C /lib/modules/2.6.26.3/build SUBDIRS=/usr/src/drbd-8.2.6/drbd modules make[2]: Entering directory `/usr/src/linux-2.6.26.3′ CC [M] /usr/src/drbd-8.2.6/drbd/drbd_buildtag.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_bitmap.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_proc.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_worker.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_receiver.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_req.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_actlog.o CC [M] /usr/src/drbd-8.2.6/drbd/lru_cache.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_main.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_strings.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_nl.o LD [M] /usr/src/drbd-8.2.6/drbd/drbd.o Building modules, stage 2. MODPOST 1 modules CC /usr/src/drbd-8.2.6/drbd/drbd.mod.o LD [M] /usr/src/drbd-8.2.6/drbd/drbd.ko make[2]: Leaving directory `/usr/src/linux-2.6.26.3′ mv .drbd_kernelrelease.new .drbd_kernelrelease Memorizing module configuration … done. make[1]: Leaving directory `/usr/src/drbd-8.2.6/drbd’
Module build was successful.
dongho7:/usr/src/drbd-8.2.6# make install |
이제 Heartbeat 를 데비안 스타일로 설치한다.
dongho7:~# apt-get install heartbeat-2
|
위 프로그램 설치는 두 서버에 동일하게 설치한다.
이제 설정을 하자.
DRBD 는 /etc/drbd.conf 파일만 설정하면 된다.
drbd.conf 를 아래 형식으로 자신의 서버에 맞게끔 파티션 정보 등은 수정한다.
dongho7:~# cat /etc/drbd.conf resource “cluster” { protocol C; handlers { pri-on-incon-degr “echo ‘pri-on-incon-degr'”; pri-lost-after-sb “echo ‘pri-lost-after-sb'”; local-io-error “echo ‘local-io-error'”; } startup { wfc-timeout 300; degr-wfc-timeout 120; } disk { on-io-error detach; } net { timeout 60; connect-int 10; ping-int 10; max-buffers 20000; max-epoch-size 20000; unplug-watermark 20000; } syncer { rate 512M; verify-alg md5; }
on dongho7 { device /dev/drbd0; disk /dev/sda6; address 192.168.0.13:7790; meta-disk internal; } on dongho8 { device /dev/drbd0; disk /dev/sda6; address 192.168.0.14:7790; meta-disk internal; } }
|
create meta data 를 진행한다.
만약 비어 있지 않은 파티션이라면 파티션을 분리하여 다른 곳에 meta data 를 저장을 하거나 데이타를 삭제 해도 되는 경우에는 dd 를 이용하여 일정 공간을 zero 로 채우고 난 다음 만들면 된다.
dongho7:~# drbdadm create-md cluster v07 Magic number not found v07 Magic number not found You want me to create a v08 style flexible-size internal meta data block. There apears to be a v08 flexible-size internal meta data block already in place on /dev/sda6 at byte offset 30005784576 Do you really want to overwrite the existing v08 meta-data? [need to type ‘yes’ to confirm] yes
Writing meta data… initialising activity log NOT initialized bitmap New drbd meta data block sucessfully created.
|
이제 데몬을 시작해 보자.
여기까지 두 서버 모두에서 동일하게 진행을 한다.
dongho7:~# /etc/init.d/drbd start Starting DRBD resources: [ d(cluster) s(cluster) n(cluster) ]. dongho7:~# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@dongho7, 2008-09-01 19:20:28 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r— ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:29301596
|
지금 부터는 한쪽 서버의 데이타를 기준으로 동기화를 위해 필요한 것이다.
즉 primary 를 설정하는 것이다.
다음 명령어는 primary 로 사용할 서버에서 한번만 명령을 내려 주면 된다.
dongho7:~# drbdadm — –overwrite-data-of-peer primary cluster |
아래처럼 동기화가 어느 정도 진행 되었는지 볼 수 있다.
아래 서버는 1000T 로 크로스 케이브로 연결 되어 있어 아래 정도의 속도가 나오고 있다.
dongho7:~# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@dongho7, 2008-09-01 19:20:28 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r— ns:1719812 nr:0 dw:0 dr:1798880 al:0 bm:104 lo:25 pe:294 ua:2496 ap:0 oos:27591164 [>……………….] sync’ed: 5.9% (26944/28614)M finish: 0:07:29 speed: 61,328 (50,304) K/sec
|
동기화가 완료 되면 다음과 같이 ds 가 UptoDate 로 모두 표시 된다.
dongho7:~# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@dongho7, 2008-09-01 19:20:28 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r— ns:29301596 nr:0 dw:0 dr:29301596 al:0 bm:1789 lo:0 pe:0 ua:0 ap:0 oos:0
|
지금 부터는 heartbeat 설정을 한다.
인증키를 양쪽 서버에 동일하게 만든다.
dongho7:/etc/ha.d# vi authkeys dongho7:/etc/ha.d# chmod 600 authkeys dongho7:/etc/ha.d# cat authkeys auth 2 2 sha1 difficultp@ssw0rd
|
ha.cf 설정 파일을 만든다.
ha.cf 는 두 서버에 설정시에 반대로 하면 된다.
dongho7:/etc/ha.d# vi ha.cf dongho7:/etc/ha.d# cat ha.cf debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0
keepalive 1 deadtime 10 warntime 4 initdead 60 udpport 694 ucast eth0 10.30.6.14 ping 10.30.6.14 respawn hacluster /usr/lib/heartbeat/ipfail auto_failback off
node dongho7 node dongho8
dongho8:/etc/ha.d# cat ha.cf debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0
keepalive 1 deadtime 10 warntime 4 initdead 60 udpport 694 ucast eth0 10.30.6.13 ping 10.30.6.13 respawn hacluster /usr/lib/heartbeat/ipfail auto_failback off
node dongho8 node dongho7
|
이제 마지막으로 haresources 를 만든다.
여기에서 가상 아이피 및 failover 되었을때 어떤 데몬을 시작 시킬찌 등을 설정한다.
dongho7:/etc/ha.d# vi haresources dongho7:/etc/ha.d# cat haresources dongho7 drbddisk::cluster \ Filesystem::/dev/drbd0::/drbd/cluster::ext3::noatime,nodiratime \ Delay::2::0 \ IPaddr::10.30.6.10/24/eth0
dongho8:/etc/ha.d# vi haresources dongho8:/etc/ha.d# cat haresources dongho8 drbddisk::cluster \ Filesystem::/dev/drbd0::/drbd/cluster::ext3::noatime,nodiratime \ Delay::2::0 \ IPaddr::10.30.6.10/24/eth0
|
이제 heartbeat 데몬을 시작 하기전 몇가지 사전 작업을 해야 한다.
위 haresources 에서 파일 시스템을 /drbd/cluster 에 마운트 하도록 하기 위해서는 파일 시스템도 만들어야 하고 디렉토디로 만들어야 한다. 양쪽 서버에서 동일하게 작업한다.
dongho7:~# mkdir -p /drbd/cluster
dongho7:~# mkfs -t ext3 /dev/drbd0 |
이제 양쪽 서버에서 heartbeat 데몬을 시작 한다.
dongho7:~# /etc/init.d/heartbeat start Starting High-Availability services: Done.
dongho8:~# /etc/init.d/heartbeat start Starting High-Availability services: Done.
|
이제 구성 완료 되었다.
한번 정말 아이피가 잘 넘어 가는지 테스트 해보자.
dongho8:~# ip addr show 1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop link/ether 5e:1c:e1:ff:8f:2b brd ff:ff:ff:ff:ff:ff 4: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:19:66:16:58:11 brd ff:ff:ff:ff:ff:ff inet 10.30.6.14/24 brd 10.30.6.255 scope global eth0 inet 10.30.6.10/24 brd 10.30.6.255 scope global secondary eth0:0 5: eth1: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0e:2e:f7:03:d5 brd ff:ff:ff:ff:ff:ff inet 192.168.0.14/24 brd 192.168.0.255 scope global eth1
|
운영중인 서버에서 heartbeat 데몬을 내려 보자.
그러면 몇초 후에 다른 노드로 넘어가게 될 것이다.
dongho8:~# /etc/init.d/heartbeat stop
Stopping High-Availability services: Done. |
다른 노드에서 아이피가 올라 온것을 아래 처럼 확인 할 수 있다.
dongho7:~# ip addr show 1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop link/ether de:45:58:74:ea:f0 brd ff:ff:ff:ff:ff:ff 4: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:13:8f:fc:bd:43 brd ff:ff:ff:ff:ff:ff inet 10.30.6.13/24 brd 10.30.6.255 scope global eth0 inet 10.30.6.10/24 brd 10.30.6.255 scope global secondary eth0:0 5: eth1: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0e:2e:f7:03:e8 brd ff:ff:ff:ff:ff:ff inet 192.168.0.13/24 brd 192.168.0.255 scope global eth1
|
다음 번에는 DRBD 로 local 에서 사용하는게 아닌 remote 에서 사용 하는 예를 살펴 보자.