CentOS7でDRBD9の新機能を試す

# はじめに
この記事は、[CentOS7でDRBD9の環境構築](http://qiita.com/Yuki-Inamoto/items/ce65468abba10bce58f0)の続きで、構築した環境でDRBD9の新しい機能を試す記事です。

# 参考

* [DRBD9特集](https://blog.3ware.co.jp/2015/04/drbd9%E7%89%B9%E9%9B%86%E3%81%AB%E3%81%82%E3%81%9F%E3%81%A3%E3%81%A6/#more-400)
* [The DRBD User’s Guide](http://drbd.linbit.com/users-guide-9.0/drbd-users-guide.html)
* [DRBD Source](http://oss.linbit.com/drbd/)


# DRBD Client

* データを読み書きするローカルストレージを割り当てていないDRBDインスタンスを追加する。
* ストレージを割り当てていないDRBDノードをDRBD Clientと呼ぶ
* 上で作成したクラスタにdrbd9-04、drbd9-05をDRBD Clientとして追加する
* drbd9-04のipアドレスは10.255.10.14
* drbd9-05のipアドレスは10.255.10.15

## 注意
drbdmanageを使った、DRBD Clientの利用方法は公式ページには執筆時(2015/9/30現在)載っていない(できるとは書いている)ので、公式でClientの作り方が出てきたらそちらの方を参考にした方がいいかもしれません。

## 前提条件
* drbd9-04、drbd9-05はdrbdmanageによるリソースのデプロイのポートの解放まで終わっている

## クラスタにストレージを持たないノードを追加する

* addnode に -s オプションをつけるとストレージなしのノードが追加可能

drbd9-04以外のどれか1台で実行

    # drbdmanage add-node drbd9-04 10.255.10.14 -s
        Operation completed successfull
        Operation completed successfully
        Host key verification failed.

        Join command for node drbd9-05:
        drbdmanage join -p 6999 10.255.10.14 3 drbd9-01 10.255.10.11 0 {SecretKey}

drbd9-04で実行

    # drbdmanage join -p 6999 10.255.10.14 3 drbd9-01 10.255.10.11 0 {SecretKey}


drbd9-05でも同様に行う

## ストレージを割り当てていないノードからボリュームの作成

drbd9-04で実行

    # drbdmanage add-volume client 5GB --deploy 3
    # drbdmanage n
            +------------------------------------------------------------------------------+
           | Name     | Pool Size | Pool Free |                              |      State |
           +------------------------------------------------------------------------------+
           | drbd9-01 |     16380 |      8740 |                              |         ok |
           | drbd9-02 |     16380 |      8740 |                              |         ok |
           | drbd9-03 |     16380 |      8740 |                              |         ok |
           | drbd9-04 |   unknown |   unknown |                              | no storage |
           | drbd9-05 |   unknown |   unknown |                              | no storage |
           +------------------------------------------------------------------------------+

    # drbdmanage r
            +------------------------------------------------------------------------------+
            | Name    |                                                            | State |
            +------------------------------------------------------------------------------+
            | backups |                                                            |    ok |
            | client  |                                                            |    ok |
            +------------------------------------------------------------------------------+

* 注意
~~ストレージを割り当てていないノードからvolumeを作成すると、defaultで開けられるvolumeのポート番号が7000番からになってしまう。なのですべてのノードで新たに7000番から7100番くらいまでのポートを開けておく。~~

drbdmanageのバージョン0.50からはストレージが割り当ての有無に関係なくポート番号7000番から開けられます

        # firewall-cmd --add-port=7000-7100/tcp --zone=public --permanent
        # firewall-cmd --reload

## ボリュームにDRBD clientとして割り当て
* 作成したclientボリュームにdrbd9-04、drbd9-05は割り当てしていないため、割り当てる
* assignするときに、clientオプションをつけることで、DRBD Clientとしてボリュームにアクセスできるようになる

        # drbdmanage assign client drbd9-04 --client
        # drbdmanage assign client drbd9-05 --client

## ファイルシステム作成とマウント
* Minorの番号はclient側から作成すると、100から昇順になる

* drbd9-04で実行

        # drbdmanage list-volumes --groupby Size --show Port
            +------------------------------------------------------------------------------+
            | Name    | Vol ID | Size | Minor | Port |                             | State |
            +------------------------------------------------------------------------------+
            | backups |      0 | 2861 |    10 | 7700 |                             |    ok |
            | client  |      0 | 4768 |   100 | 7000 |                             |    ok |
            +------------------------------------------------------------------------------+
        # mke2fs -j /dev/drbd100
        # mkdir -p /mnt/drbd/client
        # drbdsetup status
            .drbdctrl role:Secondary
              disk:UpToDate
              drbd9-01 role:Secondary
                peer-disk:UpToDate
              drbd9-03 role:Secondary
                peer-disk:UpToDate
              drbd9-04 role:Secondary
                peer-disk:UpToDate
              drbd9-05 role:Secondary
                peer-disk:UpToDate

            backups role:Secondary
              disk:UpToDate
              drbd9-01 role:Primary
                peer-disk:UpToDate
              drbd9-03 role:Secondary
                peer-disk:UpToDate

            client role:Secondary
              disk:UpToDate
              drbd9-01 role:Secondary
                peer-disk:UpToDate
              drbd9-03 role:Secondary
                peer-disk:UpToDate
              drbd9-04 role:Secondary
                peer-disk:Diskless
              drbd9-05 role:Secondary
                peer-disk:Diskless
        # mount /dev/drbd100 /mnt/drbd/client

# データの再配置
* DRBD9ではスケーラビリティを保障するための、データ再配置機能がある
* 今回の例では、drbd9-01,02,03のノードがありdrbd clientとしてdrbd9-05がある。
* すでに、drbd9-01,02,03にはボリュームが作成されている。
* ここでのコマンド実行は指定がない限りdrbd9-05で行う。

        # drbdmanage list-volumes --groupby Size --show Port
            +------------------------------------------------------------------------------+
            | Name    | Vol ID | Size | Minor | Port |                             | State |
            +------------------------------------------------------------------------------+
            | db      |      0 | 3814 |   102 | 7002 |                             |    ok |
            | backups |      0 | 4768 |   100 | 7000 |                             |    ok |
            | app     |      0 | 6675 |   101 | 7001 |                             |    ok |
            +------------------------------------------------------------------------------+
        # drbdmanage list-assignments
            +------------------------------------------------------------------------------+
            | Node     | Resource | Vol ID |                                       | State |
            +------------------------------------------------------------------------------+
            | drbd9-01 | backups  |      * |                                       |    ok |
            | drbd9-01 | db       |      * |                                       |    ok |
            | drbd9-02 | app      |      * |                                       |    ok |
            | drbd9-02 | backups  |      * |                                       |    ok |
            | drbd9-02 | db       |      * |                                       |    ok |
            | drbd9-03 | app      |      * |                                       |    ok |
            | drbd9-03 | backups  |      * |                                       |    ok |
            +------------------------------------------------------------------------------+

- list-assignmentsオプションは、各ノードにどのリソースが割り当てられているか一覧表示するコマンドである。
- list-assignmentsオプションは、省略表記aを使用することができる。

* リソースは上表のように割り当てされている

        # drbdmanage n
            +------------------------------------------------------------------------------+
            | Name     | Pool Size | Pool Free |                              |      State |
            +------------------------------------------------------------------------------+
            | drbd9-01 |     16380 |      7788 |                              |         ok |
            | drbd9-02 |     16380 |      1108 |                              |         ok |
            | drbd9-03 |     16380 |      4924 |                              |         ok |
            | drbd9-05 |   unknown |   unknown |                              | no storage |
            +------------------------------------------------------------------------------+

* ここにdrbd9-04というノードを新たにクラスタへ追加する

        # drbdmanage add-node drbd9-04 10.255.10.14

* drbd9-04で

        # drbdmanage join -p 6999 10.255.10.14 3 drbd9-01 10.255.10.11 0 SecretKey

* appとbackupsのリソースをdrbd9-04へ移動させる

        # drbdmanage n
            +------------------------------------------------------------------------------+
            | Name     | Pool Size | Pool Free |                              |      State |
            +------------------------------------------------------------------------------+
            | drbd9-01 |     16380 |      7788 |                              |         ok |
            | drbd9-02 |     16380 |      1108 |                              |         ok |
            | drbd9-03 |     16380 |      4924 |                              |         ok |
            | drbd9-04 |     16380 |     16376 |                              |         ok |
            | drbd9-05 |   unknown |   unknown |                              | no storage |
            +------------------------------------------------------------------------------+
        # drbdmanage assign-resource backups drbd9-04
        # drbdmanage assign-resource app drbd9-04
        # drbdmanage deploy backups 3
        # drbdmanage deploy app 2
        # drbdmanage n
            +------------------------------------------------------------------------------+
            | Name     | Pool Size | Pool Free |                              |      State |
            +------------------------------------------------------------------------------+
            | drbd9-01 |     16380 |      7788 |                              |         ok |
            | drbd9-02 |     16380 |      7788 |                              |         ok |
            | drbd9-03 |     16380 |      9696 |                              |         ok |
            | drbd9-04 |     16380 |      4924 |                              |         ok |
            | drbd9-05 |   unknown |   unknown |                              | no storage |
            +------------------------------------------------------------------------------+
        # drbdmanage a
            +------------------------------------------------------------------------------+
            | Node     | Resource | Vol ID |                                       | State |
            +------------------------------------------------------------------------------+
            | drbd9-01 | backups  |      * |                                       |    ok |
            | drbd9-01 | db       |      * |                                       |    ok |
            | drbd9-02 | backups  |      * |                                       |    ok |
            | drbd9-02 | db       |      * |                                       |    ok |
            | drbd9-03 | app      |      * |                                       |    ok |
            | drbd9-04 | app      |      * |                                       |    ok |
            | drbd9-04 | backups  |      * |                                       |    ok |
            +------------------------------------------------------------------------------+

* drbdmanageを用いて、明示的にリソースを動かす方法(drbd9-01のbackupをdrbd9-04に動かすみたいな)は無い?
* 今のところ、新しくassignしたノードが優先的にdeployされているようだ。
  - 空きストレージ量を考慮して行っているのではない?
  - 上記の状態から、dbボリュームもdrbd9-04へassignした後deployしたところ、04へdbが移っていることを確認した。

# 終わりに
まだ、drbdmanageを使った、DRBD client、データの再配置の公式な手順が示されていないのですが、なんとなく新機能の利用方法がわかった気がします。