OpenStack LIBERTY ＋ DRBD9 で出来る事 

[OpenStack LIBERTY で DRBD Cinder Volume Driver 事始め](http://qiita.com/tksarah/items/c6e886884f3ba5ea364e)、では簡単に少しだけ動作確認を行った。もう少し動作を確認するため**エンタープライズ構成のミニチュア**を作った。
DRBD9 のための Cinder Volume Driver のできる範囲がだいたい確認できたので以下に記す。

# 環境
* OpenStack LIBERTY RDO allinone
    * **OpenStack Controller , Compute , Network**
    * Cinder-Volume
    * **DRBD Primary Node**
    * 192.168.0.3
* DRBD9 Node1
    * **DRBD Secondary**
    * 192.168.0.21
    * sdb(10GB), sdc(10GB) ... VG(drbdpool) for DRBD Volume
    * sdd ... VG(thinvg) for ThinPoolLV
* DRBD9 Node2
    * **DRBD Secondary**
    * 192.168.0.21
    * sdb(10GB), sdc(10GB) ... VG(drbdpool) for DRBD Volume
    * sdd ... VG(thinvg) for ThinPoolLV

![qitta-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/75458/bfac0c13-3824-9af7-93a0-46e7bcf7cb0d.jpeg)

## DRBD バージョン
* drbd-8.9.4-1.el7.x86_64
* drbdmanage-0.50-1.noarch
* kmod-drbd-9.0.0_3.10.0_229.7.2-3.el7.x86_64
# 結論として確認できたこと

* Cinder からのボリューム作成・Novaインスタンスへのアタッチ
* Cinder からのボリューム削除・Novaインスタンスからのデタッチ
* Cinder スナップショット作成
* Cinder スナップショットからのボリューム作成
* Cinder スナップショット削除

## スナップショット利用時の注意点
### ストレージプラグイン
スナップショットを実行した場合、DRDB と連携するわけだが、DRBD 側でスナップショットを利用する場合の条件をみたしている場合がある。通常の LVM ではなく ThinPoolLV を作っておく必要がある。これは DRBD からみると Storage-Plugin として ThinLV を適用する必要がある。
###スナップショットの作成先
スナップショットが作成されるのはその時に、DRBD Primary のノードだけである。ボリュームレプリケーションされている他のノードには作成されない。ただし、スナップショットからボリュームを作成する場合、そのボリュームは同じレプリケーションカウントを持つボリュームとなる。つまりミラーリングされたボリュームが作られる。

# できなかったこと（できておくべき事）

* Cinder ボリュームの拡張機能には未対応（Cinder 側は成功となるが DRBD ボリューム実体に反映されていない）
* Cinder ボリュームを削除しても、DRBD 側でできたボリュームは消えるが、**Resourceが消えない**
  * Workaround : drbdmanage コマンドによる手動削除
* Cinder スナップショットを削除しても、DRBD 側でできた **ThinPool のスナップショットが消えない**
  * Workaround : drbdmanage コマンドによる手動削除

* Cinder スナップショットからボリュームを作成すると、作ったボリュームの**同期がペンディングになる**
  * Workaround : スナップショットを消すと同期が開始される

# その他わかったこと

* Cinder-Volume ノードを増やすことで、ボリュームの作成先を増やすことはできるが、マルチ DRBDmanage instance（DRBDクラスタ複数によるマルチバックエンド）はまだ未対応
* ``drbdmanage modify-config`` でのStorage Plugin の変更はオンザフライをサポートしていない。ただし、ログレベルなどはオンザフライで有効になる http://drbd.linbit.com/users-guide-9.0/s-dm-set-config.html
  * Workaround : ノードを追加し、設定変更した後に、一度使用する（ボリュームを作るなど）ことで変更が有効になる
* DRBD Client を Primary（OpenStack Cinder-Volume のノード）にする事はできるが Cinder ボリュームを作成したあとにそのボリュームは 自動的に **Primary ノードに Client としてアサインされない**、つまり DRBD Client を想定されていない
  * Workaround : Cinder ボリューム作成後、手動でアサインすることはできるが・・・

# 検証環境
| ホスト名 |IPアドレス|
|:--------|:--------|
|akira.tk.net|192.168.0.3|
|drbd9-01.tk.net|192.168.0.21|
|drbd9-02.tk.net|192.168.0.22|

# DRBD Controller Node 準備

* DNS登録
* ノード間でSSH-KEY登録

```shell-session
[root@drbd9-01 ~]# vgcreate drbdpool /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
  Volume group "drbdpool" successfully created

[root@drbd9-02 ~]# vgcreate drbdpool /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
  Volume group "drbdpool" successfully created
```

## 初期設定

```shell-session
[root@drbd9-01 ~]# drbdmanage init 192.168.0.21

You are going to initalize 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
  Failed to find logical volume "drbdpool/.drbdctrl_0"
  Failed to find logical volume "drbdpool/.drbdctrl_1"
  Logical volume ".drbdctrl_0" created.
  Logical volume ".drbdctrl_1" created.
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
empty drbdmanage control volume initialized.
empty drbdmanage control volume initialized.
Operation completed successfully

[root@drbd9-01 ~]# drbdmanage list-nodes
+------------------------------------------------------------------------------------------------------------+
| Name            | Pool Size | Pool Free | Site |                                                   | State |
+------------------------------------------------------------------------------------------------------------+
| drbd9-01.tk.net |     20472 |     20464 |  N/A |                                                   |    ok |
+------------------------------------------------------------------------------------------------------------+

[root@drbd9-01 ~]# drbdmanage add-node drbd9-02.tk.net 192.168.0.22
Operation completed successfully
Operation completed successfully

Executing join command using ssh.
IMPORTANT: The output you see comes from drbd9-02.tk.net
IMPORTANT: Your input is executed on drbd9-02.tk.net
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
  Logical volume ".drbdctrl_0" successfully removed
  Logical volume ".drbdctrl_1" successfully removed
  Logical volume ".drbdctrl_0" created.
  Logical volume ".drbdctrl_1" created.
You want me to create a v09 style flexible-size internal meta data block.
There appears to be a v09 flexible-size internal meta data block
already in place on /dev/drbdpool/.drbdctrl_0 at byte offset 4190208

Do you really want to overwrite the existing meta-data?
*** confirmation forced via --force option ***
NOT initializing bitmap
initializing activity log
Writing meta data...
New drbd meta data block successfully created.
You want me to create a v09 style flexible-size internal meta data block.
There appears to be a v09 flexible-size internal meta data block
already in place on /dev/drbdpool/.drbdctrl_1 at byte offset 4190208

Do you really want to overwrite the existing meta-data?
*** confirmation forced via --force option ***
NOT initializing bitmap
initializing activity log
Writing meta data...
New drbd meta data block successfully created.
Operation completed successfully

[root@drbd9-01 ~]# drbdmanage list-nodes
+------------------------------------------------------------------------------------------------------------+
| Name            | Pool Size | Pool Free | Site |                                                   | State |
+------------------------------------------------------------------------------------------------------------+
| drbd9-01.tk.net |     20472 |     20464 |  N/A |                                                   |    ok |
| drbd9-02.tk.net |     20472 |     20464 |  N/A |                                                   |    ok |
+------------------------------------------------------------------------------------------------------------+
```

# ホスト準備
Openstack Cinder Volume 側 も DRBD ノードとして追加登録

```shell-session
[root@drbd9-01 ~]# drbdmanage add-node akira.tk.net 192.168.0.3
Operation completed successfully
Operation completed successfully

Executing join command using ssh.
IMPORTANT: The output you see comes from akira.tk.net
IMPORTANT: Your input is executed on akira.tk.net
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
  Logical volume ".drbdctrl_0" successfully removed
  Logical volume ".drbdctrl_1" successfully removed
  Logical volume ".drbdctrl_0" created.
  Logical volume ".drbdctrl_1" created.
You want me to create a v09 style flexible-size internal meta data block.
There appears to be a v09 flexible-size internal meta data block
already in place on /dev/drbdpool/.drbdctrl_0 at byte offset 4190208

Do you really want to overwrite the existing meta-data?
*** confirmation forced via --force option ***

Do you want to proceed?
*** confirmation forced via --force option ***
NOT initializing bitmap
md_offset 4190208
al_offset 4157440
bm_offset 4153344

Found some data

 ==> This might destroy existing data! <==
initializing activity log
Writing meta data...
New drbd meta data block successfully created.
You want me to create a v09 style flexible-size internal meta data block.
There appears to be a v09 flexible-size internal meta data block
already in place on /dev/drbdpool/.drbdctrl_1 at byte offset 4190208

Do you really want to overwrite the existing meta-data?
*** confirmation forced via --force option ***

Do you want to proceed?
*** confirmation forced via --force option ***
NOT initializing bitmap
md_offset 4190208
al_offset 4157440
bm_offset 4153344

Found some data

 ==> This might destroy existing data! <==
initializing activity log
Writing meta data...
New drbd meta data block successfully created.
Operation completed successfully
[root@drbd9-01 ~]# drbdmanage list-nodes
+------------------------------------------------------------------------------------------------------------+
| Name            | Pool Size | Pool Free | Site |                                                   | State |
+------------------------------------------------------------------------------------------------------------+
| akira.tk.net    |      9992 |      9984 |  N/A |                                                   |    ok |
| drbd9-01.tk.net |     20472 |     20464 |  N/A |                                                   |    ok |
| drbd9-02.tk.net |     20472 |     20464 |  N/A |                                                   |    ok |
+------------------------------------------------------------------------------------------------------------+
```
以降は
[OpenStack LIBERTY で DRBD Cinder Volume Driver 事始め](http://qiita.com/tksarah/items/c6e886884f3ba5ea364e)、と同様。


> *  drbdmanage driver 設定
    1. cinder.conf
    2. ボリュームタイプ作成
    3. dbus へのアクセス許可
    4. cinder-volume 再起動

# 動作確認ログ
順次アップデート

# 参考
* http://drbd.linbit.com/users-guide-9.0/
* https://github.com/openstack/cinder/commits/master/cinder/volume/drivers/drbdmanagedrv.py
* http://docs.openstack.org/liberty/config-reference/content/section_cinder.conf.html