DRBD?

DRBD(Distributed Replicated Block Device)는 HA(High Availability) Cluster를 구축하기 위해 만들어 졌으며,
네트워크를 통해 디스크 복제(동기화)가 가능 하도록 해주어 Raid-1(Mirroring)과 같은 환경을 구축할수 있게 도와줍니다.

overview_02

DRBD Overview

(http://www.drbd.org/)

 

테스트 환경 및 서버 구성

  • CentOS 6.5 (2.6.32-431.5.1.el6)
  • Host Name           Type                      IP                 Storage
  • ruo91-node1     Primary        192.168.0.10     10G SSD
  • ruo91-node2    Secondary    192.168.0.11      10G SSD

 

1. Host Name 별칭 설정 (Both)

/etc/hosts 파일에 서버의 별칭을 설정 합니다.

[root@ruo91 ~]# nano /etc/hosts
# DRBD
192.168.0.10 ruo91-node1
192.168.0.11 ruo91-node2

 

2. NTP 동기화 (Both)

서버의 날짜 및 시간이 맞지 않으면 동기화가 되지 않을수 있기 때문에 crontab을 이용하여 주기 적으로 동기화 될수 있도록 설정 합니다.

[root@ruo91 ~] # nano /etc/crontab
# NTP 동기화
# 매 1분마다 동기화를 진행 하므로 NTP서버를 직접 구축해서 사용하는 것을 권장합니다.
1 * * * * root ntpdate 1.kr.pool.ntp.org

 

3. DRBD 설치 (Both)

elrepo의 저장소를 추가 하고 설치 합니다.

[root@ruo91 ~] # rpm -ivh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
[root@ruo91 ~] # yum install -y kmod-drbd84 drbd84-utils

 

수동으로 DRBD Module을 커널에 적재 시킵니다.

[root@ruo91 ~] # modprobe drbd

 

4. DRBD 설정 (Both)

“drbd_disk1.res” 라는 이름으로 설정 파일을 하나 생성하고 아래와 같이 사용자 환경에 맞게 변경합니다.

[root@ruo91 ~] # nano /etc/drbd.d/drbd_disk1.res
resource drbd_disk1 {
	startup {
		wfc-timeout 30;
		outdated-wfc-timeout 20;
		degr-wfc-timeout 30;
	}

	net {
		cram-hmac-alg sha1;
		shared-secret sync_disk;
	}

	syncer {
		rate 100M;
		verify-alg sha1;
	}

	on ruo91-node1 {
		device /dev/drbd0;
		disk /dev/sdb;
		address 192.168.0.10:7789;
		meta-disk internal;
	}

	on ruo91-node2 {
		device /dev/drbd0;
		disk /dev/sdb;
		address 192.168.0.11:7789;
		meta-disk internal;
	}
}

 

5. DRBD Meta data 생성 (Both)

meta data를 생성 해줍니다.

[root@ruo91 ~]# drbdadm create-md drbd_disk1
riting meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success

 

간혹 아래와 같은 이유로 meta data가 생성이 안될 경우가 있습니다.

Device size would be truncated, which would corrupt data and result in 'access beyond end of device' errors.
You need to either
* use external meta data (recommended)
* shrink that filesystem first
* zero out the device (destroy the filesystem)
Operation refused.
Command 'drbdmeta 0 v08 /dev/sdb internal create-md' terminated with exit code 40

 

해결책은 디스크를 초기화 후 생성하면 잘 됩니다.

[root@ruo91 ~]# dd if=/dev/zero of=/dev/sdb bs=1M

 

6. DRBD 실행 (Both)

DRBD를 실행 합니다.

[root@ruo91 ~]# /etc/init.d/drbd start
Starting DRBD resources: [
create res: drbd_disk1
prepare disk: drbd_disk1
adjust disk: drbd_disk1
adjust net: drbd_disk1
]
..........

 

간혹 아래 메세지가 나오는 경우가 있을수 있습니다. 아래 메세지는 동기화 하려는 서버와 연결을 맺고자 대기 타고있는데 시간을 초과하여 실행을 할수 없다는 뜻입니다.

따라서, 동기화할 서버를 30초이내에 시작하시면 해결 됩니다. (대기 시간 변경은 drbd_disk.res 리소스 설정 파일에 “wfc-timeout”를 적절히 변경 해주시면 됩니다.)

DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 30 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 30 seconds. [wfc-timeout]
(These values are for resource 'drbd_disk1'; 0 sec -> wait forever)
To abort waiting enter 'yes' [ 15]:

 

7. 동기화 모드 설정

ruo91-node1 서버를 primary로 지정 하겠습니다.

[root@ruo91-node1 ~]# drbdadm primary --force drbd_disk1

 

이후 Primary와 Secondary의 동기화가 완료 될때까지 기다립니다.

[root@ruo91-node1 ~]# drbd-overview 
0:drbd_disk1/0 SyncSource Primary/Secondary UpToDate/Inconsistent C r----- 
[=================>..] sync'ed: 92.2% (800/10236)M

 

동기화가 완료 되면 이런식으로 나와야 합니다.

[root@ruo91-node1 ~]# drbd-overview 
0:drbd_disk1/0 Connected Primary/Secondary UpToDate/UpToDate C r-----

 

8. DRBD Device 파일 시스템 포멧 (Both)

drbd_disk1.res 에서 지정한 “/dev/drbd0″를 ext4 파일 시스템으로 포멧 합니다.

[root@ruo91 ~]# mkfs.ext4 /dev/drbd0

 

9. 동기화 테스트

– ruo91-node1
마운트 할 디렉토리를 생성 하고 마운트 합니다.

[root@ruo91-node1 ~]# mkdir /drbd_disk1
[root@ruo91-node1 ~]# mount /dev/drbd0 /drbd_disk1
[root@ruo91-node1 ~]# mount | grep drbd
/dev/drbd0 on /drbd_disk1 type ext4 (rw)

 

간단한 파일을 생성 합니다.

[root@ruo91-node1 ~]# echo "Hello" > /drbd_disk1/drbd-test.txt
[root@ruo91-node1 ~]# ls -al /drbd_disk1/
합계 28
drwxr-xr-x 3 root root 4096 2014-03-02 20:46 .
dr-xr-xr-x. 24 root root 4096 2014-03-02 19:58 ..
-rw-r--r-- 1 root root 6 2014-03-02 20:46 drbd-test.txt
drwx------ 2 root root 16384 2014-03-02 20:40 lost+found

[root@ruo91-node1 ~]# cat /drbd_disk1/drbd-test.txt 
Hello

 

이제 Primary로 지정한 ruo91-node1에서 /dev/drbd0를 마운트 해제 하고,

Secondary로 지정된 ruo91-node2서버에서 생성한 파일이 존재 하는지 확인을 해보겠습니다.

ruo91-node1에서 마운트를 해제 합니다.

[root@ruo91-node1 ~]# umount /dev/drbd0

 

Primary에서 Secondary로 변경 합니다.

[root@ruo91-node1 ~]# drbdadm secondary drbd_disk1

 

Secondary로 변경이 되었는지 확인 합니다.

[root@ruo91-node1 ~]# drbd-overview 
0:drbd_disk1/0 Connected Secondary/Secondary UpToDate/UpToDate C r-----

 

– ruo91-node2

ruo91-node2에서 Secondary를 Primary 상태로 변경 합니다.

[root@ruo91-node2 ~]# drbdadm primary drbd_disk1

 

마운트 할 디렉토리를 생성 하고 마운트 합니다.

[root@ruo91-node2 ~]# mkdir /drbd_disk1
[root@ruo91-node2 ~]# mount /dev/drbd0 /drbd_disk1
[root@ruo91-node2 ~]# mount | grep drbd/dev/drbd0 on /drbd_disk1 type ext4 (rw)

 

이제 ruo91-node1에서 생성한 파일이 존재 하는지 확인 합니다.

[root@ruo91-node2 ~]# ls -al /drbd_disk1/
합계 28
drwxr-xr-x 3 root root 4096 2014-03-02 21:03 .
dr-xr-xr-x. 24 root root 4096 2014-03-02 20:28 ..
-rw-r--r-- 1 root root 6 2014-03-02 21:03 drbd-test.txt
drwx------ 2 root root 16384 2014-03-02 20:54 lost+found

 

Easy, right? 🙂