소개 및 특징
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
빈파일이 생성 된 것을 알 수 있다.
'OS > Linux' 카테고리의 다른 글
[Linux] Disk inode 사용 해제 (0) | 2024.03.04 |
---|---|
Pacemaker 사용해보기[1] - VIP를 이용한 서버 이중화 (0) | 2024.02.23 |
[LetsEncrypt] certbot을 이용한 SSL 인증서 발급(standalone, txt dns 레코드(dns challenge)) (0) | 2024.02.01 |
IOPS(Input/Output Operations Per Second) 계산 방법 (1) | 2024.01.26 |
jq filter를 이용한 json 출력하기 (1) | 2024.01.05 |