참고 :
http://www.nidc.kr/customer/content.asp?board=tec&uid=967&board_group=2¶ms=skey=subject%5Epage=
http://www.drbd.org/docs/about/
DRBD 란?
DRBD는 블럭 디바이스를 HA(High Availabilty, 고가용성) 구성을 위한 Network Raid-1(mirroring) 유틸이다.
서비스 중단에 따른 Service Downtime 을 최소화하기 위해 사용된다.
DRBD 는 Raid-1 처럼 mirroring 만 하는 유틸이므로 linux heartbeat 와 같은 HA유틸과 같이 사용하는 것을 추천한다.
DRBD는 실제 사용하는 블럭 디바이스의 I/O 명령을 대신 받아서 처리한다. 실제 블럭 디바이스에 데이터를 쓰고 해당 데이터를 네트워크를 통해 mirroring 되는 장치로 보낸다.
예를 들어 /dev/sda 란 실제 블럭 디바이스가 있고 이를 중간에서 대신 처리하는 drbd 디바이스인 /dev/drbd0 가 있다면 모든 연산은 /dev/drbd0 로 보내면 이 연산을 /dev/sda 로 drbd가 대신 처리하고 network를 통해 다른 노드의 mirroring 되는 장비로 보낸다.
DRBD 상태는 primary 와 secondary 가 있으며 primary 에서만 연산이 가능하다. secondary는 primary를 계속 mirroring 한다.
DRBD 설치
설치 환경
OS : Ubuntu 14.014 LTS
DRBD : DRBD 8.4.4
primary ip : 192.168.3.11
primary hostname : drbd-1
primary device : /dev/sdb # 실제 mirroring 할 디바이스
secondary ip : 192.168.3.12
secondary hostname : drbd-2
secondary device : /dev/sdc # 실제 mirroring 할 디바이스
1. /etc/hosts(primary , secondary 둘다 설정)
drbd 설정시 hostname 을 통해 노드를 구분함으로 이를 /etc/hosts파일에 등록해야한다.
$ vi /etc/hosts
192.168.3.11 drbd-1
192.168.3.12 drbd-2
2. 패키지 설치 및 kernel module 로드(primary , secondary 둘다 설정)
$ sudo apt-get install drbd8-utils
$ sudo modprobe drbd
module 로드 확인
$ lsmod | grep drbd
3. DRBD 설정(primary , secondary 둘다 설정)
설정 파일은 /etc/drbd.d/ 에 넣으면 된다. 이전 버전의 경우는 /etc/drbd.conf 이다.
현재는 /etc/drbd.conf 에서 /etc/drbd.d/ 하위의 설정파일을 불러 오는 방법을 쓴다.
$ cat /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
# drbd 설정 파일 만들기
$ sudo vi /etc/drbd.d/{name}.res
resource "{resource_name}"
{
protocol {A | B | C};
disk {on-io-error detach;}
syncer {
}
on {primary-hostname} {
device /dev/{drbd_logical_name};
disk /dev/{raw_device_name};
address {ip}:{port};
meta-disk internal;
}
on {secondary-hostname} {
device /dev/{drbd_logical_name};
disk /dev/{raw_device_name};
address {ip}:{port};
meta-disk internal;
}
}
예) $ sudo vi /etc/drbd.d/drbd_test.res
resource "test01"
{
protocol C;
disk {on-io-error detach;}
syncer {
}
on drbd-1 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.3.11:7791;
meta-disk internal;
}
on drbd-2 {
device /dev/drbd0;
disk /dev/sdc;
address 192.168.3.12:7791;
meta-disk internal;
}
}
위 설정을 보면 drbd-1의 /dev/sdb 와 drbd-2의 /dev/sdc 간 mirroring 을 한다는 것이다.
4. DRBD 실행(primary , secondary 둘다 )
drbd-1$ sudo service drbd start
drbd-2$ sudo service drbd start
5. METADATA 생성(primary , secondary 둘다 )
* 주의 : Metadata 생성전 DRBD 볼륨으로 사용할 공간은 파일시스템이 생성되어 있지 않아야한다.
미리 파일시스템이 생성된 상태라면 아래와 같은 에러가 발생할 경우
Command 'drbdmeta 1 v08 /dev/xxx internalcreate-md' terminated with exit code 40
dd를 이용하여 MBR 영역을 없애주어야한다.
$ dd if=/dev/zero of=/dev/sdb bs=1M count=128
# Metadata 생성 명령
$ sudo drbdadm create-md all
위 명령을 수행하면 device 에 지정했던(/dev/drbd0) 디바이스가 생성된다.
6. DRBD primary 만들기(primary 에서 명령)
DRBD 가 처음실행되면 secondary/secondary로 동작한다. 이를 primary/secondary로 만들어 mirroring이 진행될 수 있게 해야한다.
primary 로 사용할 drbd-1 호스트에서 아래의 명령을 호출한다.
$ sudo drbdadm primary {resource_name}
# 위의 예제 설정에서는 resource_name 이 test01이었다.
예) $ sudo drbdadm primary test01
DRBD 모니터링
정상 동작하는지 확인해보자.
모니터링 명령으로는
$ cat /proc/drbd
$ sudo drbdadm role {resource_name}
$ sudo service drbd status
가 있다.
$ cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 88927CDF07AEA4F7F2580B2
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:50 nr:117650 dw:117695 dr:3746 al:2 bm:9 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
$ sudo drbdadm role {resource_name}
예)
$ sudo drbdadm role test01
Primary/Secondary
$ sudo service drbd status
drbd driver loaded OK; device status:
version: 8.4.3 (api:1/proto:86-101)
srcversion: 88927CDF07AEA4F7F2580B2
m:res cs ro ds p mounted fstype
0:r0 Connected Primary/Secondary UpToDate/UpToDate C /tmp/mnt ext3
DRBD 운영
1. 파일 시스템으로 포맷하고 mount 하기
primary 노드에서 디바이스를 ext3 로 포맷팅하고 mount
* 주의 : /dev/sdb 를 포맷팅하는 것이 아니라 이를 대신 처리해주는 drbd 논리 디바이스인 /dev/drbd0에 수행해야한다.
$ sudo mkfs.ext3 /dev/drbd0
$ sudo mount /dev/drbd0 /mnt
* 주의 : secondary 노드의 블록 디바이스는 mirroring 만 되는 것이다. mount 되지 않는다. secondary 노드의 블록 디바이스를 mount 하기 위해서는 primary를 secondary 로 만들고 secondary 를 primary 로 만들어야한다.
2. mirroring 확인
primary 노드에서 마운트 진행하였고 여기에 파일을 하나 만든다.
drbd-1$ sudo touch /mnt/test
secondary 에 mirroring 되는지 확인하기 위해 secondary를 primary로 만들 것이다.
primary 노드는 하나밖에 지정못하므로 primary 를 우선 secondary 로 만들어야한다. secondary 로 만들기 전에 우선 umount 해야한다.
# primary를 secondary 만들기
drbd-1$ sudo umount /mnt
drbd-1$ sudo drbdadm secondary test01 #test01은 resource_name이다.
# secondary를 primary 만들기
drbd-2$ sudo drbdadm primary test01
# secondary 노드 였던 drbd-2에서 마운트하여 확인하기
drbd-2$ sudo mount /dev/drbd0 /mnt
drbd-2$ ls -al /mnt
확인해보면 drbd-1에서 생성했던 test 란 파일이 보일 것이다.
3. secondary를 primary 만들기
secondary를 primary 로 만드는 경우는 primary 노드가 죽었을 때 이다.
primary 노드가 죽었다면 secondary를 primary 로 만들어 서비스를 지속시켜야한다.
secondary 노드에서 아래의 명령을 통해 확인하면 primary 노드의 연결이 끊긴것을 확인할 수 있다.
drbd-2$ cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 88927CDF07AEA4F7F2580B2
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:43 dw:43 dr:1456 al:0 bm:2 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
drbd-2$ sudo service drbd status
drbd driver loaded OK; device status:
version: 8.4.3 (api:1/proto:86-101)
srcversion: 88927CDF07AEA4F7F2580B2
m:res cs ro ds p mounted fstype
0:r0 WFConnection Secondary/Unknown UpToDate/DUnknown C
secondary 를 primary 로 만든다.
drbd-2 $ sudo drbdadm primary {resource_name}
예) resource_name 이 test01일때
drbd-2 $ sudo drbdadm primary test01
secondary 를 primary로 만들었는지 확인
drbd-2$ cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 88927CDF07AEA4F7F2580B2
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:43 dw:43 dr:2912 al:0 bm:2 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
drbd-2$ sudo service drbd status
drbd driver loaded OK; device status:
version: 8.4.3 (api:1/proto:86-101)
srcversion: 88927CDF07AEA4F7F2580B2
m:res cs ro ds p mounted fstype
0:r0 WFConnection Primary/Unknown UpToDate/DUnknown C
4. secondary 노드를 교체
위의 상황처럼 primary 가 죽거나 secondary 가 죽거나 하여 mirroring 할 경로를 바꾸어야할 때
예를 들어 secondary 였던 drbd-2 의 장애로 drbd-3 에 mirroring 을 해야할 경우이다.
우선 primary 의 설정파일을 drbd-3로 바꾼다.
drbd-1 $ sudo vi /etc/drbd.d/{name}.res
예)
drbd-1 $ sudo vi /etc/drbd.d/test.res
resource "test01"
{
protocol C;
disk {on-io-error detach;}
syncer {
}
on drbd-1 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.3.11:7791;
meta-disk internal;
}
on drbd-3 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.3.13:7791;
meta-disk internal;
}
}
그리고 secondary 로 사용할 drbd-3 에도 동일하게 설정하고 drbd를 실행시킨다. 실행시키면 primary 의 연결을 대기한다.
drbd-3 $ sudo service drbd start
그리고 drbd-1 에서 drbd-3 로 연결하는 명령을 수행한다.
drbd-1 $ sudo drbdadm connect test01 # test01은 .res 파일 내의 resource_name 이다.
'학습자료(~2017) > 리눅스' 카테고리의 다른 글
[Linux] apt-get upgrade 시 특정 패키지의 업그레이드를 막아보자. (0) | 2015.08.07 |
---|---|
[VirtualBox Ubuntu] VirtualBox Guest Addition 설치 안될때 (0) | 2015.07.07 |
디렉토리 내의 모든 파일들 이름 일괄 변경/파일내용 일괄 변경 (2) | 2014.06.23 |
[Linux] /etc/fstab 사용시 네트워크 드라이브/저장소(nfs, iscsi..) 사용시 대기 문제 해결법(_netdev) (1) | 2014.04.02 |
[Linux] apt-get repository cdrom (저장소) (0) | 2014.03.11 |