[Redundancy] 09. 스토리지 서버의 다중화 (DRBD로 미러링 구성)
카테고리: REDUNDANCY
태그: redundancy linux
09-1. DRBD(Distributed Replicated Block Device)
두 대의 서버에 대해 파일 단위로 디스크를 동기화하거나 정합성 체크하면 파일 개수가 많아질수록 디렉토리 검색이나 비교에 시간이 오래 걸리며 이런 경우에는 하드디스크에 과도한 부하가 걸리므로 서버 전체의 성능이 크게 저하된다. 이런 문제를 해결하기 위해 나온것이 DRBD이다.
DRBD(Distributed Replicated Block Devie)는 고가용성 클러스터를 구성하기 위한 분산 복제 스토리지 솔루션으로, 두 대의 서버 간에 블록 디바이스의 데이터를 네트워크를 통해 미러링함으로써 고가용성과 데이터 보호를 제공한다. 즉, 『네트워크를 이용한 RAID 1(미러링)』이라고 생각하면 알기 쉽다.
한 서버의 데이터 변경이 다른 서버에 동일하게 반영되므로 데이터 손실 시점을 최소화하며 시스템 신뢰성을 향상시킵니다. 이를 통해 서버의 성능 저하를 최소화하면서 안정적인 데이터 관리와 고가용성을 동시에 달성할 수 있습니다.
| 종류 | 설명 |
|---|---|
| 파일 스토리지 | 데이터를 파일 형태로 저장하고 관리하는 방식으로, 주로 운영체제에서 사용되며 파일의 구조와 형식은 파일 시스템에 의해 관리된다. |
| 블록 스토리지 | 데이터를 블록 단위로 관리하는 방식으로, 하드 디스크와 같은 물리적 저장 장치가 여기에 해당된다. 블록은 고정된 크기의 데이터 조각으로 나누어져 저장되며, 운영 체제는 파일 시스템을 통해 블록 단위로 데이터를 읽고 쓸 수 있다. |
| 오브젝트 스토리지 | 데이터를 개별 오브젝트 단위로 저장하고 관리하는 방식으로, 각 오브젝트는 데이터 자체와 메타데이터로 구성되며, 고유한 식별자를 가지고 있다. 이러한 특징 때문에 대규모 데이터 저장 및 관리 시스템에서 사용되며, 주로 클라우드 스토리지와 같은 환경에서 확장성과 유연성을 제공하는 데 사용된다. |
■ DRBD의 구성
파일 단위로 데이터를 전송하는 것이 아니라 블록 디바이스에 대해 변경사항을 실시간으로 전송하기 때문에 파일 생성 및 변경할 때 DRBD나 백업 서버의 존재를 의식할 필요는 없다.
DRBD의 미러링은 Active/Backup 구성이기 때문에 Active 측의 블록 디바이스에 대해서는 읽기 쓰기가 가능하지만, Backup 측의 블록 디바이스에는 접근할 수 없다. 다만, 8 버전 이후에는 OCFS, GFS 등의 클러스터 파일시스템과의 좋합에 의해 Active/Active 구성이 지원된다.
09-2. DRBD 설정과 실행 (CentOS Stream 8 기준) - (“해당 링크 참고”)
■ DRBD 설치
# 구성
-----------+----------------------------------------------+--------------------------
| |
|192.168.219.134 |192.168.219.135
+----------+-----------+ +----------+-----------+
| [ dlp.test.srv ] | VRRP | [ node01.test.srv ] |
| DRBD |-----------------------| DRBD |
+----------------------+ +----------------------+
# 설치를 위해 Enterprise Linux용 추가 패키지가 포함된 ELRepo 저장소를 사용
{
dnf -y install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
dnf search drbd
}
# 설치
{
dnf -y install drbd90-utils kmod-drbd90
systemctl enable --now drbd
}
# SELinux, Firewalld 포트 허용
{
dnf -y install policycoreutils-python-utils
semanage permissive -a drbd_t
firewall-cmd --add-port=6996-7800/tcp --permanent
firewall-cmd --reload
}
■ DRBD 설정
# 설정 파일은 /etc/drbd.d/ 에 넣으면 되며, /etc/drbd.conf 에서 /etc/drbd.d/ 하위의 설정파일을 불러 오는 방법을 쓴다.
[root@dlp ~]# 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";
▶ 스토리지 준비
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 19.1G 0 disk
├─sda1 8:1 0 19G 0 part /
├─sda14 8:14 0 1M 0 part
└─sda15 8:15 0 64M 0 part /boot/efi
sdb 8:16 0 20G 0 disk
# 디스크에 파티션 테이블을 생성
{
parted -s -a optimal -- /dev/sdb mklabel gpt
parted -s -a optimal -- /dev/sdb mkpart primary 0% 100%
}
# 나중에 확장하기 쉽도록 LVM을 사용하여 DRBD용 볼륨 그룹을 생성
{
pvcreate /dev/sdb1
vgcreate drbdpool /dev/sdb1
lvcreate -n drbdata -l100%FREE drbdpool
}
▶ /etc/drbd.d/resource0.res 작성 예시
# 【 /etc/drbd.d/resource0.res 】 - 클러스터에 해당되는 Server #1, Server #2 두 곳에 설정
resource resource0 {
protocol C;
on dlp.test.srv {
device /dev/drbd0;
disk /dev/mapper/drbdpool-drbdata;
address 192.168.219.134:7789;
meta-disk internal;
}
on node01.test.srv {
device /dev/drbd0;
disk /dev/mapper/drbdpool-drbdata;
address 192.168.219.135:7789;
meta-disk internal;
}
}
| 옵션 | 설명 |
|---|---|
| resource | 리소스를 정의하는 블록 |
| protocol | 데이터 전송 프로토콜 지정 A : 로컬 디스크에 쓰기가 끝나고 TCP 버퍼에 데이터를 송신한 시점에서 쓰기작업 완료 (성능을 중시하는 비동기 전송) B : 로컬 디스크에 쓰기가 끝나고 원격 호스트로 데이터가 도달한 시점에서 쓰기작업 완료 (A와 C의 중간) C : 원격 호스트의 디스크에도 쓰기가 완료된 시점에서 쓰기작업 완료 (신뢰성을 중시하는 동기화 전송) |
| on | 호스트마다 리소스를 정의하는 블록 |
| device | DRBD의 논리 블록 디바이스를 지정 |
| disk | 미러링하고자 하는 물리 디바이스를 지정 |
| address | 데이터를 동기화하기 위해 수신 대기할 IP주소와 포트번호를 지정 |
| meta-disk | 메타 데이터를 저장할 디바이스를 지정, internal으로 지정할 경우 disk에서 지정한 블록 디바이스 중 일부를 메타 데이터용으로 확보한다. |
▶ DRDB 리소스 초기화
# DRBD의 메타데이터 초기화 - 두 노드 모두에서 적용
drbdadm create-md resource0
# DRBD 리소스 활성화 - 두 노드 모두에서 적용
drbdadm up resource0
▶ DRBD Primary 생성 - Active 노드
# Active 서버에만 적용
drbdadm primary --force resource0
# DRBD 상태 확인
drbdadm status resource0
# 상태 확인
# On Primary
$ sudo drbdadm status
sudo drbdadm status resource0
resource0 role:Primary
disk:UpToDate
node01.test.srv role:Secondary
peer-disk:UpToDate
# On Secondary
$ sudo drbdadm status resource0
resource0 role:Secondary
disk:UpToDate
dlp.test.srv role:Primary
peer-disk:UpToDate
▶ DRBD 장치 사용 - Active 노드
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 19.1G 0 disk
├─sda1 8:1 0 19G 0 part /
├─sda14 8:14 0 1M 0 part
└─sda15 8:15 0 64M 0 part /boot/efi
sdb 8:16 0 50G 0 disk
└─sdb1 8:17 0 50G 0 part
└─drbdpool-drbdata 253:0 0 50G 0 lvm
└─drbd0 147:1 0 50G 0 disk
# DRBD 장치에 파일 시스템 생성
$ mkfs.xfs /dev/drbd0
meta-data=/dev/drbd0 isize=512 agcount=4, agsize=1310550 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=5242199, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# mount 후 파일 생성
{
mkdir /mnt/mydrbd
mount /dev/drbd0 /mnt/mydrbd
for i in {1..10};
do
sudo touch /mnt/mydrbd/${i}.txt
done
ls -l /mnt/mydrbd
df -hT /mnt/mydrbd/
}
▶ secondary를 primary 전환 - Backup 노드
# Active 노드 -> umount 후, Active 노드를 Secondary로 전환
{
umount /mnt/mydrbd
drbdadm secondary resource0
}
# Backup 노드 -> Backup 노드를 Primary로 전환
{
drbdadm primary resource0
drbdadm status
mkdir /mnt/mydrbd
mount /dev/drbd0 /mnt/mydrbd
df -hT /mnt/mydrbd
ls -lh /mnt/mydrbd/
}
댓글 남기기