CentOS7.4でDRBD8.4を構築してみた

CentOS7.4でDRBD8.4を構築したときのメモです。

## 構成

|項目      |VM1      |VM2      |
|----------|---------|---------|
|OS        |CentOS7.4|CentOS7.4|
|ソフトウェア|DRBD8.4 |DRBD8.4 |
|IPアドレス |192.168.33.10|192.168.33.20|
|同期するディスク|/dev/sdb (5GB)|/dev/sdb (5GB)|

## 事前作業

以下、手順を実施して、２台構成の準備と同期用のディスクを準備しています。

- [VirtualBox/vagrantで２台サーバ構成の検証環境を作成する](https://qiita.com/y_marito/items/61f93b78af9d4735910a)
- [VirtualBoxの仮想HDD追加](https://qiita.com/y_marito/items/6460311353a5b3c36766)

firewallは本手順実施時は止めています。もしfirewalldが動作している場合はTCPポート7788を許容するように設定する。

## 手順

### /etc/hostsファイルの設定(VM1,VM2で実施)

```bash:terminal
[root@VM1 ~]# echo "192.168.33.10 VM1" >> /etc/hosts
[root@VM1 ~]# echo "192.168.33.20 VM2" >> /etc/hosts
```

### ELRepoのrepoファイルのインストール(VM1,VM2で実施)

drbdパッケージはELRepoにあるので、ELRepoのrepoファイルを事前にインストールします。

```bash:terminal
[root@VM1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@VM1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm を取得中
準備しています...                             ################################# [100%]
更新中 / インストール中...
   1:elrepo-release-7.0-3.el7.elrepo          ################################# [100%]
```

### パッケージのインストール(VM1,VM2で実施)

パッケージ(drbd84-utils,kmod-drbd84)をインストールする。

```bash:terminal
[root@VM1 ~]# yum install -y drbd84-utils
~省略~
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ drbd84-utils.x86_64 0:9.6.0-1.el7.elrepo を インストール
--> 依存性解決を終了しました。

依存性を解決しました

==============================================
 Package
       アーキテクチャー
              バージョン         リポジトリー
                                         容量
==============================================
インストール中:
 drbd84-utils
       x86_64 9.6.0-1.el7.elrepo elrepo 591 k

トランザクションの要約
==============================================
インストール  1 パッケージ

総ダウンロード容量: 591 k
インストール容量: 1.4 M
Downloading packages:
drbd84-utils-9.6.0-1.el7 | 591 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告: RPMDB は yum 以外で変更されました。
  インストール中          : drbd84-util   1/1 
  検証中                  : drbd84-util   1/1 

インストール:
  drbd84-utils.x86_64 0:9.6.0-1.el7.elrepo    

完了しました!

[root@VM1 ~]# yum install -y kmod-drbd84
~省略~
インストール:
  kernel.x86_64 0:3.10.0-957.1.3.el7          
  kmod-drbd84.x86_64 0:8.4.11-1.1.el7_6.elrepo

更新:
  selinux-policy-targeted.noarch 0:3.13.1-229.el7_6.6

依存性を更新しました:
  libselinux.x86_64 0:2.5-14.1.el7            
  libselinux-python.x86_64 0:2.5-14.1.el7     
  libselinux-utils.x86_64 0:2.5-14.1.el7      
  libsemanage.x86_64 0:2.5-14.el7             
  libsemanage-python.x86_64 0:2.5-14.el7      
  libsepol.x86_64 0:2.5-10.el7                
  linux-firmware.noarch 0:20180911-69.git85c5d90.el7
  policycoreutils.x86_64 0:2.5-29.el7         
  policycoreutils-python.x86_64 0:2.5-29.el7  
  selinux-policy.noarch 0:3.13.1-229.el7_6.6  
  setools-libs.x86_64 0:3.3.8-4.el7           

完了しました!


```

### リソースの作成(VM1,VM2で実施)

リソースの設定ファイルを新規に作成します(*.resファイル)。r1はリソース名（任意の名前）を表します。

```bash:terminal
[root@VM1 ~]# vi /etc/drbd.d/drbd1.res
[root@VM1 ~]# cat /etc/drbd.d/drbd1.res 
resource r1 {
  device    /dev/drbd1;
  disk      /dev/sdb;
  meta-disk internal;
  on VM1 {
    address   192.168.33.10:7788;
  }
  on VM2 {
    address   192.168.33.20:7788;
  }
}
```

### リソースの有効化
####メタデータの作成(VM1,VM2で実施)

この手順は初めてDRBDを起動するときにだけ必要な操作です。

```bash:terminal
[root@VM1 ~]# drbdadm create-md r1
modinfo: ERROR: Module drbd not found.
modinfo: ERROR: Module drbd not found.
initializing activity log
initializing bitmap (160 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
```

```ERROR: Module drbd not found.```が表示されるが、kernelのupdateの反映がされていないため上記エラーが発生している（と想定された）。一旦、rebootを実施すれば問題なし。

####リソースの有効化(VM1,VM2で実施)

```bash:terminal
[root@VM1 ~]# drbdadm up r1
  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 8699th user to install this version
```

以上で、drbdのインストールまで完了。次で状態確認してみる。

####状態の確認(VM1 or VM2で実施(どちらでやっても内容変わらず))
```bash:terminal
[root@VM1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55

 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5242684
```

表示内容の補足
 
|項目|表示上の値|説明|
|---|---|---|
|cs |Connected | 接続状態(両系接続とれている状態になっている。) |
|ro |Secondary/Secondary | ノードのロール(左が自ホストで、右が相手ホストの状態を表す。起動した時点では両方Secondary) |
|ds |Inconsistent/Inconsistent  | ディスク状態( Inconsistentはデータが一致しない状態。新規リソースを作成した直後に(初期フル同期の前に)両方のノードがこの状態になる。) |

### データ同期

VM1を同期元、VM2を同期先としてデータレプリケーションします。
が、何もないデータ同期しても意味ないのでスキップします。
*もし、時間がかかってもいいのであればVM1で```drbdadm primary --force r1```を実施すればOK。

#### 初期同期をスキップ(VM1で実施)

```bash:terminal
[root@VM1 ~]# drbdadm new-current-uuid --clear-bitmap r1/0
[root@VM1 ~]# cat /proc/drbd 
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55

 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
```
dsが```UpToDate/UpToDate```になっているので同期完了。

### VM1のPrimary昇格(VM1で実施)

```bash:terminal
[root@VM1 ~]# drbdadm primary r1
[root@VM1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55

 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:2096 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
```

```ro:Secondary/Secondary```から```ro:Primary/Secondary```に変わる。なお、Secondary側で```cat /proc/drbd```実行すると```ro:Secondary/Primary```となります。

また、この段階でPrimaryになったサーバは```/dev/drbd1```が作成される。```/dev/drbd1```はブロックストレージのように使用できるのでフォーマットを実施して使えるようにする。

### ファイルシステム作成(VM1で実施)

```bash:terminal
[root@VM1 ~]# mkfs.xfs /dev/drbd1
meta-data=/dev/drbd1             isize=512    agcount=4, agsize=327668 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310671, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```
### 動作確認してみる！

#### VM1(primary)でテスト用ファイルの作成

drbd1デバイスをマウント

```bash:terminal
[root@VM1 ~]# mount /dev/drbd1 /mnt/
```

マウントしたデバイスに作成したファイルにデータを書き込む。

```bash:terminal
[root@VM1 ~]# echo 12345 > /mnt/test.txt
[root@VM1 ~]# cat /mnt/test.txt
12345
```
#### primaryをVM2に変更

drbd1デバイスをアンマウント

```bash:terminal
[root@VM1 ~]# umount /mnt/
```

VM1をsecondaryに変更

```bash:terminal
[root@VM1 ~]# drbdadm secondary r1
[root@VM1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55

 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:12692 nr:0 dw:12692 dr:5283 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
```

VM2をprimaryに変更

```bash:terminal
[root@VM2 ~]# drbdadm primary r1
```

drbd1デバイスをマウント

```bash:terminal
[root@VM2 ~]# mount /dev/drbd1 /mnt/
```

VM1で書き込んだデータがVM2でも読み込めることを確認する。

```bash:terminal
[root@VM2 ~]# cat /mnt/test.txt
12345
```


## 参考サイト
- [DRBD8.4の構築手順](https://qiita.com/hana_shin/items/f68411f375aa1594167c#1-%E7%92%B0%E5%A2%83)
- [パート III. DRBDの使い方](https://blog.3ware.co.jp/drbd-users-guide-8.3/ch-admin.html)
- [DRBDをCentOS7.2で構築するメモ](https://qiita.com/suzutan/items/f1ec0d91a5ef2ca39ab8)