DRBD8.4の構築手順

#1 環境
VMware Workstation 12 Player上の仮想マシンを使いました。
仮想マシンは2台です。それぞれのホスト名は、drbd1 ,drbd2です。
/dev/sdbをdrbdのテスト用のデバイスとして追加しました。

```console:構成
      +---- drbd1 ----+               +---- drbd2 ----+
      |  (CentOS7.3)  |               |  (CentOS7.3)  |
      |               |               |               |
      |               |               |               |
      |   /dev/sda    |               |   /dev/sda    |
      |   /dev/sdb    |               |   /dev/sdb    |
      |               |               |               |
      +----- eth0 ----+               +----- eth0 ----+
              | .50                            | .60
              |                                |
              |                                |
      -------------------------------------------------
                        192.168.0.0/24
```

```console:OS版数
[root@drbd1 ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@drbd1 ~]# uname -r
3.10.0-514.el7.x86_64
```

#2 事前準備
##2.1 仮想マシンにディスクの追加(drbd1,drbd2で実施）
私の場合、
「仮想マシン設定の編集(D)」->「追加(A)」->「ハードディスクの追加」->「SCSI(s) (推奨)」
->「仮想ディスクの新規作成(V)」-> 「仮想ディスクを単一ファイルとして格納(O)」を実行して、
ディスク(★)を追加しました。

```
[root@drbd1 ~]# lsblk -pi
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
/dev/sda      8:0    0   20G  0 disk
|-/dev/sda1   8:1    0    1G  0 part /boot
|-/dev/sda2   8:2    0    1G  0 part [SWAP]
`-/dev/sda3   8:3    0   18G  0 part /
/dev/sdb      8:16   0    2G  0 disk ★
/dev/sr0     11:0    1  4.1G  0 rom
```

##2.2 /etc/hostsファイルの設定(drbd1,drbd2で実施）

```
[root@drbd1 ~]# cat /etc/hosts
192.168.0.50 drbd1
192.168.0.60 drbd2
```


##2.3 ELRepoのrepoファイルのインストール(drbd1,drbd2で実施）
drbdパッケージはELRepoにあるので、ELRepoのrepoファイルを事前にインストールします。
ELRepoのインストールは[ここ](http://elrepo.org/tiki/tiki-index.php)を参照しました。

```
[root@drbd1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@drbd1 ~]# 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%]

