DRBD9クラスタをLINSTORで管理する

DRBD9を管理するツールとしてdrbdmanageがありますが、drbdmanageには分散データベース(drbdctrl)の性能や、ノード間の通信に使用しているD-Busプロトコルの安定性など、いくつかの問題を抱えていました。

この問題を解決するため、DRBD9の新しい管理ツールとしてLINSTORが新たに開発されました。本記事ではLINSTORを使ってDRBD9の3台構成クラスタを管理する方法について紹介します。なお、2019年1月現在LINSTORはβ版という位置づけになります。

1. 導入手順

本記事では以下の手順で導入を行います。

  1. 必要なソフトウェアのビルド・インストール
  2. LVMの設定
  3. LINSTORの起動
  4. クラスタへのノードの登録
  5. ボリュームの追加
  6. 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のバックエンドのストレージシステムとしての利用も想定されており、今後広く使われていくことが期待されます。