[Redundancy] 09. 스토리지 서버의 다중화 (DRBD로 미러링 구성)

Date:     Updated:

카테고리:

태그:


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 구성이 지원된다.

1111


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/
}

REDUNDANCY 카테고리 내 다른 글 보러가기

댓글 남기기