DRBD9を管理するツールとしてdrbdmanageがありますが、drbdmanageには分散データベース(drbdctrl)の性能や、ノード間の通信に使用しているD-Busプロトコルの安定性など、いくつかの問題を抱えていました。
この問題を解決するため、DRBD9の新しい管理ツールとしてLINSTORが新たに開発されました。本記事ではLINSTORを使ってDRBD9の3台構成クラスタを管理する方法について紹介します。なお、2019年1月現在LINSTORはβ版という位置づけになります。
1. 導入手順
本記事では以下の手順で導入を行います。
- 必要なソフトウェアのビルド・インストール
- LVMの設定
- LINSTORの起動
- クラスタへのノードの登録
- ボリュームの追加
- 3台目のノードの追加およびボリュームの追加
2. 前提
本記事で使用する環境は以下になります。
OS: CentOS 7.4
ホスト名 | IPアドレス | DRBD用パーティション |
---|---|---|
server1 | 192.168.1.11 | /dev/sdb1 |
server2 | 192.168.1.12 | /dev/sdb1 |
server3 | 192.168.1.13 | /dev/sdb1 |
3. 必要なソフトウェアのインストール
ELrepoからDRBD9パッケージをインストール
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # yum install kmod-drbd90 drbd90-utils
/etc/drbd.d/ 以下に既存の設定がある場合は競合する可能性があるので、すべて退避させて初期状態にしておきます。
LINSTORのビルド、インストール
LINSTORは自前でソースコードからrpmをビルドする必要があります。
https://www.linbit.com/en/drbd-community/drbd-download/ よりLINSTORの最新版ソースコード(linstor-client, python-linstor, linstor-serverの3種類)をダウンロードします。
ビルドにはJavaのビルドツールであるgradle(およびそのインストールに必要なSDKMAN)が必要となります。
$ curl -s get.sdkman.io | bash $ source "$HOME/.sdkman/bin/sdkman-init.sh" $ sdk version SDKMAN 5.7.3+337 $ sdk install gradle Downloading: gradle 5.0 In progress... ######################################################################## 100.0% Installing: gradle 5.0 Done installing! Setting gradle 5.0 as default.
gradleのインストールが完了したら、rpmをビルドします。なお、ELrepoのDRBDパッケージ名とLINSTOR内の設定ファイルの記述に差異があるため、修正が必要となります。
linstor-serverのインストール
$ sudo yum install rpm-build $ wget http://www.linbit.com/downloads/linstor/linstor-server-0.7.3.tar.gz $ tar zxvf linstor-server-0.7.3.tar.gz $ cd linstor-server-0.7.3 (依存パッケージ名を修正する) $ vi linstor.spec (修正前) drbd-utils >= 8.9.9 (修正後) drbd90-utils >= 8.9.9 $ cd .. $ mv linstor-server-0.7.3.tar.gz linstor-server-0.7.3-orig.tar.gz $ tar zcf linstor-server-0.7.3.tar.gz linstor-server-0.7.3 $ rpmbuild -tb linstor-server-0.7.3.tar.gz $ sudo rpm -ivh rpmbuild/RPMS/noarch/*
python-linstorのインストール
$ sudo yum install protobuf-compiler $ tar zxvf python-linstor-0.7.2.tar.gz $ cd python-linstor-0.7.2 $ make rpm $ sudo rpm -ivh dist/python-linstor-0.7.2-1.noarch.rpm
linstor-clientのインストール
$ tar zxvf linstor-client-0.7.2.tar.gz $ cd linstor-client-0.7.2 $ make rpm $ sudo rpm -ivh dist/linstor-client-0.7.2-1.noarch.rpm
すべてのノードに上記で作成したrpmをコピーし、同様にインストールします。
4. LVMの設定
DRBDで使用するためのLVMの設定をすべてのノードであらかじめ行っておきます。
# pvcreate /dev/sdb1 # vgcreate vg1 /dev/sdb1
4. LINSTORの起動
各ノードでDRBDが起動していない場合は起動しておきます。設定は初期状態(リソースが定義されていない状態)にしておきます。
# systemctl start drbd
server1でlinstor-controllerおよびlinstor-satelliteを起動します。
# systemctl start linstor-controller # systemctl start linstor-satellite
5. クラスタへのノードの登録
server1で自身をクラスタのノードとして登録します。
[root@server1 ~]# linstor node create server1 192.168.1.11 SUCCESS: Description: New node 'server1' registered. Details: Node 'server1' UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ノードが追加されていることを確認します。
[root@server1 ~]# linstor node list
+-----------------------------------------------------------+
| Node | NodeType | Addresses | State |
|-----------------------------------------------------------|
| server1 | SATELLITE | 192.168.1.11:3366 (PLAIN) | OFFLINE |
+-----------------------------------------------------------+
10秒ほど待つとOnlineになります。
+----------------------------------------------------------+
| Node | NodeType | Addresses | State |
|----------------------------------------------------------|
| server1 | SATELLITE | 192.168.1.11:3366 (PLAIN) | Online |
+----------------------------------------------------------+
server2をクラスタのノードとして追加します。
[root@server1 ~]# linstor node create server2 192.168.1.12 SUCCESS: Description: New node 'server2' registered. Details: Node 'server2' UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx [root@server1 ~]# linstor node list +-----------------------------------------------------------+ | Node | NodeType | Addresses | State | |-----------------------------------------------------------| | server1 | SATELLITE | 192.168.1.11:3366 (PLAIN) | Online | | server2 | SATELLITE | 192.168.1.12:3366 (PLAIN) | OFFLINE | +-----------------------------------------------------------+
server2でlinstor-satelliteを起動し、10秒ほど待つとOnlineになります。
[root@server2 ~]# systemctl start linstor-satellite [root@server1 ~]# linstor node list +----------------------------------------------------------+ | Node | NodeType | Addresses | State | |----------------------------------------------------------| | server1 | SATELLITE | 192.168.1.11:3366 (PLAIN) | Online | | server2 | SATELLITE | 192.168.1.12:3366 (PLAIN) | Online | +----------------------------------------------------------+
6. ボリュームの追加
ストレージプールの作成
「4. LVMの設定」で作成したボリュームグループをストレージプールとして追加します。
[root@server1 ~]# linstor storage-pool create lvm server1 pool1 vg1 SUCCESS: Description: New storage pool 'pool1' on node 'server1' registered. Details: Storage pool 'pool1' on node 'server1' UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx SUCCESS: (server1) Changes applied to storage pool 'pool1' [root@server1 ~]# linstor storage-pool create lvm server2 pool1 vg1 SUCCESS: Description: New storage pool 'pool1' on node 'server2' registered. Details: Storage pool 'pool1' on node 'server2' UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx SUCCESS: (server2) Changes applied to storage pool 'pool1'
作成したストレージプールの一覧を表示して確認します。
[root@server1 ~]# linstor storage-pool list +-------------------------------------------------------------------------------------------------+ | StoragePool | Node | Driver | PoolName | FreeCapacity | TotalCapacity | SupportsSnapshots | |-------------------------------------------------------------------------------------------------| | pool1 | server1 | LvmDriver | vg1 | 5.00 GiB | 5.00 GiB | false | | pool1 | server2 | LvmDriver | vg1 | 5.00 GiB | 5.00 GiB | false | +-------------------------------------------------------------------------------------------------+
ボリューム定義の作成
リソースおよびボリュームの定義を作成します。この時点ではまだ実際のボリュームは確保されていません。
[root@server1 ~]# linstor resource-definition create vol1 SUCCESS: Description: New resource definition 'vol1' created. Details: Resource definition 'vol1' UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx [root@server1 ~]# linstor volume-definition create vol1 1G SUCCESS: New volume definition with number '0' of resource definition 'vol1' created.
手動配備
上記で作成したボリューム定義に基づき、各ノードにボリュームを配備します。以下ではserver1とserver2にvol1ボリュームを配備します。
[root@server1 ~]# linstor resource create server1 vol1 --storage-pool pool1 SUCCESS: Description: New resource 'vol1' on node 'server1' registered. Details: Resource 'vol1' on node 'server1' UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx SUCCESS: Description: Volume with number '0' on resource 'vol1' on node 'server1' successfully registered Details: Volume UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx SUCCESS: Created resource 'vol1' on 'server1' SUCCESS: Description: Resource 'vol1' on 'server1' ready Details: Node(s): 'server1', Resource: 'vol1' [root@server1 ~]# linstor resource create server2 vol1 --storage-pool pool1 SUCCESS: Description: New resource 'vol1' on node 'server2' registered. Details: Resource 'vol1' on node 'server2' UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx SUCCESS: Description: Volume with number '0' on resource 'vol1' on node 'server2' successfully registered Details: Volume UUID is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx SUCCESS: Added peer(s) 'server2' to resource 'vol1' on 'server1' SUCCESS: Created resource 'vol1' on 'server2' SUCCESS: Description: Resource 'vol1' on 'server2' ready Details: Node(s): 'server2', Resource: 'vol1'
配備した分の空き容量(FreeCapacity)が減少していることを確認します。
[root@server1 ~]# linstor storage-pool list +-------------------------------------------------------------------------------------------------+ | StoragePool | Node | Driver | PoolName | FreeCapacity | TotalCapacity | SupportsSnapshots | |-------------------------------------------------------------------------------------------------| | pool1 | server1 | LvmDriver | vg1 | 3.99 GiB | 5.00 GiB | false | | pool1 | server2 | LvmDriver | vg1 | 3.99 GiB | 5.00 GiB | false | +-------------------------------------------------------------------------------------------------+
自動配備
上記ではserver1とserver2にボリュームを明示的に配備しましたが、今度は空きのあるストレージプールおよびノードを自動選択して配備します(今回は2ノードのみなので手動配備と同様の結果になります)。
[root@server1 ~]# linstor resource-definition create vol2 [root@server1 ~]# linstor volume-definition create vol2 1G [root@server1 ~]# linstor resource create vol2 --auto-place 2 SUCCESS: Description: Resource 'vol2' successfully autoplaced on 2 nodes Details: Used storage pool: 'pool1' Used nodes: 'server1', 'server2' SUCCESS: Created resource 'vol2' on 'server2' SUCCESS: Created resource 'vol2' on 'server1' SUCCESS: Description: Resource 'vol2' on 'server1' ready Details: Auto-placing resource: vol2 SUCCESS: Description: Resource 'vol2' on 'server2' ready Details: Auto-placing resource: vol2 [root@server1 ~]# linstor storage-pool list +-------------------------------------------------------------------------------------------------+ | StoragePool | Node | Driver | PoolName | FreeCapacity | TotalCapacity | SupportsSnapshots | |-------------------------------------------------------------------------------------------------| | pool1 | server1 | LvmDriver | vg1 | 2.99 GiB | 5.00 GiB | false | | pool1 | server2 | LvmDriver | vg1 | 2.99 GiB | 5.00 GiB | false | +-------------------------------------------------------------------------------------------------+
リソース一覧、ボリューム定義意一覧を表示し、適切にリソースが配備されていることを確認します。
[root@server1 ~]# linstor resource list +---------------------------------------------------+ | ResourceName | Node | Port | Usage | State | |---------------------------------------------------| | vol1 | server1 | 7000 | Unused | UpToDate | | vol1 | server2 | 7000 | Unused | UpToDate | | vol2 | server1 | 7001 | Unused | UpToDate | | vol2 | server2 | 7001 | Unused | UpToDate | +---------------------------------------------------+ [root@server1 ~]# linstor volume-definition list +-------------------------------------------------------+ | ResourceName | VolumeNr | VolumeMinor | Size | State | |-------------------------------------------------------| | vol1 | 0 | 1000 | 1 GiB | ok | | vol2 | 0 | 1001 | 1 GiB | ok | +-------------------------------------------------------+
作成したボリュームの使用
作成したボリュームは通常のDRBDボリュームと同様に使用できます。
[root@server1 ~]# ls -l /dev/drbd1* brw-rw---- 1 root disk 147, 1000 12月 7 16:29 /dev/drbd1000 brw-rw---- 1 root disk 147, 1001 12月 7 16:34 /dev/drbd1001 [root@server1 ~]# drbdadm status vol1 role:Secondary disk:UpToDate server2 role:Secondary peer-disk:UpToDate vol2 role:Secondary disk:UpToDate server2 role:Secondary peer-disk:UpToDate [root@server1 ~]# mkfs.ext4 /dev/drbd1000 [root@server1 ~]# mkdir /mnt/drbd [root@server1 ~]# mount /dev/drbd1000 /mnt/drbd [root@server1 ~]# df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/drbd1000 1003076 2584 931488 1% /mnt/drb
なお、以下のDRBD設定ファイルが自動生成されますが、これらはLINSTORが管理しているため手で編集してはいけません。
[root@server1 ~]# ls -l /var/lib/linstor.d/ 合計 12 -rw-r--r-- 1 root root 79 12月 7 15:08 linstor_common.conf -rw-r--r-- 1 root root 797 12月 7 16:30 vol1.res -rw-r--r-- 1 root root 797 12月 7 16:34 vol2.res
7. 3台目のノードの追加およびボリュームの追加
新しく3台目のノードを追加する場合も2台目と同様に登録を行います。必要なパッケージは事前にインストールしておきます。
server3でサービスの起動、LVMの作成を行います。
[root@server3 ~]# systemctl start drbd [root@server3 ~]# vgcreate vg1 /dev/sdb1 [root@server3 ~]# systemctl start linstor-controller
server3をクラスタのノードに追加します。
[root@server1 ~]# linstor node create server3 192.168.1.13 [root@server1 ~]# linstor node list +----------------------------------------------------------+ | Node | NodeType | Addresses | State | |----------------------------------------------------------| | server1 | SATELLITE | 192.168.1.11:3366 (PLAIN) | Online | | server2 | SATELLITE | 192.168.1.12:3366 (PLAIN) | Online | | server3 | SATELLITE | 192.168.1.13:3366 (PLAIN) | Online | +----------------------------------------------------------+
server3のLVMボリュームグループをストレージプールに追加します。
[root@server1 ~]# linstor storage-pool create lvm server3 pool1 vg1 [root@server1 ~]# linstor storage-pool list +-------------------------------------------------------------------------------------------------+ | StoragePool | Node | Driver | PoolName | FreeCapacity | TotalCapacity | SupportsSnapshots | |-------------------------------------------------------------------------------------------------| | pool1 | server1 | LvmDriver | vg1 | 2.99 GiB | 5.00 GiB | false | | pool1 | server2 | LvmDriver | vg1 | 2.99 GiB | 5.00 GiB | false | | pool1 | server3 | LvmDriver | vg1 | 5.00 GiB | 5.00 GiB | false | +-------------------------------------------------------------------------------------------------+
リソース、ボリュームを定義し、server2とserver3に配備します。
[root@server1 ~]# linstor resource-definition create vol3 [root@server1 ~]# linstor volume-definition create vol3 1G [root@server1 ~]# linstor resource create server2 vol3 --storage-pool pool1 [root@server1 ~]# linstor resource create server3 vol3 --storage-pool pool1 [root@server1 ~]# linstor storage-pool list +-------------------------------------------------------------------------------------------------+ | StoragePool | Node | Driver | PoolName | FreeCapacity | TotalCapacity | SupportsSnapshots | |-------------------------------------------------------------------------------------------------| | pool1 | server1 | LvmDriver | vg1 | 2.99 GiB | 5.00 GiB | false | | pool1 | server2 | LvmDriver | vg1 | 1.99 GiB | 5.00 GiB | false | | pool1 | server3 | LvmDriver | vg1 | 3.99 GiB | 5.00 GiB | false | +-------------------------------------------------------------------------------------------------+
リソース一覧を表示し、リソースが配備されているノードおよび状態を確認します。
[root@server1 ~]# linstor resource list +-------------------------------------------------------------+ | ResourceName | Node | Port | Usage | State | |-------------------------------------------------------------| | vol1 | server1 | 7000 | Unused | UpToDate | | vol1 | server2 | 7000 | Unused | UpToDate | | vol2 | server1 | 7001 | Unused | UpToDate | | vol2 | server2 | 7001 | Unused | UpToDate | | vol3 | server2 | 7002 | Unused | UpToDate | | vol3 | server3 | 7002 | Unused | SyncTarget(17.08%) | +-------------------------------------------------------------
8. おわりに
今回はLINSTORの使い方について簡単に紹介しました。このように、LINSTORを使うことで3台以上のDRBDクラスタを容易に管理することができるようになります。また、LINSTORはDockerのコンテナ管理システムであるKubernetesのバックエンドのストレージシステムとしての利用も想定されており、今後広く使われていくことが期待されます。