DRBD9 の 3台構成クラスタ

DRBD9では、以前のバージョンに比べて3台以上のクラスタをより簡単に構築できるようになりました。DRBD8では、2台構成のクラスタを階層化するスタック構成を使用して3台以上のクラスタを組むことができましたが、構成が複雑になり、柔軟性にも欠けるものでした。
また、drbdmanageにより簡単にDRBDクラスタの管理ができるようになりました。
本記事では、drbdmanageを使用して3台構成のDRBDクラスタを構築する方法について紹介します。

なお、新しい管理ツールとしてLINSTORが現在開発されており(2018年11月現在β版)、将来はLINSTORへの移行が予定されています。LINSTORを用いたDRBDクラスタの構築については後日改めて公開する予定です。

1. 導入手順

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

  1. 必要なソフトウェアのインストール
  2. ssh、LVMの設定
  3. クラスタの初期化
  4. 2台目のノードの追加
  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/ 以下に既存の設定がある場合は競合する可能性があるので、すべて退避させて初期状態にしておきます。

drbdmanage のビルド、インストール

drbdmanageはELrepoに含まれていないので、自前でrpmをビルドする必要があります。

https://www.linbit.com/en/drbd-community/drbd-download/ よりdrbdmanageの最新版ソースコードをダウンロードします。

ビルドに必要なパッケージをインストールし、rpmをビルドします。なお、ELrepoのDRBDパッケージ名とdrbdmanage内の設定ファイルの記述に差異があるため、修正が必要となります。

$ sudo yum install pygobject2 help2man rpm-build
$ wget http://www.linbit.com/downloads/drbdmanage/drbdmanage-0.99.18.tar.gz
$ tar zxvf drbdmanage-0.99.18.tar.gz
$ cd drbdmanage-0.99.18
(依存パッケージ名を修正する)
$ vi setup.cfg
(修正前) drbd-utils >= 8.9.9
(修正後) drbd90-utils >= 8.9.9
$ make rpm
(dist/ 以下に rpm が作成される)
$ sudo rpm -ivh dist/drbdmanage-0.99.18-1.noarch.rpm

すべてのノードにrpmをコピーし、同様にインストールします。

4. sshの設定

ノード間でパスワードなしでsshログインできるように設定します。

