VirtualBox, Rocky Linux8.5 でDRBDを動かす

# VirtualBox, Rocky Linux8.5 でDRBDを動かす

## 環境

* VitualBox 6.1.34
* 仮想マシン (Rocky Linux 8.5) * 2つ
  
  | ホスト名 | IPアドレス |
  | :-------: | :-------: |
  | helloworld1 | 192.168.1.14 |
  | helloworld2 | 192.168.1.5 |

## DRBDのインストール(仮想マシン 2台共通)

ELRepoリポジトリからDRBDをインストールします。

### ELRepoリポジトリの登録
```
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# dnf -y install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
```

### DRBDのインストール
```
# dnf install -y drbd90-utils kmod-drbd90
```
インストール後、リブートします。

### ポートの解放
DRBDで使用するポートを解放します。
```
# firewall-cmd --add-port=6996-7800/tcp --permanent
# firewall-cmd --reload
```

## ディスクの準備(仮想マシン 2台共通)
### 仮想ハードディスクの作成

VitualBox Managerでツールを選択します。

![DRDB1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/8efb40c9-ce4d-44d0-29fa-4b412dc90cf2.png)

作成(C)を押下します。

![DRDB2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/36187312-2561-3c4e-83fa-9605c07c3f89.png)


作成ボタンを押下し、仮想ハードディスクを作成します。

VitualBox Managerで　仮想マシンを選択し、設定(S)を押下します。

![DRDB5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/cebb8a0e-6535-b0ba-2d0e-903fb9c057a7.png)


ストレージを選択し、コントローラIDEを選択します。

![DRDB6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/99533111-0961-2fc4-0dfd-f5cc4ee45ab1.png)

ハードディスクの追加ボタンを押下します。

![DRDB7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/f36ab0b7-616c-8c8d-b2f1-a84ad61d7749.png)


先ほど作成した仮想ハードディスクを選択し、選択ボタンを押下します。

![DRDB8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/d547a8fa-a3d9-6d44-2509-34193cc96b75.png)


仮想ハードディスクが追加されていることを確認します。

```
# lsblk
```

```
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0   64G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0   63G  0 part 
  ├─rl-root 253:0    0   41G  0 lvm  /
  ├─rl-swap 253:1    0  2.1G  0 lvm  [SWAP]
  └─rl-home 253:2    0   20G  0 lvm  /home
sdb           8:16   0   10G  0 disk 
sr0          11:0    1 1024M  0 rom  
```

### パーティションの作成
追加した仮想ハードディスクにパーティションを作成します。

```
# parted /dev/sdb mklabel msdos
# parted /dev/sdb mkpart primary 0% 100%
# parted /dev/sdb set 1 lvm on
```

パーティションが作成されていることを確認します。

```
# lsblk
```

```
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0   64G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0   63G  0 part 
  ├─rl-root 253:0    0   41G  0 lvm  /
  ├─rl-swap 253:1    0  2.1G  0 lvm  [SWAP]
  └─rl-home 253:2    0   20G  0 lvm  /home
sdb           8:16   0   10G  0 disk 
└─sdb1        8:17   0   10G  0 part 
sr0          11:0    1 1024M  0 rom 
```

### PV(フィジカルボリューム), VG(ボリュームグループ), LV(ロジカルボリューム)の作成

PV(フィジカルボリューム), VG(ボリュームグループ), LV(ロジカルボリューム)を作成します。

```
# pvcreate /dev/sdb1
# vgcreate pool /dev/sdb1
# lvcreate -n data0 -l 100%FREE pool
```

作成されていることを確認します。

```
# lsblk
```

```
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda              8:0    0   64G  0 disk 
├─sda1           8:1    0    1G  0 part /boot
└─sda2           8:2    0   63G  0 part 
  ├─rl-root    253:0    0   41G  0 lvm  /
  ├─rl-swap    253:1    0  2.1G  0 lvm  [SWAP]
  └─rl-home    253:2    0   20G  0 lvm  /home
sdb              8:16   0   10G  0 disk 
└─sdb1           8:17   0   10G  0 part 
  └─pool-data0 253:3    0   10G  0 lvm  
sr0             11:0    1 1024M  0 rom  
```

