DRBD によるブロックデバイスの冗長化 (Alma Linux)

構成図

Linux クラスタにおいて、ストレージ専用のネットワークを利用して DRBD によるブロックストレージの冗長化を行う。

DRBD

Alma Linux 2台のそれぞれで DRBD を使用してブロックストレージの同期を行う。
この時、ストレージはOSとは別に追加した「vdb」を追加し、「LVM」として利用する。

Storage Device/dev/vdb
Physical Volume/dev/vdb1
Volume Groupdrbd-vg
Logical Volumeroot
LVM 設定
Resourcer0
Volume Number0
 DRBD Device/dev/drbd0
 Local Block Device/dev/mapper/drbd–vg-root
 Meta Diskinternal
※下位レベルデバイスに
データとメタデータを保存
Encrypted Replication暗号化なし
Network Port7788/TCP
DRBD 設定
OSAlma Linux 9.3Alma Linux 9.3
ホスト名alma-01alma-02
インタフェースenp2s0enp2s0
IP アドレス192.168.100.1/24192.168.100.2/24
Linux クラスタ

Storage Device の準備

まず初めに DRBD に使用するための LVM ボリュームを Linux クラスタそれぞれで準備する。

# parted /dev/vdb
GNU Parted 3.5
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) mklabel msdos
Warning: The existing disk label on /dev/vdb will be destroyed and all data on this disk will be lost. Do you want to
continue?
Yes/No? yes

