OpenStack LIBERTY で DRBD Cinder Volume Driver 事始め

DRBD は DRBD9 から搭載された drbdmanage を活用し、OpenStack Cinder と連携することが可能である。Cinder Volume Driver は OpenStack LIBERTY Release から標準搭載されている。

http://drbd.linbit.com/users-guide-9.0/s-openstack-install.html#s-openstack-addtl-conf

ここでは、**1ノード** でひとまずこの DRBD9 用の Cinder Volume Driver（drbdmanagedrv.py） の動作を確認する手順を列挙する。なお、基本的なところは割愛している。

概略図
![2015-12-01 15-46-43.jpg](https://qiita-image-store.s3.amazonaws.com/0/75458/1f8d1f66-4520-e8a3-d8fd-25ca9c876529.jpeg)

# マシンの準備

物理でも仮想でも良いが、以下のスペックがあるといい。

* CPU x2
* **メモリ4GB以上**
* NICは1つでも
* **DISKは30GB以上**
* Linuxディストリビューションはここでは CentOS 7

# RDO Allinone の準備

CentOS 7 x86_64 以降へ RDO をインストールし普通に OpenStack の各 Core サービスが動くところまで準備する。Nova のインスタンスは1つ cirros でよいので作っておく。



# DRBD9 インストール

今回はパッケージ版を使っているが、ソースからインストールしたものを使っても良い。

```shell-session
# cat /etc/redhat-release
Derived from Red Hat Enterprise Linux 7.1 (Source)

# cat /etc/yum.repos.d/linbit.repo
[drbd-9.0]
name=LINBIT Packages for drbd-9.0 - $basearch
baseurl=http://packages.linbit.com/<サポート証書にあるハッシュ>/yum/rhel7.1/drbd-9.0/$basearch
enabled=1
gpgcheck=0

# yum install kmod-drbd drbd drbdmanage
```

## パッケージ抜粋

* 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

# loopback で DRBD用のデバイスを作る
外部ブロックデバイスを追加できるのであればそのデバイスを使っても良いがココでは手っ取り早く仮想的につくる。

* Allinone の場合 loop0 , loop1 は Swift , cinder で使われているので注意

```shell-session
# dd if=/dev/zero of=disk01 bs=1M count=10000
# dd if=/dev/zero of=disk02 bs=1M count=10000
# losetup /dev/loop2 /root/disk01
# losetup /dev/loop3 /root/disk02
# vgcreate drbdpool /dev/loop2 /dev/loop3
```

* 確認：losetup
* はずすには losetup -d ＜loopdev＞

# DRBD イニシャライズ

```shell-session
# drbdmanage init <IP Address>
```

* 確認：drbdmanage list-nodes

```shell-session
[root@akira ~]# drbdmanage list-nodes
+------------------------------------------------------------------------------------------------------------+
| Name         | Pool Size | Pool Free | Site |                                                      | State |
+------------------------------------------------------------------------------------------------------------+
| akira.tk.net |      9992 |      9984 |  N/A |                                                      |    ok |
+------------------------------------------------------------------------------------------------------------+
```

# drbdmanage driver 設定

## cinder.conf

```shell-session
[DEFAULT]
enabled_backends=lvm,drbdmanage

（略）

[drbdmanage]
iscsi_helper=lioadm
http://docs.openstack.org/admin-guide-cloud/blockstorage-lio-iscsi-support.html
restart cinder-volume
```

> iscsi_helper=lioadm にしているのはデフォルトの tgtadm は入っていないため
> Linux IO Target・・・http://linux-iscsi.org/wiki/LIO

## ボリュームタイプ作成

```shell-session
[root ~ root] source adminrc
[root ~(keystone_admin)] cinder type-create drbdmanage
[root ~(keystone_admin)] cinder type-key drbdmanage set volume_backend_name=drbdmanage
```

* 確認：cinder type-list
* 確認：cinder extra-specs-list

```shell-session
[root@akira ~(keystone_admin)]# cinder type-list
+--------------------------------------+------------+-------------+-----------+
|                  ID                  |    Name    | Description | Is_Public |
+--------------------------------------+------------+-------------+-----------+
| 0caf8530-7853-4fea-84dd-59d41ebc9510 |   iscsi    |      -      |    True   |
| c5b09398-fb34-4398-b3b2-3e29a2859ee2 | drbdmanage |      -      |    True   |
+--------------------------------------+------------+-------------+-----------+
[root@akira ~(keystone_admin)]# cinder extra-specs-list
+--------------------------------------+------------+-----------------------------------------+
|                  ID                  |    Name    |               extra_specs               |
+--------------------------------------+------------+-----------------------------------------+
| 0caf8530-7853-4fea-84dd-59d41ebc9510 |   iscsi    |     {u'volume_backend_name': u'lvm'}    |
| c5b09398-fb34-4398-b3b2-3e29a2859ee2 | drbdmanage | {u'volume_backend_name': u'drbdmanage'} |
+--------------------------------------+------------+-----------------------------------------+
```

## dbus へのアクセス許可

/etc/dbus-1/system.d/org.drbd.drbdmanaged.conf を編集する。

```shell-session
# cat /etc/dbus-1/system.d/org.drbd.drbdmanaged.conf
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <policy user="0">
      <allow own="org.drbd.drbdmanaged"/>
      <allow send_interface="org.drbd.drbdmanaged"/>
      <allow send_destination="org.drbd.drbdmanaged"/>
  </policy>
  <policy user="cinder">                               # ココ追加
      <allow own="org.drbd.drbdmanaged"/>              # ココ追加
      <allow send_interface="org.drbd.drbdmanaged"/>   # ココ追加
      <allow send_destination="org.drbd.drbdmanaged"/> # ココ追加
  </policy>                                            # ココ追加
</busconfig>
```
> user の値は cinder-volume が起動されているユーザを入れる

## cinder-volume 再起動

```shell-session
# systemctl restart openstack-cinder-volume
```
* 確認：cinder service-list (admin 権限、**up** となるまで少し時間がかかる場合あり)
* エラーがないか確認：/var/log/cinder/volume.log

```shell-session
[root@akira ~(keystone_admin)]# cinder service-list
+------------------+-------------------------+------+---------+-------+----------------------------+-----------------+
|      Binary      |           Host          | Zone |  Status | State |         Updated_at         | Disabled Reason |
+------------------+-------------------------+------+---------+-------+----------------------------+-----------------+
|  cinder-backup   |       akira.tk.net      | nova | enabled |   up  | 2015-12-02T14:18:13.000000 |        -        |
| cinder-scheduler |       akira.tk.net      | nova | enabled |   up  | 2015-12-02T14:18:11.000000 |        -        |
|  cinder-volume   | akira.tk.net@drbdmanage | nova | enabled |   up  | 2015-12-02T14:18:06.000000 |        -        |
|  cinder-volume   |     akira.tk.net@lvm    | nova | enabled |   up  | 2015-12-02T14:18:06.000000 |        -        |
+------------------+-------------------------+------+---------+-------+----------------------------+-----------------+
```

# 試行
## ブロックデバイス作成（Cinder Volume）

```shell-session
[root ~] source demorc
[root ~(keystone_demo)] cinder create --display-name=hoge --volume-type drbdmanage 1
```

* 確認：cinder list
* エラーがないか確認：/var/log/cinder/volume.log
* drbdmanage でも確認できる：drbdmanage list-volumes
* ボリュームの状態確認：drbdsetup status
* lvdisplay （Cinder Volume Driver 経由、drbdmanage により LV が作られている）
* 削除：cinder delete

```shell-session
[root@akira ~(keystone_demo)]# cinder list
+--------------------------------------+-----------+------+------+-------------+----------+-------------+-------------+
|                  ID                  |   Status  | Name | Size | Volume Type | Bootable | Multiattach | Attached to |
+--------------------------------------+-----------+------+------+-------------+----------+-------------+-------------+
| 7e794c92-9027-4cb0-a9ab-ba8036e9bbf7 | available | hoge |  1   |  drbdmanage |  false   |    False    |             |
+--------------------------------------+-----------+------+------+-------------+----------+-------------+-------------+

[root@akira ~(keystone_demo)]# drbdmanage list-volumes
+------------------------------------------------------------------------------------------------------------+
| Name                                    | Vol ID | Size | Minor |                                  | State |
+------------------------------------------------------------------------------------------------------------+
| CV_7e794c92-9027-4cb0-a9ab-ba8036e9bbf7 |      0 | 1024 |   100 |                                  |    ok |
+------------------------------------------------------------------------------------------------------------+

[root@akira ~(keystone_demo)]# drbdsetup status
.drbdctrl role:Secondary
  volume:0 disk:UpToDate
  volume:1 disk:UpToDate

CV_7e794c92-9027-4cb0-a9ab-ba8036e9bbf7 role:Secondary
  disk:Inconsistent

[root@akira ~(keystone_demo)]# lvdisplay
（略）
  --- Logical volume ---
  LV Path                /dev/drbdpool/CV_7e794c92-9027-4cb0-a9ab-ba8036e9bbf7_00
  LV Name                CV_7e794c92-9027-4cb0-a9ab-ba8036e9bbf7_00
  VG Name                drbdpool
  LV UUID                DVl32e-vG6p-9228-spkF-HIEn-J55Z-0rpSAQ
  LV Write Access        read/write
  LV Creation host, time akira.tk.net, 2015-12-02 23:20:45 +0900
  LV Status              available
  # open                 2
  LV Size                1.00 GiB
  Current LE             257
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:5
```

## イレギュラーTips

今回の構成では、1ノードで全部入れ込んでしまっており、DRBD をレプリケーションしない状態で片肺ボリュームとして利用するためこのTipsが必要。

> 通常は DRBD 側はミラーボリュームとなるので本操作は必要ない。

```drbdsetup status``` で確認したとき、該当するボリュームの ```disk:Inconsistent``` が **disk:UpToDate** でないと Nova インスタンスにアタッチすることができない。よって強制的に以下のように変更する。

```shell-session
[root@akira ~(keystone_demo)]# drbdsetup primary CV_7e794c92-9027-4cb0-a9ab-ba8036e9bbf7 --force=yes
[root@akira ~(keystone_demo)]# drbdsetup secondary CV_7e794c92-9027-4cb0-a9ab-ba8036e9bbf7
[root@akira ~(keystone_demo)]# drbdsetup status
.drbdctrl role:Secondary
  volume:0 disk:UpToDate
  volume:1 disk:UpToDate

CV_7e794c92-9027-4cb0-a9ab-ba8036e9bbf7 role:Secondary
  disk:UpToDate
```

## Nova インスタンスへアタッチ
アタッチする Cinder Volume の ID は ```cinder list``` 等で確認しとく。

```shell-session
[root@akira ~(keystone_demo)]# nova volume-attach demo-fedora23  7e794c92-9027-4cb0-a9ab-ba8036e9bbf7  auto
+----------+--------------------------------------+
| Property | Value                                |
+----------+--------------------------------------+
| device   | /dev/vdb                             |
| id       | 7e794c92-9027-4cb0-a9ab-ba8036e9bbf7 |
| serverId | c747b0d4-bb0a-4f3c-a377-0f1a8752b0c6 |
| volumeId | 7e794c92-9027-4cb0-a9ab-ba8036e9bbf7 |
+----------+--------------------------------------+
```

* エラーがないか確認：/var/log/cinder/volume.log
* エラーがないか確認：/var/log/nova/nova-comupte.log
* 確認：cinder list
* 確認：nova show

```shell-session
[root@akira ~(keystone_demo)]# cinder list
+--------------------------------------+--------+------+------+-------------+----------+-------------+--------------------------------------+
|                  ID                  | Status | Name | Size | Volume Type | Bootable | Multiattach |             Attached to              |
+--------------------------------------+--------+------+------+-------------+----------+-------------+--------------------------------------+
| 7e794c92-9027-4cb0-a9ab-ba8036e9bbf7 | in-use | hoge |  1   |  drbdmanage |  false   |    False    | c747b0d4-bb0a-4f3c-a377-0f1a8752b0c6 |
+--------------------------------------+--------+------+------+-------------+----------+-------------+--------------------------------------+
```

## 正常性確認
インスタンスへログインしてブロックデバイスが認識できているか、Read/Write できるか確認。
以下は ip コマンドでネームスペース（qrouter-xxxxx-xxxx ）指定でログインしてる例。

```shell-session
# ip netns exec qrouter-xxxxx-xxxx ssh -i cloud.key root@10.10.10.1
Last login: Wed Dec  2 14:43:12 2015 from 192.168.0.70
[fedora@demo-fedora23 ~]$
```

* 確認：lsblk , blockdev --report , mkfs.<filesystem> , mount  , dd など
* デタッチ：nova volume-detach ＜instance＞ ＜volume id＞

```shell-session
[fedora@demo-fedora23 ~]$ lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    252:0    0  20G  0 disk
`-vda1 252:1    0  20G  0 part /
vdb    252:16   0   1G  0 disk

[fedora@demo-fedora23 ~]$ sudo blockdev --report
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0     21474836480   /dev/vda
rw   256   512  4096       2048     21473787904   /dev/vda1
rw   256   512  4096          0      1073741824   /dev/vdb
```

# まとめ
ここでは、ドライバの動作について中心に確認してみました。期待された動作は行われている模様。実際の運用で使う場合は DRBD は当然レプリケーション構成になる。また、Cinder 側の HA にも考慮する必要があり、DRBD9 で利用可能な DRBD Client も合わせて活用しベストプラクティスな構成を模索してみる。

# 参考

* https://www.rdoproject.org/
* http://drbd.linbit.com/users-guide-9.0/s-openstack-install.html#s-openstack-addtl-conf
* http://docs.openstack.org/ja/user-guide/cli_cheat_sheet.html
* http://docs.openstack.org/ja/openstack-ops/content/attach_block_storage.html

# 次回の記事
[Sheile](http://qiita.com/Sheile) さんにの投稿です。「オレオレSSL証明書」についてということで楽しみであります。しいたけが嫌いなのかな？自分は玉ねぎが嫌いです。