[root@drbd1 ~]# yum clean all
[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo repolist
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * elrepo: ftp.ne.jp
リポジトリー ID                リポジトリー名                                                                 状態
elrepo                         ELRepo.org Community Enterprise Linux Repository - el7                        222
repolist: 222
```


##2.4 パッケージのインストール(drbd1,drbd2で実施）
パッケージ(drbd84-utils,kmod-drbd84)をインストールする。
私の環境では、最新のkmod-drbd84(8.4.10)をインストールしようとすると、依存関係のエラーがでたため、
1つ古い版数のkmod-drbd84(8.4.9)をインストールしました。

```
[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo install drbd84-utils-8.9.8-1.el7.elrepo
[root@drbd1 ~]# rpm -qa drbd84-utils
drbd84-utils-8.9.8-1.el7.elrepo.x86_64

[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo install kmod-drbd84-8.4.9-1.el7.elrepo
[root@drbd1 ~]# rpm -qa kmod-drbd84
kmod-drbd84-8.4.9-1.el7.elrepo.x86_64

なお、ELRepoリポジトリに含まれているパッケージ一覧の表示方法は以下のとおりです。
[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo --showduplicates list kmod-drbd84
[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo --showduplicates list drbd84-utils
```

##2.5 リソースの作成(drbd1,drbd2で実施）

```
リソースの設定ファイルを作成する。
r0はリソース名を表します。任意の名前を付けることができます。
[root@drbd1 ~]# vi /etc/drbd.d/test.res
[root@drbd1 ~]# cat /etc/drbd.d/test.res
resource r0 {
  device    /dev/drbd0;
  disk      /dev/sdb;
  meta-disk internal;
  on drbd1 {
    address   192.168.0.50:7788;
  }
  on drbd2 {
    address   192.168.0.60:7788;
  }
}
```

##2.6 7788番ポートへのアクセス許可(drbd1,drbd2で実施）
マニュアル([5.2. Preparing your network configuration](http://docs.linbit.com/docs/users-guide-8.4/))によると、DRBDは7788番ポート以上を使用するようです。
>
In terms of local firewall considerations, it is important to understand that DRBD (by convention) uses TCP ports 
from 7788 upwards, with every resource listening on a separate port. DRBD uses two TCP connections for every 
resource configured. For proper DRBD functionality, it is required that these connections are allowed by your 
firewall configuration.

```
7788番ポートへのアクセスを許可する。
[root@drbd1 ~]# firewall-cmd --add-port=7788/tcp
success

パーマネントルールに追加する。
[root@drbd1 ~]# firewall-cmd --runtime-to-permanent
success
```

#3 リソースの有効化
##3.1 メタデータの作成(drbd1,drbd2で実施）

```
[root@drbd1 ~]# drbdadm create-md r0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success

[root@drbd2 ~]# drbdadm create-md r0
-以下、略-
```

##3.2 リソースの有効化(drbd1,drbd2で実施）

```
[root@drbd1 ~]# drbdadm up r0
[root@drbd2 ~]# drbdadm up r0
```

##3.3 状態の確認

```
マニュアルによると、この時点では、ディスクの状態がInconsistent/Inconsistent(★)になっているようです。
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: 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:10485404
```

#4 デバイスの初期同期
##4.1 同期元の選択
今回は、drbd1を同期元に選択します。
つまり、drbd1からdrbd2にデータのレプリケーション(複製)が行われることを意味します。

##4.2 初期フル同期の開始(drbd1で実施）
ここでは、同期元に選択した仮想マシンで実行します。

```
[root@drbd1 ~]# drbdadm primary --force r0
```

##4.3 同期中の状態確認
/proc/drbdを参照すると、同期中の状態が確認できます。

```
drbd1の状態を確認する。drbd1は"SyncSource"になっていることがわかる。
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:★SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:240496 nr:0 dw:0 dr:241408 al:8 bm:0 lo:0 pe:4 ua:0 ap:0 ep:1 wo:f oos:1857436
        [=>..................] sync'ed: 11.6% (1857436/2097052)K
        finish: 0:04:38 speed: 6,660 (5,572) K/sec


drbd2の状態を確認する。drbd2は"SyncTarget"になっていることがわかる。
[root@drbd2 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:★SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:225220 dw:225220 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1871832
        [=>..................] sync'ed: 11.0% (1871832/2097052)K
        finish: 0:04:33 speed: 6,824 (5,492) want: 9,120 K/sec
```



##4.4 同期完了後の状態確認

```
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:2097052 nr:0 dw:0 dr:2097964 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@drbd2 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:2097052 dw:2097052 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
```

#5 drbdサービスの起動(drbd1,drbd2で実施）
```
[root@drbd1 ~]# systemctl start drbd.service
[root@drbd2 ~]# systemctl start drbd.service
```

#6 リソースのアタッチ(drbd1,drbd2で実施）

```
[root@drbd1 ~]# drbdadm attach r0
[root@drbd2 ~]# drbdadm attach r0
```


#7 ファイルシステムの作成(drbd1で実施）

```
[root@drbd1 ~]# mkfs.ext4 /dev/drbd0
```

#8 動作確認
##8.1 drbd1(primary)でテスト用ファイルの作成

```
drbd0デバイスをマウントする。
[root@drbd1 ~]# mount /dev/drbd0 /mnt/

マウントしたデバイスに作成したファイルにデータを書き込む。
[root@drbd1 ~]# echo 12345 > /mnt/test.txt
[root@drbd1 ~]# cat /mnt/test.txt
12345
```


##8.2 primaryをdrbd2に変更

```
drbd1のデバイスをアンマウントする。
[root@drbd1 ~]# umount /mnt/

drbd1をsecondaryに変更
[root@drbd1 ~]# drbdadm secondary r0


drbd2をprimaryに変更
[root@drbd2 ~]# drbdadm primary r0
[root@drbd2 ~]# mount /dev/drbd0 /mnt/

drbd1で書き込んだデータを確認する。正しく読めたことがわかる。
[root@drbd2 ~]# cat /mnt/test.txt
12345

[root@drbd2 ~]# echo 67890 > /mnt/test.txt
[root@drbd2 ~]# cat /mnt/test.txt
67890
```

##8.3 primaryをdrbd1に変更(元に戻す）

```
[root@drbd2 ~]# umount /mnt/
[root@drbd2 ~]# drbdadm secondary r0

[root@drbd1 ~]# drbdadm primary r0
[root@drbd1 ~]# mount /dev/drbd0 /mnt/

drbd2で書き込んだデータを確認する。正しく読めたことがわかる。
[root@drbd1 ~]# cat /mnt/test.txt
67890
```



#X 参考情報
[DRBD:公式サイト](http://docs.linbit.com/)
[DRBD:wikipedia](https://ja.wikipedia.org/wiki/DRBD)
[DRBD設定ファイル](http://unixservermemo.web.fc2.com/sv/drbd-conf.htm)
[DRBDの日本語解説](https://blog.3ware.co.jp/drbd-users-guide-8.4/about.html)
[DRBD構築支援サービスとは](http://www.conversion.co.jp/service/drbd)
[DRBD導入検証](https://sites.google.com/a/ts-wg.com/info/Category/oss/drbd)
[DRBDで行こう！](http://blog.livedoor.jp/ashibuya0128/archives/51751645.html)

[DRBDとPacemakerによるLinux-HA環境](http://linux-ha.osdn.jp/wp/wp-content/uploads/2010-06-12_hbstudy.pdf)
[第8章 DRBDとPacemakerクラスタ](https://blog.3ware.co.jp/drbd-users-guide-8.4/ch-pacemaker.html)
[★障害時にサブサーバへ自動で切り替える「高可用性WordPressシステム」の作り方 後編 (1/3)](http://www.atmarkit.co.jp/ait/articles/1601/21/news007.html)