## DRBDリソースの定義(仮想マシン 2台共通)
DRBDリソースの定義ファイル　/etc/drbd.d/r0.res を以下の内容で作成します。

```
resource r0 {
	on helloworld1 {
		device /dev/drbd0;
		disk /dev/mapper/pool-data0;
		address 192.168.1.14:7788;
		meta-disk internal;
	}
	on helloworld2 {
		device /dev/drbd0;
		disk /dev/mapper/pool-data0;
		address 192.168.1.5:7788;
		meta-disk internal;
	}
}
```

## DRBDリソースの初期化と有効化(仮想マシン 2台共通)
```
# drbdadm create-md r0
# drbdadm up r0
```

helloworld1で状態を確認
```
# drbdadm status r0
```

```
r0 role:Secondary
  disk:Inconsistent
  helloworld2 role:Secondary
    peer-disk:Inconsistent
```

helloworld2で状態を確認
```
# drbdadm status r0
```

```
r0 role:Secondary
  disk:Inconsistent
  helloworld1 role:Secondary
    peer-disk:Inconsistent
```


## DRBDの同期

helloworld1側をプライマリに昇格させます。

helloworld1側で以下を実施します。

```
# drbdadm primary --force r0
# drbdadm status r0
```

```
r0 role:Primary
  disk:UpToDate
  helloworld2 role:Secondary
    replication:SyncSource peer-disk:Inconsistent done:3.61
```

同期が終了すると以下の表示になります。

helloworld1側

```
r0 role:Primary
  disk:UpToDate
  helloworld2 role:Secondary
    peer-disk:UpToDate
```

helloworld2側

```
r0 role:Secondary
  disk:UpToDate
  helloworld1 role:Primary
    peer-disk:UpToDate
```

## DRBDデバイスを マウントする。(仮想マシン helloworld1側)
helloworld1ホスト側にフォルダ/mnt/drbd0を作成し、/dev/drbd0を/mnt/drbd0にマウントします。
```
# mkfs.xfs /dev/drbd0
# mkdir /mnt/drbd0
# mount /dev/drbd0 /mnt/drbd0
# lsblk
```

```
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda              8:0    0   64G  0 disk 
├─sda1           8:1    0    1G  0 part /boot
└─sda2           8:2    0   63G  0 part 
  ├─rl-root    253:0    0   41G  0 lvm  /
  ├─rl-swap    253:1    0  2.1G  0 lvm  [SWAP]
  └─rl-home    253:2    0   20G  0 lvm  /home
sdb              8:16   0   10G  0 disk 
└─sdb1           8:17   0   10G  0 part 
  └─pool-data0 253:3    0   10G  0 lvm  
    └─drbd0    147:0    0   10G  0 disk /mnt/drbd0
```



## ファイルを作成する。(仮想マシン helloworld1側)
/mnt/drbd0フォルダにファイルを作成します。

```
# echo "Hello World 1" > /mnt/drbd0/helloworld1.txt
# cat /mnt/drbd0/helloworld1.txt
```

```
Hello World 1
```

## セカンダリホスト側(helloworld2)を昇格させ、ファイルが作成されていることを確認する。(仮想マシン helloworld2側)

helloworld1側の DRBDデバイスをアンマウントし、セカンダリに降格させます。

```
# umount /mnt/drbd0
# drbdadm secondary r0
# drbdadm status r0 
```

```
r0 role:Secondary
  disk:UpToDate
  helloworld2 role:Secondary
    peer-disk:UpToDate
```

helloworld2側をプライマリに昇格させて、DRBDデバイスをマウントします。

以下のコマンドを実施し、プライマリに昇格させます。
```
# drbdadm primary r0
# drbdadm status r0
```

```
r0 role:Primary
  disk:UpToDate
  helloworld1 role:Secondary
    peer-disk:UpToDate
```

/mnt/drbd0 フォルダを作成し、DRBDデバイスをマウントします。

```
# mkdir /mnt/drbd0
# mount /dev/drbd0 /mnt/drbd0
# ls /mnt/drbd0
```

hellowrold1.txtが存在していることが分かります。
```
helloworld1.txt
```

## 参照情報
https://abelog.tech/archives/91