【2022年11月版】Ubuntu22.04 上での DRBD によるストレージレプリケーション

# はじめに

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/e2708e2c-99b9-7e8f-5d62-e976cabbe37c.png)

# 前提条件

- 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 とする

# 物理ボリューム、ボリュームグループと論理ボリュームの作成

```terminal
# 物理ボリュームの作成
$ sudo pvcreate /dev/sdb
# ボリュームグループ vg1 の作成 
$ sudo vgcreate vg1 /dev/sdb
# vg1 上に論理ボリューム(100GByte)の作成
$ sudo lvgreate -n lv1 --size 100G vg1
```

# DRBD のインストール

```terminal
$ 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 の設定

- Primary/Secondary 共に

```terminal
$ sudo tee --append /etc/hosts <<EOF > /dev/null
192.168.100.101 node1
192.168.100.102 node2
EOF
```

# DRBD の設定ファイルの作成

- Primary/Secondary 共に

```terminal
$ 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 の起動

- Primary/Secondary 共に

```terminal
$ sudo drbdadm up r0
$ sudo drbdadm status r0
```

# Primary 決定

- Primary だけで

```terminal
$ sudo drbdadm primary r0
$ sudo drbdadm status r0
$ sudo mount /dev/drbd0 /export
```

# Primary -> Secondary 、　Secondary -> Primary

- 元 Primary だけで

```terminal
$ sudo umount /export
$ sudo drbdadm secondary r0
$ sudo drbdadm status r0
```

- 元 Secondary だけで

```terminal
$ sudo drbdadm primary r0
$ sudo drbdadm status r0
$ sudo mount /dev/drbd0 /export
```

# 再起動後の DRBD の起動

- 再起動した側の Primary/Secondary 共に

```terminal
$ sudo drbdadm up r0
$ sudo drbdadm status r0
```

# Primary が逝った、 Secondary を強制的に Primaryに

- Secondary　で

```terminal
$ 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 に

```terminal
$ 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 を確認

```terminal
$ 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 に

```terminal
$ 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 を確認

```terminal
$ 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](https://manpages.ubuntu.com/manpages/jammy/ja/man8/drbdadm.8.html)
[Ubuntu 22.04 man page drbd](https://manpages.ubuntu.com/manpages/jammy/ja/man8/drbd.8.html)

[DRBD9 ユーザーズガイド](https://linbit.com/drbd-user-guide/drbd-guide-9_0-ja/)
[LINSTOR ユーザーズガイド](https://linbit.com/drbd-user-guide/linstor-guide-1_0-ja/)