はじめに
- 絶対に1ミリでもなくしてはいけないデータを手軽に管理したい
- 共有ディスクによるレプリケーションはお高い・・・ソフトウェアでできないものか
- オンプレだけでなく、AWS上でもレプリケーションしたい
- EBS利用である程度保証されるが、A-Zをまたいでストレージレプリケーションしたい
- そうだ DRBD しよう

前提条件
- 2台の ubuntu 22.04
- Primary を node1、Secndary を node2 とする
- Primary/Secondary 共に /dev/sda をシステム、/dev/sdb をストレージレプリケーションとして利用
- node1 の IPアドレスは 192.168.100.101 とする
- node2 の IPアドレスは 192.168.100.102 とする
- マウント先は /export とする
物理ボリューム、ボリュームグループと論理ボリュームの作成
# 物理ボリュームの作成
$ sudo pvcreate /dev/sdb
# ボリュームグループ vg1 の作成
$ sudo vgcreate vg1 /dev/sdb
# vg1 上に論理ボリューム(100GByte)の作成
$ sudo lvgreate -n lv1 --size 100G vg1
DRBD のインストール
$ sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
$ sudo apt update
$ sudo apt install drbd-utils drbd-dkms
$ sudo modprobe drbd
$ cat /proc/drbd
version: 9.2.1 (api:2/proto:86-121)
GIT-hash: ######################################## build by #########, 2022-11-20 07:38:13
Transports (api:18):
hosts の設定
$ sudo tee --append /etc/hosts <<EOF > /dev/null
192.168.100.101 node1
192.168.100.102 node2
EOF
DRBD の設定ファイルの作成
$ sudo tee /etc/drbd.d/r0.res <<EOF > /dev/null
resource r0 {
options
{
quorum majority;
on-no-quorum io-error;
}
volume 0
{
disk /dev/vg1/lv1;
meta-disk internal;
device minor 0;
}
on node1
{
node-id 0;
}
on node2
{
node-id 1;
}
connection
{
net
{
protocol C;
}
host node1 address ipv4 192.168.100.101:7788;
host node2 address ipv4 192.168.100.102:7788;
}
}
EOF
DRBD の起動
$ sudo drbdadm up r0
$ sudo drbdadm status r0
Primary 決定
$ sudo drbdadm primary r0
$ sudo drbdadm status r0
$ sudo mount /dev/drbd0 /export
Primary -> Secondary 、 Secondary -> Primary
$ sudo umount /export
$ sudo drbdadm secondary r0
$ sudo drbdadm status r0
$ sudo drbdadm primary r0
$ sudo drbdadm status r0
$ sudo mount /dev/drbd0 /export
再起動後の DRBD の起動
- 再起動した側の Primary/Secondary 共に
$ sudo drbdadm up r0
$ sudo drbdadm status r0
Primary が逝った、 Secondary を強制的に Primaryに
$ sudo drbdadm --force primary r0
$ sudo drbdadm status r0
$ sudo mount /dev/drbd0 /export
- 元 Primary が復帰し、up した時点で自動的に Secondary となる
再フォーマットしても反映されるかテスト
- node1(Primary) で /export/abcd/test1.txt を作成
- node1(Primary) を降格して Secondary に
$ cd /export
$ mkdir abcd
$ cd abcd
$ date >> test1.txt
$ cd
$ sudo umount /export
$ sudo drbdadm secondary r0
$ sudo drbdadm status r0
- node2(Secondary) を 昇格して Primary に
- node2(Primary) で /export/abcd/test1.txt を確認
$ sudo drbdadm primary r0
$ sudo drbdadm status r0
$ sudo mount /dev/drbd0 /export
$ cd /export
$ cd abcd
$ cat test1.txt
- node2(Primary) で ファイルシステムをフォーマット
- dd で先頭を飛ばしてフォーマットできるようにする
- abcd ディレクトリがなくなっていることを確認
- /export/1111/test2.txt を作成
- node2(Primary) を Secondary に
$ cd
$ sudo umount /export
$ sudo dd if=/dev/zero of=/dev/drbd0 bs=1M count=1
$ sudo mkfs -t ext4 /dev/drbd0
$ sudo mount /dev/drbd0 /export
$ cd /export
$ cd abcd
-bash: cd: abcd: No such file or directory
$ mkdir 1111
$ cd 1111
$ date >> test2.txt
$ sudo umount /export
$ cd
$ sudo drbdadm secondary r0
$ sudo drbdadm status r0
- node1(Secondary) を 昇格して Primary に
- node1(Primary) で /export/1111/test2.txt を確認
$ sudo drbdadm primary r0
$ sudo drbdadm status r0
$ sudo mount /dev/drbd0 /export
$ cd /export
$ cd 1111
$ cat test2.txt
さいごに
参考
Ubuntu 22.04 man page drbdadm
Ubuntu 22.04 man page drbd
DRBD9 ユーザーズガイド
LINSTOR ユーザーズガイド