학습자료(~2017)/리눅스

[LINUX]DRBD (블럭 디바이스 HA)

단세포소년 2014. 7. 1. 16:37
반응형


참고 : 

http://guguru.tistory.com/category/%5B%EA%B8%B0%EC%88%A0%EA%B2%80%ED%86%A0%20%26%20%EC%95%84%EC%9D%B4%ED%85%9C%5D

http://superlinuxer.com/DRBD

http://www.nidc.kr/customer/content.asp?board=tec&uid=967&board_group=2&params=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;

                             }

}


{}  인 곳에 내용을 넣어주면 된다.
- resource : 임의의 리소스 이름을 넣으면 된다.
- protocol : 동기화 방식인데, A는 비동기 방식으로 속도는 빠르나 데이터 손실의 위험이 있다. B는 메모리 까지만 동기화 방식으로 속도가 A보다는 느리지만 꽤빠른편이고 데이터 손실 위험은 A보다 적다. C는 동기 방식으로 primary 에서의 연산이 secondary에서도 완료되어야 작업이 완료되는 방식으로 속도는 제일 느리나 데이터 신뢰성을 높다. 데이터의 안정성은 C가 제일 좋다.
- on : 노드를 구분한다. hostname을 써주면 된다.
- device : drbd 논리 디바이스 이름이다. 해당 이름은 임의로 주면 drbd 동작시 해당 이름의 논리 디바이스를 만든다. 전통적으로는 drbd0, drbd1 이런 식으로 이름짓는다.
- disk : 실제 디바이스 이름을 넣는다. 
- address : ip와 port를 넣는다.
- meta-disk : drbd 가 동작하기 위한 메타데이터 저장 공간이며 디바이스를 따로 지정할 수 도 있지만 internal로 지정하면 disk 항복에 지정된 실제 디바이스의 공간중 128MB를 이용하여 메타 데이터용으로 쓴다.


                                                                                                                                                                          


예) $ 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 이다.


반응형