簡単にできるDRBD9環境構築

サーバ3台を使って簡単にDRBD9で多ノード環境を構築します。
DRBDでリアルタイムにデータ冗長化をします。

## 前提条件
3台のサーバDRBD9、DRBD Manageがインストール済みであること。

## 構成図
3台構成で「r0」という名前のリソースを作成しリソース上のデータをリアルタイムに冗長化します。
DRBD9-1を一号機、DRBD9-2を二号機、DRBD9-3を三号機と呼ぶことにします。
![DRBD9構築編.png](https://qiita-image-store.s3.amazonaws.com/0/101744/6918218a-2a03-587f-9adc-9a26ca715b05.png)


## DRBD9インストール手順
インストール手順については以下をご参照ください。

DRBD9環境をソースコードからVagrant+Ansibleでインストールしてみた。(CentOS7編)
http://qiita.com/ksawada1979/items/1dd528f9867f78a10f73

DRBD9環境をVagrant+Ansibleで540秒でインストールしてみた。(Ubuntu16.04編)
http://qiita.com/ksawada1979/items/4fed3724bac966c1738b

## DRBD9初期化
まず初期化を実施します。特に指定が無い場合は本ページの手順は一号機で実施します。
192.168.33.11は実際の環境と読み替えて実施します。
途中でyesを入力してください。

```shell-session
$ sudo drbdmanage init 192.168.33.11

You are going to initialize a new drbdmanage cluster.
CAUTION! Note that:
  * Any previous drbdmanage cluster information may be removed
  * Any remaining resources managed by a previous drbdmanage installation
    that still exist on this system will no longer be managed by drbdmanage

Confirm:

  yes/no: yes
Empty drbdmanage control volume initialized on '/dev/drbd0'.
Empty drbdmanage control volume initialized on '/dev/drbd1'.
Operation completed successfully
```

## ノード追加
次にノードを追加します。
二号機を追加します。

```shell-session
$ sudo drbdmanage add-node DRBD9-2 192.168.33.12
Operation completed successfully
Operation completed successfully
Host key verification failed.

Join command for node DRBD9-2:
drbdmanage join -p 6999 192.168.33.12 1 DRBD9-1 192.168.33.11 0 cl+AZLWc3tV2VZJERwqu
```

三号機を追加します。

```shell-session
$ sudo drbdmanage add-node DRBD9-3 192.168.33.13
Operation completed successfully
Operation completed successfully
Host key verification failed.

Join command for node DRBD9-3:
drbdmanage join -p 6999 192.168.33.13 2 DRBD9-1 192.168.33.11 0 cl+AZLWc3tV2VZJERwqu
```

次に二号機にログインして以下を実行します。(ここでのコマンドは先ほどのadd-nodeコマンドの結果からコピー＆ペーストして実行してください。)

```shell-session
$ sudo drbdmanage join -p 6999 192.168.33.12 1 DRBD9-1 192.168.33.11 0 cl+AZLWc3tV2VZJERwqu
You are going to join an existing drbdmanage cluster.
CAUTION! Note that:
  * Any previous drbdmanage cluster information may be removed
  * Any remaining resources managed by a previous drbdmanage installation
    that still exist on this system will no longer be managed by drbdmanage

Confirm:

  yes/no: yes
Operation completed successfully
```

次に三号機にログインして以下を実行します。

```shell-session
$ sudo drbdmanage join -p 6999 192.168.33.13 2 DRBD9-1 192.168.33.11 0 cl+AZLWc3tV2VZJERwqu
You are going to join an existing drbdmanage cluster.
CAUTION! Note that:
  * Any previous drbdmanage cluster information may be removed
  * Any remaining resources managed by a previous drbdmanage installation
    that still exist on this system will no longer be managed by drbdmanage

Confirm:

  yes/no: yes
Operation completed successfully
```


## ノード確認
ノードが追加されたことを確認します。

```shell-session
$ sudo drbdmanage list-nodes
+------------------------------------------------------------------------------+
| Name    | Pool Size | Pool Free |                                    | State |
|------------------------------------------------------------------------------|
| DRBD9-1 |     10236 |     10228 |                                    |    ok |
| DRBD9-2 |     10236 |     10228 |                                    |    ok |
| DRBD9-3 |     10236 |     10228 |                                    |    ok |
+------------------------------------------------------------------------------+

```

## プールとリソースとボリュームの関係
ノードが追加できたところで早速データ冗長化するための領域リソースを追加するまえにプールとリソースとボリュームの関係を整理しておきます。
ノード追加後にリソースを追加し、次にボリュームを割り当て最後にデプロイすることでDRBD上で使用することになります。割り当てられるボリュームはプールの領域から切り出して割り当てます。

図にすると以下のような関係になります。
![PoolVolumeResource.png](https://qiita-image-store.s3.amazonaws.com/0/101744/4bc16bf5-0091-3f5c-f7f2-825e36f70ac6.png)

プールの作成部分はインストール編で自動で実施しています。
「vgs」コマンドでプール名とプールの領域を確認することができます。

```shell-session
$ sudo vgs
  VG       #PV #LV #SN Attr   VSize  VFree
  centos     1   2   0 wz--n- 39.51g 44.00m
  drbdpool   1   0   0 wz--n- 10.00g 10.00g
```

## リソース追加
リソースの追加をします。
ここではr0という名前のリソースを追加します。

```shell-session
$ sudo drbdmanage add-resource r0
Operation completed successfully
```

リソースが追加されたことを確認します。

## リソース追加確認
r0というリソースが追加されたことを確認します。
リソースはポート7000番を使用します。リソースを追加するごとに7000番から連番で使用します。

```shell-session
$ sudo drbdmanage list-volumes --groupby Size --show Port
+------------------------------------------------------------------------------+
| Name | Vol ID | Size | Minor | Port |                                | State |
|------------------------------------------------------------------------------|
| r0   |      * |    * |     * | 7000 |                                |     * |
+------------------------------------------------------------------------------+
```

## ボリューム割り当て
ボリュームを割り当てます。先ほどの解説例では２つのボリュームの図がありましたが、ここでは5GBのボリューム1つを「r0」リソースに追加します。

```shell-session
$ sudo drbdmanage add-volume r0 5GB
Operation completed successfully
```

ここでリソース内に領域が確保されます。
デプロイはしていないのでDRBD上ではまだ使えません。

## ボリューム割り当て確認
r0リソースにボリュームが割り当てられたことを確認します。
Vol IDは「0」になっていますがr0にボリュームをさらに追加すると1,2,3のように連番で振られます。

```shell-session
$ sudo drbdmanage volumes
+------------------------------------------------------------------------------+
| Name | Vol ID |     Size | Minor |                                   | State |
|------------------------------------------------------------------------------|
| r0   |      0 | 4.66 GiB |   100 |                                   |    ok |
+------------------------------------------------------------------------------+
```

## デプロイ
いよいよデプロイをします。
デプロイをすることによりDRBDで使用することができます。
最後の3は3台のサーバにデプロイすることを示しています。2にして2台にすることもできます。

```shell-session
$ sudo drbdmanage deploy-resource r0 3
Operation completed successfully
```

ここでメタディスクが作成されます。
また初期同期もここで実行されます。

## デプロイ確認
デプロイされたことを確認します。
r0リソースが初期同期していることも確認します。
replication:SyncSourceとなっていることを確認します。
「.drbdctrl」は各ノードにインストールされたDRBDコントロール用のソフトウェアです。全てSecondaryになっていますが問題ありません。設定変更などをしたときに一時的にPrimaryになりさらに他ノードと設定情報を同期した後にSecondaryに戻ります。

```shell-session
$ sudo drbdadm status
The server's response is:

you are the 3rd user to install this version
.drbdctrl role:Secondary
  volume:0 disk:UpToDate
  volume:1 disk:UpToDate
  DRBD9-2 role:Secondary
    volume:0 peer-disk:UpToDate
    volume:1 peer-disk:UpToDate
  DRBD9-3 role:Secondary
    volume:0 peer-disk:UpToDate
    volume:1 peer-disk:UpToDate

r0 role:Secondary
  disk:UpToDate
  DRBD9-2 role:Secondary
    replication:SyncSource peer-disk:Inconsistent done:5.57
  DRBD9-3 role:Secondary
    replication:SyncSource peer-disk:Inconsistent done:5.70
```


## ファイルシステム作成
DRBDで使用できるようになったところで、ファイルシステムを作成します。
CentOS7のデフォルトファイルシステムであるxfsを指定します。

```shell-session
$ sudo mkfs -t xfs /dev/drbd100
meta-data=/dev/drbd100           isize=256    agcount=4, agsize=305176 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=1220703, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
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
```

## マウント
マウントします。

```shell-session
$ sudo mkdir /drbd9
$ sudo mount /dev/drbd100 /drbd9
```

## 書き込みテスト
ddコマンドで作成したDRBD領域に書き込みを行います。

```shell-session
$ sudo dd if=/dev/zero of=/drbd9/test.file bs=1M count=100
100+0 レコード入力
100+0 レコード出力
104857600 バイト (105 MB) コピーされました、 0.453204 秒、 231 MB/秒
```

最後に書き込みされたことを確認します。

```shell-session
$ ls -l /drbd9
合計 102400
-rw-r--r--. 1 root root 104857600 10月 27 18:20 test.file
```