본문 바로가기

OS/Linux

DRBD 구축 해보기

반응형

 

소개 및 특징


 

DRBD(Distributed Replicated Block Device)는 네트워크 상에서 데이터를 미러링하기 위한 장애조치 솔루션이다.

DRBD는 Linux 커널 모듈을 통해 구현되는 소프트웨어 기반 스토리지 솔루션이으로  Block Device 용 가상 드라이버를 사용하여 I/O를 처리하며 원격지로의 미러링 또한 수행하게 된다.

 

 

스토리지나 데이터베이스의 Fault Tolerant 기반으로 운영하고자 한다면 고려해볼 수 있다. 다만 백업과는 다른 개념으로 롤백 같은 기능은 제공되지 않으므로 유의하여야 한다. 

 

 

미러링 방식

미러링되는 방식으로 총 3가지를 제공한다.

1. Protocol A

  • Async, 비동기모드
  • Primary 노드에서 로컬 디스크로 쓰기가 완료되고 TCP 송신 버퍼에 배치하는 것으로 동기화 과정이 완료되는 것으로 본다.
  • 3가지 모드 중 가장 빠르지만 Primary 노드 장애 시 최종 데이터가 유실될수 있으므로 데이터 손실 가능성은 가장 크다.

2. Protocol B

  • Semi-Async, 반동기 모드
  • Primary 노드에서 로컬 디스크로 쓰기가 완료되고 Secondary 노드 메모리로 복제데이터가 도착하는 것으로 동기화 과정이 완료되는 것으로 본다.
  • Primary 노드 장애시 데이터 유실 가능성은 적지만 Primary, Secondary 노드 동시 장애(전원문제 등) 시 Secondary 노드에서 최종 데이터가 유실 될 수 있다.

3. Protocol C

  • Sync, 동기 모드
  • Primary 노드에서 로컬 디스크로 쓰기가 완료되고 Secondary 노드까지 쓰기가 완료되는 것으로 동기화 과정이 완료되는 것으로 본다.
  • 3가지 모드 중 데이터 손실 가능성이 가장 낮지만 가장 느리다.

 

 

고려사항

구축 시 고려해야할 사항으로

1. Primary -> Secondary 로 미러링이 진행될 때 Secondary에서 Block Device 마운트가 불가능하다. 즉 공유 기능이 없다.

2. Primary와 Secondary 의 Block Device의 사이즈는 하위 평준화 되므로 똑같이 맞추는게 좋다. 예를 들어 Primary 32G, Secondary 40G 일때 Primary의 사이즈에 따라 Secondary도 32G로 초기화된다.

 

 

 

구축해보기


 

구축 환경

1. OS : CentOS 7 x64

2. Host : test-drbd01

  • IP : 172.16.10.121
  • DISK : /dev/sdb, 32G

3. Host : test-drbd02

  • IP : 172.16.10.122
  • DISK : /dev/sdb, 32G

 

구축 테스트는 DRBD를 구축하고 단순히 파일 쓰기를 통해 secondary로 failover 시 데이터가 온전히 보전되는지 만을 테스트 할 예정이다.

 

 

 

 

DRBD 설치

모든 노드에서 실행한다.

elrepo 추가

yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

 

 

DRBD 설치

yum install -y kmod-drbd90 drbd90-utils

 

 

모듈 적재

modprobe drbd

 

 

 

 

Block Device 설정

/dev/sdb 의 파티셔닝을 진행해도 되지만 파일시스템 생성은 하지 않아야 한다.

파일시스템이 미리 생성 되어 있으면 추후 metadata 생성시 생성공간이 없어 아래와 같은 에러가 발생한다.

Command 'drbdmeta 0 v09 /dev/mapper/... 1' terminated with exit code 40

 

Block Device 크기에 따라 할당하는 metadata 크기가 다르므로 아래 표를 참조하여 그 크기만큼 삭제하여 준다.

Block Device Size DRBD Metadata Size
1GB 2MB
100GB 5MB
1TB 32MB
4TB 128MB

 

dd if=/dev/zero of=/dev/sdb bs=1M count=5

 

 

 

 

DRBD config 설정

모든 노드에서 동일하게 설정한다.

 

global

설정파일 경로 : /etc/drbd.d/global_common.conf

global {
        usage-count yes;
}

 

usage-count : 업그레이드에 대한 설정으로

  • yes : 사용
  • no : 미사용
  • ask : 업그레이드시 물어보기, default

 

 

common 

설정파일 경로 : /etc/drbd.d/global_common.conf

하위 resource 들에 상속가능한 공통 설정을 정의 할 수 있다. 하위 resource에 동일한 설정이 있다면 하위 resource 설정이 우선한다.

common {
        handlers {
        }

        startup {
        	wfc-timeout 30;
        	outdated-wfc-timeout 30;
        	degr-wfc-timeout 30;
        }

        options {
        }

        disk {
        }

        net {
        	protocol C;
        }
}

 

wfc-timeout <시간, 초>

 - drdb 초기 기동시 리소스에 연결하는 타임아웃 값
 - 초 단위. (기본값 0, 무제한)

degr-wfc-timeout <시간, 초>

 - 성능이 저하된 노드에서 적용되는 wfc-timeout

 

 

resource

설정파일 경로 : /etc/drbd.d/test.res

