CentOS8でDRBD9を動かしてみる

Table of Content

はじめに

DRBDとは

DRBD(Distributed Replicated Block Device)とは、ネットワークを通じてブロックデバイスをリアルタイムに同期(複製)するソフトウエアです。サービスの冗長化に役立つソフトウェアとしてPacemakerと合わせて広く使われています。
DRBD,Pacemakerともにオープンソースとして開発が進められているため、無料でサーバの冗長化が可能です。Pacemakerとの組み合わせは別の機会として、今回はCentOS8上にDRBD9を構築してみたいと思います。

DRBD9の新機能

DRBD9ではSDS(Software-Defined Storage)向けの機能が強化されています。

  • 多ノード接続
    DRBD9では3台以上のノードでもレプリケーションが可能になりました。従って、例えば1台が故障しても2台で冗長構成を維持したまま切り替え作業が可能になります。
  • 自動プロモーション機能
    DRBD8まではプライマリからセカンダリの切り替えに際しては以下の手順が必要でした。

    1. プライマリ側のDRBDデバイスのアンマウント
    2. プライマリ側のDRBDデバイスをセカンダリに降格
    3. セカンダリ側のDRBDデバイスをプライマリに昇格
    4. セカンダリ側のDRBDデバイスをマウント

    DRBD9からは降格・昇格の処理は行わなくてもプライマリ・セカンダリに切り替わります。pacemakerと組み合わせた場合にクラスタ設定を大幅に簡素化出来ます。

  • パフォーマンス向上
    DRBD9はパフォーマンスが大幅に向上しています。ランダム書き込みにおけるIOPSの測定では、SSDを使った環境で最大100倍近く高速になっています。

前提

今回立てるサーバは以下の通りです。vagrant-libvirtで仮想マシンを作成しています。

ホスト名 IPアドレス ディスク
node1 192.168.200.10 /dev/vdb
node2 192.168.200.11 /dev/vdb

特に表記が無い場合は、両サーバでコマンドを入力します。

DRBD構成

インストール

ELRepoリポジトリを有効にしてDRBD9をインストールします。

sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo dnf -y install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
sudo dnf install -y drbd90-utils kmod-drbd90

drbdモジュールを有効化するため、ここでリブートします。

SELinuxを有効にしている場合、デフォルトのSELinuxポリシーでは、DRBDからのメールの実行に失敗するため、DRBDプロセスをSELinuxの制御から外す必要があります。

sudo dnf -y install policycoreutils-python-utils
sudo semanage permissive -a drbd_t

ファイアウォールを有効にしている場合、DRBDで使うファイアウォールのポートを空けます

sudo firewall-cmd --add-port=6996-7800/tcp --permanent
sudo firewall-cmd --reload

ディスクの準備

ディスクレイアウトは以下の通りです。

$ lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  11G  0 disk 
`-vda1 253:1    0  10G  0 part /
vdb    253:16   0  20G  0 disk 

パーティションを作成します。

sudo parted /dev/vdb mklabel msdos
sudo parted /dev/vdb mkpart primary 0% 100%
sudo parted /dev/vdb set 1 lvm on

LVMをインストールしてPV,VGとLVを作成します

sudo dnf install -y lvm2
sudo pvcreate /dev/vdb1
sudo vgcreate pool /dev/vdb1
sudo lvcreate -n data0 -l 100%FREE pool

DRBDリソースの定義

/etc/drbd.d/r0.resを編集し、作成したLVを同期させるようにします。

resource r0 {
  on node1 {
    device    /dev/drbd0;
    disk      /dev/mapper/pool-data0;
    address   192.168.200.10:7789;
    meta-disk internal;
  }
  on node2 {
    device    /dev/drbd0;
    disk      /dev/mapper/pool-data0;
    address   192.168.200.11:7789;
    meta-disk internal;
  }
}

DRBDリソースの初期化及び有効化

DRBDリソースを初期化しまし、有効にします。

sudo drbdadm create-md r0
sudo drbdadm up r0
$ sudo drbdadm status r0
r0 role:Secondary
  disk:Inconsistent
  node2 connection:Connecting

DRBD同期開始

node1側をプライマリに昇格させ同期を開始します。

[vagrant@node1 ~]$ sudo drbdadm primary --force r0
[vagrant@node1 ~]$ sudo drbdadm status r0
r0 role:Primary
  disk:UpToDate
  node2 role:Secondary
    replication:SyncSource peer-disk:Inconsistent done:12.17

同期が完了するとdrbdadm statusの結果は以下の通りとなります。

[vagrant@node1 ~]$ sudo drbdadm status r0
r0 role:Primary
  disk:UpToDate
  node2 role:Secondary
    peer-disk:UpToDate

[vagrant@node2 ~]$ sudo drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  node1 role:Primary
    peer-disk:UpToDate

DRBDデバイスを使ってみる

プライマリホストで使ってみる

DRBDデバイスができたところで、lsblkの内容を確認します。

[vagrant@node1 ~]$ lsblk
NAME           MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda            253:0    0  11G  0 disk 
`-vda1         253:1    0  10G  0 part /
vdb            253:16   0  20G  0 disk 
`-vdb1         253:17   0  20G  0 part 
  `-pool-data0 252:0    0  20G  0 lvm  
    `-drbd0    147:0    0  20G  0 disk 

node1で作成したDRBDデバイスにファイルシステムを作成してマウントします。

[vagrant@node1 ~]$ sudo mkfs.xfs /dev/drbd0
[vagrant@node1 ~]$ sudo mkdir /mnt/drbd0
[vagrant@node1 ~]$ sudo mount /dev/drbd0 /mnt/drbd0
[vagrant@node1 ~]$ df -hT /mnt/drbd0
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/drbd1     xfs    20G  175M   20G   1% /mnt/drbd0

テストデータを書き込んでみます。

[vagrant@node1 ~]$ for i in {0..9}; do sudo touch /mnt/drbd0/${i}.txt; done
[vagrant@node1 ~]$ ls -al /mnt/drbd0
total 0
drwxr-xr-x. 2 root root 136 Oct 29 21:39 .
drwxr-xr-x. 3 root root  19 Oct 29 21:36 ..
-rw-r--r--. 1 root root   0 Oct 29 21:39 0.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 1.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 2.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 3.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 4.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 5.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 6.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 7.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 8.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 9.txt

セカンダリホストを昇格しマウントしてみる

node1でDRBDデバイスをアンマウントし、セカンダリに降格させます。

[vagrant@node1 ~]$ sudo umount /mnt/drbd0
[vagrant@node1 ~]$ sudo drbdadm secondary r0
[vagrant@node1 ~]$ sudo drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  node2 role:Secondary
    peer-disk:UpToDate

node2でプライマリに昇格させて、DRBDデバイスをマウントします。

[vagrant@node2 ~]$ sudo drbdadm primary r0
[vagrant@node2 ~]$ sudo drbdadm status r0
r0 role:Primary
  disk:UpToDate
  node1 role:Secondary
    peer-disk:UpToDate

[vagrant@node2 ~]$ sudo mkdir /mnt/drbd0
[vagrant@node2 ~]$ sudo mount /dev/drbd0 /mnt/drbd0
[vagrant@node2 ~]$ df -hT /mnt/drbd1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/drbd1     xfs    20G  175M   20G   1% /mnt/drbd0
[vagrant@node2 ~]$ ls -al /mnt/drbd1
total 0
drwxr-xr-x. 2 root root 136 Oct 29 21:39 .
drwxr-xr-x. 3 root root  19 Oct 29 21:42 ..
-rw-r--r--. 1 root root   0 Oct 29 21:39 0.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 1.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 2.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 3.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 4.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 5.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 6.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 7.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 8.txt
-rw-r--r--. 1 root root   0 Oct 29 21:39 9.txt

DRBD9の新機能を試す

自動プロモーション機能を使って、プライマリ。セカンダリの切り替えを見ていきます。
まずは、両サーバをセカンダリに降格させておきます。

[vagrant@node1 ~]$ sudo drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  node2 role:Secondary
    peer-disk:UpToDate

[vagrant@node2 ~]$ sudo drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  node1 role:Secondary
    peer-disk:UpToDate

node1側でマウントしてみます。drbdadmで昇格させることなく、自動でプライマリに昇格しました。

[vagrant@node1 ~]$ sudo mount /dev/drbd0 /mnt/drbd0
[vagrant@node1 ~]$ sudo drbdadm status r0
r0 role:Primary
  disk:UpToDate
  node2 role:Secondary
    peer-disk:UpToDate

アンマウントしてみます。

[vagrant@node1 ~]$ sudo umount /mnt/drbd0
[vagrant@node1 ~]$ sudo drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  node2 role:Secondary
    peer-disk:UpToDate

node1,node2でマウントしてみます。node2側はエラーが表示されてマウント出来ないのが確認できるかと思います。

[vagrant@node1 ~]$ sudo mount /dev/drbd0 /mnt/drbd0
[vagrant@node1 ~]$ sudo drbdadm status r0
r0 role:Primary
  disk:UpToDate
  node2 role:Secondary
    peer-disk:UpToDate

[vagrant@node2 ~]$ sudo mount /dev/drbd0 /mnt/drbd0
mount: /mnt/drbd0: mount(2) system call failed: Wrong medium type.
[vagrant@node2 ~]$ sudo drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  node1 role:Primary
    peer-disk:UpToDate

最後に

DRBD9を使ってみましたが、SDSで大量のストレージを管理するとなると、かなり手間がかかります。DRBD9では管理ツールとしてdrbdmanageがありますが、不安定であるとのこと。この問題を解決するために新しい管理ツールとしてLINSTORが開発されています。別記事にてDRBD9+LINSTORでSDSを構築してみたいと思います。