🪞
Debian11 で DRBD
準備
https://zenn.dev/mnod/articles/946ea1823ef680 の環境を利用します。
利用するパーティションを作成しておきます。
パーティションテーブルを作成し、パーティションを切ります。
# apt install --no-install-recommends parted
# parted /dev/vdb print
Error: /dev/vdb: unrecognised disk label
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
# parted /dev/vdb mklabel msdos
Information: You may need to update /etc/fstab.
# parted /dev/vdb mkpart primary 0% 33%
Information: You may need to update /etc/fstab.
# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1418MB 1417MB primary
初期化
両ノードで実行します。
必要なパッケージをインストールします。
# DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends drbd-utils
カーネルモジュールをロードします。
# lsmod | grep drbd
# modprobe drbd
# lsmod | grep drbd
drbd 421888 0
lru_cache 16384 1 drbd
libcrc32c 16384 1 drbd
設定ファイルを作成します。
/etc/drbd.d/r0.res
resource r0 {
volume 0 {
device /dev/drbd0;
disk /dev/vdb1;
meta-disk internal;
}
on debian11-0 {
address ipv4 10.2.1.240:7789;
}
on debian11-1 {
address ipv4 10.2.1.241:7789;
}
}
ディスクを初期化します。
# drbdadm create-md r0
initializing activity log
initializing bitmap (44 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
# systemctl start drbd
# drbdadm status r0
r0 role:Secondary
disk:Inconsistent
peer role:Secondary
replication:Established peer-disk:Inconsistent
以上、ここまでを両ノードで実施します。
昇格
Primary としたい側で以下を実行します。
# drbdadm primary --force r0
同期が開始します。
同期開始直後の状態。
# drbdadm status r0
r0 role:Primary
disk:UpToDate
peer role:Secondary
replication:SyncSource peer-disk:Inconsistent done:3.55
# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 32DFEF1F0DADCBF174877F7
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:117984 nr:0 dw:0 dr:117984 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1265360
[>...................] sync'ed: 8.9% (1265360/1383344)K
finish: 0:03:02 speed: 6,940 (6,940) K/sec
同期完了後の状態
# drbdadm status r0
r0 role:Primary
disk:UpToDate
peer role:Secondary
replication:Established peer-disk:UpToDate
# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 32DFEF1F0DADCBF174877F7
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:1383344 nr:0 dw:0 dr:1383344 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
セカンダリ側の状態
# drbdadm status r0
r0 role:Secondary
disk:UpToDate
peer role:Primary
replication:Established peer-disk:UpToDate
# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 32DFEF1F0DADCBF174877F7
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:1383344 dw:1383344 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
パーティションの利用
プライマリ側で、ファイルシステム作成
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sr0 11:0 1 1024M 0 rom
vda 254:0 0 16G 0 disk
├─vda1 254:1 0 15G 0 part /
├─vda2 254:2 0 1K 0 part
└─vda5 254:5 0 975M 0 part [SWAP]
vdb 254:16 0 4G 0 disk
└─vdb1 254:17 0 1.3G 0 part
└─drbd0 147:0 0 1.3G 0 disk
# mkfs -t ext4 /dev/drbd0
mke2fs 1.46.2 (28-Feb-2021)
Discarding device blocks: done
Creating filesystem with 345836 4k blocks and 86592 inodes
Filesystem UUID: da2359f5-4671-4d37-8253-1741452ec3c9
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
ファイル書き込みテスト
# mount /dev/drbd0 /mnt
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/drbd0 1.3G 24K 1.2G 1% /mnt
# echo Hello World > /mnt/helloworld.txt
# ls -l /mnt/helloworld.txt
-rw-r--r-- 1 root root 12 Aug 6 03:35 /mnt/helloworld.txt
# umount /mnt
降格
プライマリ側でコマンドを投入して降格します。
# drbdadm secondary r0
# drbdadm status r0
r0 role:Secondary
disk:UpToDate
peer role:Secondary
replication:Established peer-disk:UpToDate
昇格
セカンダリ系でコマンドを投入して、昇格します。
# drbdadm status r0
r0 role:Secondary
disk:UpToDate
peer role:Secondary
replication:Established peer-disk:UpToDate
# drbdadm primary r0
# drbdadm status r0
r0 role:Primary
disk:UpToDate
peer role:Secondary
replication:Established peer-disk:UpToDate
マウントしてテストしてみます。
# mount /dev/drbd0 /mnt
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/drbd0 1.3G 28K 1.2G 1% /mnt
# ls -l /mnt/helloworld.txt
-rw-r--r-- 1 root root 12 Aug 6 03:35 /mnt/helloworld.txt
# echo Hello another world > /mnt/helloworld1.txt
# ls -l /mnt/*txt
-rw-r--r-- 1 root root 20 Aug 6 03:38 /mnt/helloworld1.txt
-rw-r--r-- 1 root root 12 Aug 6 03:35 /mnt/helloworld.txt
# umount /mnt
降格
# drbdadm status r0
r0 role:Primary
disk:UpToDate
peer role:Secondary
replication:Established peer-disk:UpToDate
# drbdadm secondary r0
# drbdadm status r0
r0 role:Secondary
disk:UpToDate
peer role:Secondary
replication:Established peer-disk:UpToDate
Dual Primary
OCFS2を利用して、両ノードで同時に書き込み・読み込みできる環境を作ってみます。
準備
両ノードでパーティションを作成します。
# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1418MB 1417MB primary ext4
# parted /dev/vdb mkpart primary 33% 66%
Information: You may need to update /etc/fstab.
# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1418MB 1417MB primary ext4
2 1418MB 2834MB 1417MB primary
初期化
両ノードで実施します。
設定ファイルを作成します。
/etc/drbd.d/r1.res
resource r1 {
net {
allow-two-primaries yes;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
volume 1 {
device /dev/drbd1;
disk /dev/vdb2;
meta-disk internal;
}
on debian11-2 {
address ipv4 10.2.1.242:7790;
}
on debian11-3 {
address ipv4 10.2.1.243:7790;
}
}
ディスクを初期化します。
# drbdadm create-md r1
initializing activity log
initializing bitmap (44 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
# drbdadm up r1
# drbdadm status r1
r1 role:Secondary
volume:1 disk:Inconsistent
peer role:Secondary
volume:1 replication:Established peer-disk:Inconsistent
以上、ここまでを両系で実施します。
昇格
まずは片系で以下を実行します。
# drbdadm primary --force r1
# drbdadm status r1
r1 role:Primary
volume:1 disk:UpToDate
peer role:Secondary
volume:1 replication:SyncSource peer-disk:Inconsistent done:2.45
# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 32DFEF1F0DADCBF174877F7
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:1384264 nr:112 dw:1438908 dr:1385573 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:167616 nr:0 dw:0 dr:167616 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1215728
[=>..................] sync'ed: 12.5% (1215728/1383344)K
finish: 0:02:31 speed: 7,980 (7,980) K/sec
同期完了後の状態
# drbdadm status r1
r1 role:Primary
volume:1 disk:UpToDate
peer role:Secondary
volume:1 replication:Established peer-disk:UpToDate
# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 32DFEF1F0DADCBF174877F7
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:1384264 nr:112 dw:1438908 dr:1385573 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:1383344 nr:0 dw:0 dr:1383344 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
もう片方のノードの状態
# drbdadm status r1
r1 role:Secondary
volume:1 disk:UpToDate
peer role:Primary
volume:1 replication:Established peer-disk:UpToDate
# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 32DFEF1F0DADCBF174877F7
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:112 nr:1384264 dw:2822252 dr:1109 al:12 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:1383344 dw:1383344 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
もう片方のノードでもコマンドを投入して、昇格します。
# drbdadm primary r1
# drbdadm status r1
r1 role:Primary
volume:1 disk:UpToDate
peer role:Primary
volume:1 replication:Established peer-disk:UpToDate
# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 32DFEF1F0DADCBF174877F7
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:112 nr:1384264 dw:2822252 dr:1109 al:12 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:1383344 dw:1383344 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
反対側ノードでの状態
# drbdadm status r1
r1 role:Primary
volume:1 disk:UpToDate
peer role:Primary
volume:1 replication:Established peer-disk:UpToDate
# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 32DFEF1F0DADCBF174877F7
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:1384264 nr:112 dw:1438908 dr:1385573 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r-----
ns:1383344 nr:0 dw:0 dr:1383344 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
OCFS2
両ノードで実施します。
パッケージをインストールします。
# apt install --no-install-recommends ocfs2-tools
設定ファイルを作成します。
/etc/ocfs2/cluster.conf
cluster:
node_count = 2
name = ocfs2
node:
ip_port = 7777
ip_address = 10.2.1.240
number = 0
name = debian11-0
cluster = ocfs2
node:
ip_port = 7777
ip_address = 10.2.1.241
number = 1
name = debian11-1
cluster = ocfs2
サービスの再設定
# dpkg-reconfigure ocfs2-tools
(起動時にサービス起動する以外はデフォルト)
# grep -E -v '^#|^$' /etc/default/o2cb
O2CB_ENABLED=true
O2CB_BOOTCLUSTER=ocfs2
O2CB_HEARTBEAT_THRESHOLD=31
O2CB_IDLE_TIMEOUT_MS=30000
O2CB_KEEPALIVE_DELAY_MS=2000
O2CB_RECONNECT_DELAY_MS=2000
サービスを再起動します。
# systemctl restart o2cb
ここまで、両ノードで実施します。
OCFS2 ファイルシステム作成
片系でファイルシステム作成します。
# mkfs.ocfs2 -L ocfs2 /dev/drbd1
mkfs.ocfs2 1.8.6
Cluster stack: classic o2cb
Label: ocfs2
Features: sparse extended-slotmap backup-super unwritten inline-data strict-journal-super xattr indexed-dirs refcount discontig-bg append-dio
Block size: 4096 (12 bits)
Cluster size: 4096 (12 bits)
Volume size: 1416544256 (345836 clusters) (345836 blocks)
Cluster groups: 11 (tail covers 23276 clusters, rest cover 32256 clusters)
Extent allocator size: 4194304 (1 groups)
Journal size: 67108864
Node slots: 2
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 1 block(s)
Formatting Journals: done
Growing extent allocator: done
Formatting slot map: done
Formatting quota files: done
Writing lost+found: done
mkfs.ocfs2 successful
両系でマウントします。
# mount /dev/drbd1 /mnt
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/drbd1 1.4G 143M 1.2G 11% /mnt
片系でファイルを作成してみます。
# echo Hello World > /mnt/helloworld.txt
# ls -l /mnt/*txt
-rw-r--r-- 1 root root 12 Aug 6 04:28 /mnt/helloworld.txt
作成したファイルを反対側ノードで確認します。
また、こちらでもファイルを作成してみます。
# ls -l /mnt/*txt
-rw-r--r-- 1 root root 12 Aug 6 04:28 /mnt/helloworld.txt
# cat /mnt/helloworld.txt
Hello World
# echo Hello Another World > /mnt/helloworld1.txt
# ls -l /mnt/*txt
-rw-r--r-- 1 root root 20 Aug 6 04:29 /mnt/helloworld1.txt
-rw-r--r-- 1 root root 12 Aug 6 04:28 /mnt/helloworld.txt
Discussion