resource test {
	protocol C;
    startup {
    	wfc-timeout       0;      ## Infinite!
        degr-wfc-timeout  120;    ## 2 minutes.
	}
	disk {
    	on-io-error detach;
        resync-rate 300M;
    }
    net {
    	timeout             30;     #  3 seconds  (unit = 0.1 seconds)
        connect-int         5;     # 5 seconds  (unit = 1 second)
        ping-int            5;     # 5 seconds  (unit = 1 second)
        max-buffers         20000;
        max-epoch-size      20000;
    }

	on test-drbd01 {
		device /dev/drbd1;
		disk /dev/sdb;
		address 172.16.10.121:7100;
		meta-disk internal;
	}
	on test-drbd02 {
		device /dev/drbd1;
		disk /dev/sdb;
		address 172.16.10.122:7100;
		meta-disk internal;
	}
}

 

on-io-error <handler>

  - pass_on : 노드 디스크상태를 다운그레이드하고 대기 노드상에 동기화 진행

  - call-local-io-error : local-io-error 호출

 - detach : 디스크 상태를 diskless 상태로 표시하고 계속 진행, default

timeout <초>
 - 연결이 성립된 파트너 노드에서 <값> 내에 응답이 없을 경우 실패로 간주
 - 0.1초 단위 (10 = 1초)
 - 이 값은 connect-int, ping-int 값보다 낮아야 한다.
connect-int <초>
 - 연결이 성립된 파트너 노드가 실패 할 경우 2번의 재시도가 발생하는데 이때 재시도할 인터벌
 - 1초 단위. 10초의 경우 10초간격으로 2번 재시도하고 최종 실패처리
ping-int <초>
 - 연결이 성립된 파트너 노드와 유휴 상태에서 연결유지 패킷을 날릴 인터벌
 - 1초 단위
ping-timeout <초>
 - 연결이 성립된 파트너 노드와 유휴 상태에서 연결유지 패킷에 대한 응답 허용시간.
 - 이 시간을 초과 하게 될 경우 dead 로 처리
 - 0.1초 단위 (기본값은 0.5)

max-buffers <Numbers>
 - 수신 측 노드에서 데이터를 읽고, 쓰기 전 사용되는 메모리 버퍼 사이즈
 - 단위는 page size 이며 대부분의 시스템은 4kb
 - 값이 20000 = 80000 = 80MB
resync-rate <Bytes>
 - drbd 원활한 성능을 위하여 백그라운드 동기화 속도 제한
 - 기본값은 250KB/s

 

참고

여러 노드를 mesh 구조로 설정하고자 한다면

	connection-mesh {
		hosts     node1 node2 node3 node4;
    }

 

 

 

 

DRBC 서비스 시작

모든 노드에서 실행한다.

systemctl restart drbd
systemctl enable drbd

 

 

 

 

Metadata 생성

모든 노드에서 실행한다.

drbdadm create-md test

 

 

 

 

Primary 설정

test-drbd01을 Primary로 설정하고 test-drbd02를 secondary로 설정한다.

초기값은 모든 노드가 secondary 이므로 primary 노드에서만 primary값으로 설정하면 된다.

[root@test-drbd01 ~]# drbdadm primary --force test

 

 

 

 

파일시스템 생성

Primary 노드에서만 진행하면 된다.

lsblk로 확인하면 sdb에 drbd1 파티션이 보이는데 brdb1에 파일시스템을 생성하면 된다.

[root@test-drbd01 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda       8:0    0  80G  0 disk 
├─sda1    8:1    0   2G  0 part [SWAP]
└─sda2    8:2    0  78G  0 part /
sdb       8:16   0  32G  0 disk 
└─drbd1 147:1    0  32G  0 disk 
sr0      11:0    1   4M  0 rom

 

mkfs.ext4 /dev/drbd1

 

 

 

 

 

노드 상태 확인

[root@test-drbd01 ~]# drbdadm status
test role:Primary
  disk:UpToDate
  test-drbd02 role:Secondary
    replication:SyncSource peer-disk:Inconsistent done:3.06

 

secondary 노드에 초기화를 진행하며 완료되면 아래와 같이 secondary disk 상태가 UpToDate로 변경된다.

[root@test-drbd02 ~]# drbdadm status test
test role:Secondary
  disk:UpToDate
  test-drbd01 role:Primary
    peer-disk:UpToDate

 

 

 

 

 

미러링 테스트


primary 에서 drbd1을 /mnt에 마운트한다.

 mount /dev/drbd1 /mnt

 

 

빈파일 하나를 생성한다.

[root@test-drbd01 mnt]# touch test
[root@test-drbd01 mnt]# ll
total 16
drwx------ 2 root root 16384 Feb 19 16:09 lost+found
-rw-r--r-- 1 root root     0 Feb 19 16:14 test

 

 

미러링 확인을 위하여 primary 마운트를 해제 하고 primary -> secondary로 변경한다.

[root@test-drbd01 ~]# umount /mnt

[root@test-drbd01 ~]# drbdadm secondary test

[root@test-drbd01 ~]# drbdadm status test
test role:Secondary
  disk:UpToDate
  test-drbd02 role:Secondary
    peer-disk:UpToDate

 

 

secondary -> primary 로 변경하고 /mnt에 마운트 한다.

 

[root@test-drbd02 ~# drbdadm primary test

[root@test-drbd02 ~]# drbdadm status test
test role:Primary
  disk:UpToDate
  test-drbd01 role:Secondary
    peer-disk:UpToDate

[root@test-drbd02 ~]# mount /dev/drbd1 /mnt

[root@test-drbd02 drbd.d]# cd /mnt

[root@test-drbd02 mnt]# ll
total 16
drwx------ 2 root root 16384 Feb 19 16:09 lost+found
-rw-r--r-- 1 root root     0 Feb 19 16:14 test

 

빈파일이 생성 된 것을 알 수 있다.

 

반응형