Proxmox VE 4.1でストレージ機器を用いずにクラスタ間でライブマイグレーションを行う(DRBD9)

Proxmoxのクラスタ間でのライブマイグレーションを行う場合、通常であればiSCSIやSANで仮想HDDなどをおいておくストレージが必要なのだけど、それなしでもvSANやNutanix CEを利用するようにしてライブマイグレーションを出来ないか調べてみた。
一応、ProxmoxのノードでCeph(RBD)を利用することが出来るのだけど、そうなると最低でも3台構成以上じゃないとあまり旨味が無いので、なんかいい方法が無いかと調べていたところ、各クラスタノードで共通のディレクトリ(ディスク)をDRBDで同期させて、そこに仮想マシンのファイルを配置することで対応出来そうだったので、やってみることにした。

前提として、すでにProxmoxクラスタは構築済、ディスクはまだフォーマットされていないけど各クラスタに同容量のが刺さってる状態で、DRBD9を導入する。
また、DRBDでディスクの同期を行うために、Proxmox上の仮想マシンで利用しないNIC(ここではeth1)を別途用意しておく必要がある。
作業はこちらの情報を参考に進めていく。

1.ネットワークの設定

ネットワークの設定ファイル(/etc/network/interfaces)を編集し、DRBDで通信を行うためのNIC(eth1)について設定を追加する。

●/etc/network/interfaces(例)

auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
        address  IPアドレス(DRBD用)
        netmask  255.255.255.0

auto vmbr0
iface vmbr0 inet static
        address IPアドレス(通常利用)
        netmask XXX.XXX.XXX.XXX
        gateway XXX.XXX.XXX.XXX
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0

設定完了後、念のため再起動しておくと良いだろう。

2.ディスクフォーマット&DRBDの導入

次に、各クラスタでディスク(/dev/sdb)のフォーマットを行う。
事前にpartedを導入しておくと良いだろう。
サブスクリプションは契約していないため、このままだとdebianのapt-getも出来ないので不要なファイルを削除してパッケージをインストールする。

rm /etc/apt/sources.list.d/pve-enterprise.list
echo "deb http://download.proxmox.com/debian jessie pve-no-subscription" >> /etc/apt/sources.list
apt-get update
apt-get install parted thin-provisioning-tools

次に、partedコマンドでディスクのフォーマットを行う。

parted /dev/sdb mktable gpt
parted /dev/sdb mkpart drbd 1 100%
parted /dev/sdb p
root@BS-PUB-MICROSERVER-01:~# parted /dev/sdb mktable gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want
to continue?
Yes/No? Y
Information: You may need to update /etc/fstab.

root@BS-PUB-MICROSERVER-01:~# parted /dev/sdb mkpart drbd 1 100%
Information: You may need to update /etc/fstab.

root@BS-PUB-MICROSERVER-01:~# parted /dev/sdb p
Model: ATA Hitachi HCS54505 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name  Flags
 1      1049kB  500GB  500GB               drbd

ディスクフォーマット後、LVMの設定を実施する。

vgcreate drbdpool /dev/sdb1
lvcreate -L 450G -n drbdthinpool -T drbdpool
root@BS-PUB-MICROSERVER-02:~# vgcreate drbdpool /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
  Volume group "drbdpool" successfully created
root@BS-PUB-MICROSERVER-02:~# lvcreate -L 450G -n drbdthinpool -T drbdpool
  Logical volume "drbdthinpool" created.

次に、drbdmanage をapt-getから導入する。

apt-get install drbdmanage

互いにssh接続を行う必要があるので、DRBD用のNICがknown_hostsに登録されるよう事前にログインしあっておく。
(事前にクラスタ化しているようであれば、鍵認証はすでに出来てるはずである)

クラスタのウチの1台(ここでは、「BS-PUB-MICROSERVER-01」)で、以下のコマンドを実行する。

drbdmanage init -q 自身のDRBD用IPアドレス
root@BS-PUB-MICROSERVER-01:~# drbdmanage init -q 10.50.10.101
  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.
md_offset 4190208
al_offset 4157440
bm_offset 4153344

Found some data

 ==> This might destroy existing data! <== Do you want to proceed? *** confirmation forced via --force option *** initializing activity log NOT initializing bitmap Writing meta data... New drbd meta data block successfully created. md_offset 4190208 al_offset 4157440 bm_offset 4153344 Found some data  ==> This might destroy existing data! <==

Do you want to proceed?
*** confirmation forced via --force option ***
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

次に、以下のコマンドでもう一台のノード(ここでは、「BS-PUB-MICROSERVER-02」)を追加する。

drbdmanage add-node -q ノード名 IPアドレス
root@BS-PUB-MICROSERVER-01:~# drbdmanage add-node -q BS-PUB-MICROSERVER-02 10.50.10.102
Operation completed successfully
Operation completed successfully

Executing join command using ssh.
IMPORTANT: The output you see comes from BS-PUB-MICROSERVER-02
IMPORTANT: Your input is executed on BS-PUB-MICROSERVER-02
  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

※ もしこの時、「Error: Operation not allowed on satellite node」というエラーが出た場合は、こちらに記述されている対応を行うと良いだろう。

最後に、以下のコマンドを実行しノードの一覧を確認する。

drbdmanage list-nodes
root@BS-PUB-MICROSERVER-01:~# drbdmanage list-nodes
+------------------------------------------------------------------------------------------------------------+
| Name                  | Pool Size | Pool Free |                                                    | State |
|------------------------------------------------------------------------------------------------------------|
| BS-PUB-MICROSERVER-01 |    460800 |    458910 |                                                    |    ok |
| BS-PUB-MICROSERVER-02 |    460800 |    458910 |                                                    |    ok |
+------------------------------------------------------------------------------------------------------------+

ちゃんとPool Size/Pool Freeの値が表示されている事が確認出来たら、「/etc/pve/storage.cfg」の内容を以下のように追記する。
なお、「redundancy」には同期するノード数を記述する(物理ノード数より大きい値は入れられないので注意)。

dir: local
        path /var/lib/vz
        content vztmpl,images,iso,rootdir
        maxfiles 0

drbd: drbd1
        content images,rootdir
        redundancy 2

3.ライブマイグレーションの実施

DRBDの設定ができたら、後はWEBコンソール上で仮想マシンを作成するだけだ。
※当たり前の話だが、ディスクの作成先はDRBDのディスク上となる。また、ディスクフォーマットは「raw」一択なので注意。

で、作成後に対象のノードを右クリック、[マイグレート]を選択。

後は「オンライン」にチェックが入った状態でマイグレートを実施するだけだ。

確かに、別途ストレージ機器を用意しなくてもライブマイグレーションを行える事が確認できた。
ディスク容量はその分食うけど、仮想ホストノード機器のみでマイグレーションを行えるのはいいね。