[root@server1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
...
[root@server1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@server2
...
root@server2's password:
...

(server1 -> server2 にパスワードなしでログインできることを確認)
[root@server1 ~]# ssh root@server2

(server2 でも server1 に対して上記を行う)

5. LVMの設定

両ノードでLVMの物理ボリュームおよびボリュームグループを作成します。
drbdmanageはデフォルトでdrbdpoolという名前のボリュームグループを使用します。

# pvcreate /dev/sdb1
# vgcreate drbdpool /dev/sdb1

6. クラスタの初期化

最初に1台目のノードでdrbdmanageクラスタの初期化を実行します。
なお、複数のノードで初期化を行ってしまうと整合性が取れなくなるのでご注意ください。

[root@server1 ~]# drbdmanage init 192.168.1.11

You are going to initialize 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
Empty drbdmanage control volume initialized on '/dev/drbd0'.
Empty drbdmanage control volume initialized on '/dev/drbd1'.
Waiting for server: .
Operation completed successfully

管理用DRBDボリュームが作成され、1台目のノードがdrbdmanageに登録されたことを確認します。

[root@server1 ~]# drbdadm status
.drbdctrl role:Primary
  volume:0 disk:UpToDate
  volume:1 disk:UpToDate

[root@server1 ~]# drbdmanage list-nodes
 +----------------------------------------------------------------------+
 | Name    | Pool Size | Pool Free |                            | State |
 |----------------------------------------------------------------------|
 | server1 |      5116 |      5108 |                            |    ok |
 +----------------------------------------------------------------------+

7. 2台目のノードの追加

2台目のノードを追加します。server1で以下を実行すると、sshでserver2に自動的にログインして必要な操作が行われます。

[root@server1 ~]# drbdmanage add-node server2 192.168.1.12
Operation completed successfully
Operation completed successfully

Executing join command using ssh.
IMPORTANT: The output you see comes from server2
IMPORTANT: Your input is executed on server2
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
Waiting for server to start up (can take up to 1 min)
Operation completed successfully
Give leader time to contact the new node
Operation completed successfully

[root@server1 ~]# drbdmanage list-nodes
+----------------------------------------------------------------------+
| Name    | Pool Size | Pool Free |                            | State |
|----------------------------------------------------------------------|
| server1 |      5116 |      5108 |                            |    ok |
| server2 |      5116 |      5108 |                            |    ok |
+----------------------------------------------------------------------+

8. ボリュームの追加

上記で作成した2台のDRBDクラスタに新規ボリュームを追加します。
ここではvol1(1GB)、vol2(1GB)の2つのボリュームを2通りの方法で作成します。

1つ目は操作を1つずつ行います。
操作はリソース追加→ボリューム追加→デプロイの順で行います。

リソース vol1 を追加し、1GBのボリュームを割り当てます。

[root@server1 ~]# drbdmanage list-volumes
No resources defined
[root@server1 ~]# drbdmanage add-resource vol1
Operation completed successfully
[root@server1 ~]# drbdmanage add-volume vol1 1GB
Operation completed successfully

続いてリソースをデプロイします。以下の場合、最も要件に合致する2ノードを自動的に選択します。
今回は2ノードしかないので単に両方のノードが割り当てられますが、3ノード以上ある場合は空きが多いものから選択されます。
なお、assign-resourceで手動でノードを選択してデプロイすることもできます。

[root@server1 ~]# drbdmanage deploy-resource vol1 2
Operation completed successfully

ボリュームがデプロイされ、実際にDRBDリソースが作成されていることを確認します。

[root@server1 ~]# drbdmanage list-volumes
+----------------------------------------------------------------------+
| Name | Vol ID |       Size | Minor |                         | State |
|----------------------------------------------------------------------|
| vol1 |      0 | 953.67 MiB |   100 |                         |    ok |
+----------------------------------------------------------------------+
[root@server1 ~]# drbdmanage list-nodes
+----------------------------------------------------------------------+
| Name    | Pool Size | Pool Free |                            | State |
|----------------------------------------------------------------------|
| server1 |      5116 |      4152 |                            |    ok |
| server2 |      5116 |      4152 |                            |    ok |
+----------------------------------------------------------------------+
[root@server1 ~]# drbdadm status
.drbdctrl role:Primary
  volume:0 disk:UpToDate
  volume:1 disk:UpToDate
  server2 role:Secondary
    volume:0 peer-disk:UpToDate
    volume:1 peer-disk:UpToDate

vol1 role:Secondary
  disk:UpToDate
  server2 role:Secondary
    peer-disk:UpToDate

リソース追加、ボリューム追加、デプロイを一度に行うことも可能です。ここでは vol2 ボリュームを一度に作成します。

[root@server1 ~]# drbdmanage new-volume vol2 1GB --deploy 2
Operation completed successfully
Operation completed successfully
[root@server1 ~]# drbdmanage list-volumes
+---------------------------------------------------------------------+
| Name | Vol ID |       Size | Minor |                        | State |
|---------------------------------------------------------------------|
| vol1 |      0 | 953.67 MiB |   100 |                        |    ok |
| vol2 |      0 | 953.67 MiB |   101 |                        |    ok |
+---------------------------------------------------------------------+
[root@server1 ~]# drbdmanage list-nodes
+---------------------------------------------------------------------+
| Name    | Pool Size | Pool Free |                           | State |
|---------------------------------------------------------------------|
| server1 |      5116 |      3196 |                           |    ok |
| server2 |      5116 |      3196 |                           |    ok |
+---------------------------------------------------------------------+
[root@server1 ~]# drbdadm status
...
vol2 role:Secondary
  disk:UpToDate
  server2 role:Secondary
    peer-disk:UpToDate

9. ファイルシステムの作成

ファイルシステム作成対象のデバイスファイルは /dev/drbd100 から順に作成されます。
数字は drbdmanage list-volumes で表示される Minor の値に対応します。

[root@server1 ~]# mkfs -t ext4 /dev/drbd100
[root@server1 ~]# mkfs -t ext4 /dev/drbd101
[root@server1 ~]# mkdir /mnt/drbd1
[root@server1 ~]# mkdir /mnt/drbd2
[root@server1 ~]# mount /dev/drbd100 /mnt/drbd1
[root@server1 ~]# mount /dev/drbd101 /mnt/drbd2
[root@server1 ~]# df
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
...
/dev/drbd100                 944808    2404   877192    1% /mnt/drbd1
/dev/drbd101                 944808    2404   877192    1% /mnt/drbd2

10. 3台目のノードの追加

2台のDRBDクラスタに3台目のノードを追加する場合、3台目のノードで「3. 必要なソフトウェアのインストール」「4. sshの設定」および「5. LVMの設定」を行っておきます。
その後、 server1 で以下を実行します。

[root@server1 ~]# drbdmanage add-node server3 192.168.1.13
Operation completed successfully
Operation completed successfully
Host key verification failed.
Give leader time to contact the new node
Operation completed successfully
Operation completed successfully

Join command for node server3:
drbdmanage join -p 6999 192.168.1.13 2 server1 192.168.1.11 0 xxxxxxxxxxxxxxxx

「Join command for node (ホスト名):」で提示されたコマンドを追加するノードで実行します(パスワードなしで ssh ログインできるようにしている場合は server1 から実行できます)。

[root@server3 ~]# drbdmanage join -p 6999 192.168.1.13 2 server1 192.168.1.11 0 xxxxxxxxxxxxxxxx
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
Waiting for server to start up (can take up to 1 min)
Operation completed successfully
drbdmanage list-nodes でノードが追加されていることを確認します。

[root@server1 ~]# drbdmanage list-nodes
+---------------------------------------------------------------------+
| Name    | Pool Size | Pool Free |                           | State |
|---------------------------------------------------------------------|
| server1 |      5116 |      3196 |                           |    ok |
| server2 |      5116 |      3196 |                           |    ok |
| server3 |      5116 |      5108 |                           |    ok |
+---------------------------------------------------------------------+

ボリューム vol2 を3台目のノードにアサインします。

[root@server1 ~]# drbdmanage assign-resource vol2 server3
Operation completed successfully

追加したノードにボリュームが作成され、同期が開始されます。

[root@server1 ~]# drbdadm status
.drbdctrl role:Primary
  volume:0 disk:UpToDate
  volume:1 disk:UpToDate
  server2 role:Secondary
    volume:0 peer-disk:UpToDate
    volume:1 peer-disk:UpToDate
  server3 role:Secondary
    volume:0 peer-disk:UpToDate
    volume:1 peer-disk:UpToDate

vol1 role:Secondary
  disk:UpToDate
  server2 role:Secondary
    peer-disk:UpToDate

vol2 role:Secondary
  disk:UpToDate
  server2 role:Secondary
    peer-disk:UpToDate
  server3 role:Secondary
    replication:SyncSource peer-disk:Inconsistent done:0.61

しばらく待つと同期が完了し、3台目のノードのボリュームが使用されていることを確認します。

[root@server1 ~]# drbdadm status
...
vol2 role:Secondary
  disk:UpToDate
  server2 role:Secondary
    peer-disk:UpToDate
  server3 role:Secondary
    peer-disk:UpToDate

[root@server1 ~]# drbdmanage list-nodes
+----------------------------------------------------------------------+
| Name    | Pool Size | Pool Free |                            | State |
|----------------------------------------------------------------------|
| server1 |      5116 |      3196 |                            |    ok |
| server2 |      5116 |      3196 |                            |    ok |
| server3 |      5116 |      4152 |                            |    ok |
+----------------------------------------------------------------------+

このとき各ボリュームは以下のようにアサインされています。

+---------+  +---------+  +---------+
| server1 |--| server2 |--| server3 |
+---------+  +---------+  +---------+
+---------+  +---------+ 
|  vol1   |  |  vol1   |
+---------+  +---------+  +---------+
|  vol2   |  |  vol2   |  |  vol2   |
+---------+  +---------+  +---------+