(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags

(parted) mkpart primary 0% 100%
(parted) set 1 lvm on
(parted) quit

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 20G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 19G 0 part
├─almalinux-root 253:0 0 18G 0 lvm /
└─almalinux-swap 253:1 0 1G 0 lvm [SWAP]
vdb 252:16 0 5G 0 disk
└─vdb1 252:17 0 5G 0 part

# fdisk -l /dev/vdb
Disk /dev/vdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x075adb9c

Device Boot Start End Sectors Size Id Type
/dev/vdb1 2048 10485759 10483712 5G 8e Linux LVM

次に、LVM の各ボリュームを作成する。これも Linux クラスタでそれぞれ作成する。

# pvcreate /dev/vdb1
Physical volume "/dev/vdb1" successfully created.

# vgcreate drbd-vg /dev/vdb1
Volume group "drbd-vg" successfully created

# lvcreate --name root -l 100%FREE drbd-vg
Logical volume "root" created.

# lvdisplay --devices /dev/vdb1
--- Logical volume ---
LV Path /dev/drbd-vg/root
LV Name root
VG Name drbd-vg
LV UUID xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxxxx
LV Write Access read/write
LV Creation host, time alma-01.net.home, 2024-02-25 20:40:07 +0900
LV Status available
# open 0
LV Size <5.00 GiB
Current LE 1279
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 20G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 19G 0 part
├─almalinux-root 253:0 0 18G 0 lvm /
└─almalinux-swap 253:1 0 1G 0 lvm [SWAP]
vdb 252:16 0 5G 0 disk
└─vdb1 252:17 0 5G 0 part
└─drbd--vg-root 253:2 0 5G 0 lvm

# dmsetup table
almalinux-root: 0 37740544 linear 252:2 2048
almalinux-swap: 0 2097152 linear 252:2 37742592
drbd--vg-root: 0 10477568 linear 252:17 2048

# ll /dev/mapper/
total 0
lrwxrwxrwx. 1 root root 7 Apr 20 00:35 almalinux-root -> ../dm-0
lrwxrwxrwx. 1 root root 7 Apr 20 00:35 almalinux-swap -> ../dm-1
crw-------. 1 root root 10, 236 Apr 20 00:35 control
lrwxrwxrwx. 1 root root 7 Apr 20 00:35 drbd--vg-root -> ../dm-2

Firewalld の設定

事前に Firewalld にて DRBD に使用するインタフェースを「trusted」ゾーンに変更する。
※ Linux クラスタ2台両方で設定を実施

# nmcli connection show enp2s0 | grep connection.zone
connection.zone: --
# nmcli connection modify enp2s0 connection.zone trusted
# nmcli connection show enp2s0 | grep connection.zone
connection.zone: trusted

# nmcli connection down enp2s0; nmcli connection up enp2s0

DRBD のインストール

kmod-drbd9x はレポジトリ登録が必要。

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# dnf install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
# dnf install kmod-drbd9x drbd

# drbdadm --version
DRBDADM_BUILDTAG=GIT-hash:\ fdd9a4d603a9dc99d110d8bd0e288d7c0b6f586e\ build\ by\ mockbuild@99a87936d6eb4e6c850cb99141c0f9b5\,\ 2023-12-23\ 14:38:17
DRBDADM_API_VERSION=2
DRBD_KERNEL_VERSION_CODE=0x090113
DRBD_KERNEL_VERSION=9.1.19
DRBDADM_VERSION_CODE=0x091b00
DRBDADM_VERSION=9.27.0

DRBD のリソース作成

DRBD のリソースファイルを作成する。リソースファルは Linux クラスタ 2台でそれぞれ作成する。

# cd /etc/drbd.d/
# vim r0.res

resource "r0" {
volume 0 {
device minor 0;
disk "/dev/mapper/drbd--vg-root";
meta-disk internal;
}
on "alma-01" {
node-id 0;
}
on "alma-02" {
node-id 1;
}
connection {
host "alma-01" address 192.168.100.1:7788;
host "alma-02" address 192.168.100.2:7788;
}
}

作成したリソースファイルからメタデータを生成する。こちらも Linux クラスタ 2台でそれぞれ作成する。

# drbdadm create-md r0
initializing activity log
initializing bitmap (160 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.

再フォーマットなどで再度作成した場合は、以前のメタデータが残っているためエラーとなる。この様な場合は、ファイルシステムを一旦「xfs」等でフォーマットし、その後DD等で一旦ファイルシステムを消去することでメタデータの作成が可能となる。

# drbdadm create-md r0
md_offset 5364510720
al_offset 5364477952
bm_offset 5364314112

Found xfs filesystem
5238784 kB data area apparently used
5238588 kB left usable by current configuration

Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
* use external meta data (recommended)
* shrink that filesystem first
* zero out the device (destroy the filesystem)
Operation refused.

Command 'drbdmeta 0 v09 /dev/mapper/drbd--vg-root internal create-md 1' terminated with exit code 40

# mkfs.xfs /dev/mapper/drbd--vg-root -f
meta-data=/dev/mapper/drbd--vg-root isize=512 agcount=4, agsize=327424 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=1309696, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.

# dd if=/dev/zero of=/dev/mapper/drbd--vg-root bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0112855 s, 92.9 MB/s

DRBD のサービスを自動起動するようにし、サービス起動する。
※ 「systemctl」コマンドで起動すると、 DRBD がお互いに接続するまでコマンド待機中になることに注意

# systemctl enable drbd

[root@alma-01 ~]# drbdadm up r0
[root@alma-02 ~]# drbdadm up r0

DRBD の片方を強制的に【Primary】にする。これにより同期が始まる。

[root@alma-01 ~]# drbdadm status r0
r0 role:Secondary
disk:Inconsistent
alma-01 role:Secondary
peer-disk:Inconsistent

[root@alma-02 ~]# drbdadm status r0
r0 role:Secondary
disk:Inconsistent
alma-01 role:Secondary
peer-disk:Inconsistent

[root@alma-01 ~]# drbdadm primary r0 --force
[root@alma-01 ~]# drbdadm status r0
r0 role:Primary
disk:UpToDate
alma-02 role:Secondary
replication:SyncSource peer-disk:Inconsistent done:9.19

[root@alma-02 ~]# drbdadm status r0
r0 role:Secondary
disk:Inconsistent
alma-01 role:Primary
replication:SyncTarget peer-disk:UpToDate done:37.61

同期後は以下の状態となる。

[root@alma-01 ~]# drbdadm status r0
r0 role:Primary
disk:UpToDate
alma-02 role:Secondary
peer-disk:UpToDate

[root@alma-02 ~]# drbdadm status r0
r0 role:Secondary
disk:UpToDate
alma-01 role:Primary
peer-disk:UpToDate

また、 DRBD デバイスが表示されることを確認する。

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 20G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 19G 0 part
├─almalinux-root 253:0 0 18G 0 lvm /
└─almalinux-swap 253:1 0 1G 0 lvm [SWAP]
vdb 252:16 0 5G 0 disk
└─vdb1 252:17 0 5G 0 part
└─drbd--vg-root 253:2 0 5G 0 lvm
└─drbd0 147:1 0 5G 0 disk

DRBD デバイスのファイルシステムを作成し、マウントが出来ることを確認する。

[root@alma-01 ~]# mkfs.xfs /dev/drbd0
meta-data=/dev/drbd0 isize=512 agcount=4, agsize=327412 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=1309647, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.

[root@alma-01 ~]# mount -t xfs /dev/drbd0 /mnt
[root@alma-01 ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 385M 48M 338M 13% /dev/shm
tmpfs tmpfs 154M 3.9M 151M 3% /run
/dev/mapper/almalinux-root xfs 18G 3.4G 15G 19% /
/dev/vda1 xfs 960M 362M 599M 38% /boot
tmpfs tmpfs 77M 0 77M 0% /run/user/0
/dev/drbd0 xfs 5.0G 68M 4.9G 2% /mnt

DRBD の切り替え(手動)

DRBD デバイスのマウントを解除すると、自動プロビジョニングにより「Primary」から「Secondary」に降格するため、マウントコマンドにて切り替えが可能。まずは、自動プロビジョニングを有効にするため、一旦「Secondary」状態にする。
※ 「drbdadm primary」コマンドで「primary」にした場合は自動プロビジョニングが動作しない

[root@alma-01 ~]# umount /mnt
[root@alma-01 ~]# drbdadm status
r0 role:Primary
disk:UpToDate
alma-h02 role:Secondary
peer-disk:UpToDate

[root@alma-01 ~]# drbdadm secondary r0
[root@alma-01 ~]# drbdadm status
r0 role:Secondary
disk:UpToDate
alma-h02 role:Secondary
peer-disk:UpToDate

[root@alma-02 ~]# drbdadm status
r0 role:Secondary
disk:UpToDate
alma-h01 role:Secondary
peer-disk:UpToDate

「Primary」側で DRBD デバイスをマウントし、ファイルを作成する。

[root@alma-01 ~]# mount -t xfs /dev/drbd0 /mnt
[root@alma-01 ~]# drbdadm status
r0 role:Primary
disk:UpToDate
alma-h02 role:Secondary
peer-disk:UpToDate

[root@alma-01 ~]# echo aaa > /mnt/test01.txt
[root@alma-01 ~]# ll /mnt/
total 4
-rw-r--r--. 1 root root 4 Apr 20 03:31 test01.txt

「Primary」側で DRBD デバイスをアンマウントし、「Secondary」側でマウントして作成したファイルを確認する。

[root@alma-01 ~]# umount /mnt
[root@alma-01 ~]# drbdadm status
r0 role:Secondary
disk:UpToDate
alma-h02 role:Secondary
peer-disk:UpToDate

[root@alma-02 ~]# mount -t xfs /dev/drbd0 /mnt
[root@alma-02 ~]# drbdadm status
r0 role:Primary
disk:UpToDate
alma-h01 role:Secondary
peer-disk:UpToDate
[root@alma-02 ~]# ll /mnt/
total 4
-rw-r--r--. 1 root root 4 Apr 20 03:31 test01.txt
[root@alma-h02 ~]# cat /mnt/test01.txt
aaa

参考URL
HAクラスタをDRBDとPacemakerで作ってみよう [DRBD編]
HAクラスタをDRBDとPacemakerで作ってみよう [Pacemaker編]
The DRBD9 User’s Guide
DRBDの構築について