🪞

Debian11 で DRBD

2023/08/09に公開

準備

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
GitHubで編集を提案

Discussion