猫の手なら貸せる

いろいろ共有できたらいいなとおもってます

DRBDとPacemakerでNFSを構築してみる

DRBDとPacemakerでNFSを構築する

ラズベリーパイ上で分散ファイルシステムのようなデータの可用性担保や冗長化を行うためにGlusterFSやCephを挙げてきました。

しかし、実際に動作させて様子をみてみると、そもそもサーバスペックやインターフェースがあまり強力ではないラズベリーパイでは、あまり動作状況良好とは言い難いです。

今回はより軽量で動作するDRBDの構築を行い、NFSで共有するところまでを実施していきます。

DRBDとは

DRBDはネットワーク上のストレージの冗長化を目的とした分散ファイルシステムの一つです。 Cephと同様にブロック単位で処理を行うことができ、書き込み速度を期待することができます。

また、厳密には分散ファイルシステムではなく、RAID1と同様、ディスクのミラーリングを行うシステムになります。

DRBD単品では、プライマリのブロックデバイスに直にアクセスするセカンダリのブロックデバイスにプライマリのブロックデバイスを随時ミラーリングを行うという仕組みのみを提供しています。

DRBDだけではプライマリのノード上のディスクしか操作できません。逆に、プライマリのノードで全てのサービスを稼働させるタイプのサービスであれば、ストレージへのアクセスはハードウェア性能とほぼ一致ということになります。

このため、ノード数が増え大規模になるほど、分散処理能力が向上/高速になるCephとは逆で、小〜中規模および低スペックであればあるほど相対的に性能が高いという特徴を持ちます。

製品 処理単位 最小構成 アクセス方法 ミラーリング方法
GlusterFS ファイル 2ノード アクセス先のglusterdにファイルを問い合わせしディスク->ファイルにアクセス 各ノード間で変更を感知し双方向同期を行っている
Ceph ブロック 3ノード Ceph Monitorにファイルを問い合わせして複数のノードからオブジェクトの位置を取得->ディスクにアクセス ファイルをブロックで分割し、Monitorノード上で配置場所を管理(同期ではない)
DRBD ブロック 2ノード Primary指定されたノードのディスクのファイルシステムに直にアクセス Primaryが変更されると差分をSecondaryに一方向同期

Pacemakerと連携させる理由

PacemakerはAct-Sby形のHAクラスタを構築するのにうってつけのOSSです。DRBDは自分自身でプライマリノードになったりセカンダリに降格したりはしないため、Pacemakerにこの部分を担保してもらおうというのが狙いです。

DRBDの導入

環境

一度構築した環境なのでノード設定がめちゃくちゃな感じですが、実施していきます。

  • hostname: sandbox
    • Hard: RaspberryPi 4
    • OS: Ubuntu 20.04 LTS
    • IPaddr: 192.168.3.254
    • Disk: 2.5インチ 2TB
    • DNS: sandbox.local(avahi-daemon)
  • hostname: rasp2.nyan.local
    • Hard: RaspberryPi 4
    • OS: Ubuntu 20.04 LTS
    • IPaddr: 192.168.3.22
    • Disk: 2.5インチ 2TB
    • DNS: rasp2.nyan.local(bind9 at 192.168.3.250)

インストール

リポジトリを追加することでdrbd9を利用することができます。
(追加しなくてもdrbd-utilsは存在しますが、バージョン8系がインストールされてしまいます。)

add-apt-repository ppa:linbit/linbit-drbd9-stack
apt-get update
apt install -y drbd-utils
modprobe drbd

途中でpostfixの設定を聞かれるのでローカルを指定するか、DEBIAN_FRONTEND=noninteractiveで設定自体を回避します。

以下のような設定を作成します。

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

#include "drbd.d/global_common.conf";
#include "drbd.d/*.res";

global {
        usage-count yes;
        udev-always-use-vnr;
 }
resource r0 {
        protocol C;
        volume 0 {
                device /dev/drbd0;
                meta-disk internal;
        }
        net {
                cram-hmac-alg sha1;
                shared-secret "secret";
        }
        on sandbox {
                disk /dev/sda;
                address 192.168.3.254:7788;
        }
        on rasp2.nyan.local {
                disk /dev/sda;
                address 192.168.3.22:7788;
        }
}

ディスクについてはwipefsを行い、superblockが存在する場合は削除しておきます。

root@sandbox:~# df
...
/dev/sda       1952560720 13646572 1938914148   1% /mnt
root@sandbox:/# wipefs -a /dev/sda 
/dev/sda: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42

削除後、drbdadm create-md <resource name>を両方のクラスタで実行し、角ディスクを初期化します。

root@sandbox:/# drbdadm create-md r0
md_offset 2000398929920
al_offset 2000398897152
bm_offset 2000337846272

Found some data

 ==> This might destroy existing data! <==

Do you want to proceed?
[need to type 'yes' to confirm] yes

initializing activity log
initializing bitmap (59620 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.

設定が完了したら、drbdデーモンを両方のクラスタで開始します。

systemctl enable --now drbd.service

初めはプライマリディスクを指定し、ディスクの同期を行う必要があります。 いずれかのノードを指定し、強制的にレプリケーションを実施します。

drbdadm primary --force r0

上記を実施するとディスクの同期が開始します。
drbdadm statusで進捗の確認が可能です。

root@rasp2:~# watch drbdadm status r0
Every 2.0s: drbdadm status r0

r0 role:Primary
  disk:UpToDate
  sandbox role:Secondary
    replication:SyncSource peer-disk:Inconsistent done:0.29

完了すると、全てのディスクでステータスがUpToDateになります。

root@rasp2:~# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  sandbox role:Secondary
    peer-disk:UpToDate

自動プロモーション機能の確認

DRBD9では自動プロモーション機能が利用可能です。
両方のノードを再起動しステータスを確認すると、いずれのノードもセカンダリに降格します。

root@sandbox:~# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  rasp2.nyan.local role:Secondary
    peer-disk:UpToDate

この状態でもフォーマット可能みたいでした。お好みの形式でフォーマットを実施します。
ちなみにフォーマット後もプライマリ昇格はしません。

root@sandbox:~# mkfs -t xfs /dev/drbd0 
meta-data=/dev/drbd0             isize=512    agcount=4, agsize=122090933 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=488363732, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=238458, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
root@sandbox:~# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  rasp2.nyan.local role:Secondary
    peer-disk:UpToDate

マウントを実施すると、マウントしたホストがプライマリに昇格します。

root@sandbox:~# mount -t xfs /dev/drbd0 /mnt
root@sandbox:/# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  rasp2.nyan.local role:Secondary
    peer-disk:UpToDate

アンマウントすると両方セカンダリの状態に戻ります。

root@sandbox:/# umount /mnt
root@sandbox:/# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  rasp2.nyan.local role:Secondary
    peer-disk:UpToDate

DRBD9の検証

以下の動作を確かめます。

  • 正常時のSecondaryマウント操作
    • Primaryが存在する場合
    • Primaryが存在しない場合
  • 異常時のSecondaryマウント操作
    • drbd.serviceダウン時のマウント操作
    • ダウン後のSecondaryマウント操作
    • ダウン中の新プライマリへの書き込み
    • ダウンしたノードの復旧/復旧後のステータス
    • ネットワークダウン時の状態確認

正常時のSecondaryマウント操作

Primaryが存在する場合

mount(2) system call failed: Wrong medium type.のメッセージでマウントに失敗しました。

root@rasp2:~# mount -t xfs /dev/drbd0 /mnt
mount: /mnt: mount(2) system call failed: Wrong medium type.
root@rasp2:~# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  sandbox role:Primary
    peer-disk:UpToDate

Primaryが存在しない場合

Primaryが存在しない場合は通常通りにマウントすることが可能です。

root@rasp2:~# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  sandbox role:Secondary
    peer-disk:UpToDate

root@rasp2:~# mount -t xfs /dev/drbd0 /mnt
root@rasp2:~# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  sandbox role:Secondary
    peer-disk:UpToDate

異常時のSecondaryマウント操作

この後の検証のためにマウントポイントにファイルを設置しておきます。

root@rasp2:/# touch /mnt/mounted 
root@rasp2:/# ll /mnt
total 4
drwxr-xr-x  2 root root   21  5月  7 21:40 ./
drwxr-xr-x 23 root root 4096  5月  7 21:22 ../
-rw-r--r--  1 root root    0  5月  7 21:40 mounted
root@rasp2:/mnt# df | grep /mnt
/dev/drbd0     1952501096 13646156 1938854940   1% /mnt

drbd.serviceダウン後のSecondaryマウント操作

プライマリのノードのdrbdを停止します。

root@rasp2:~# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  sandbox role:Secondary
    peer-disk:UpToDate
root@rasp2:/# systemctl stop drbd.service 
root@rasp2:/# systemctl status drbd.service 
● drbd.service - DRBD -- please disable. Unless you are NOT using a cluster manager.
     Loaded: loaded (/lib/systemd/system/drbd.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Fri 2021-05-07 21:37:41 JST; 4s ago
    Process: 821896 ExecStart=/lib/drbd/drbd start (code=exited, status=0/SUCCESS)
    Process: 823618 ExecStop=/lib/drbd/drbd stop (code=exited, status=0/SUCCESS)
   Main PID: 821896 (code=exited, status=0/SUCCESS)

リソースが存在しないという状態になります。

root@rasp2:/# drbdadm status r0
# No currently configured DRBD found.
r0: No such resource
Command 'drbdsetup status r0' terminated with exit code 10

この状態でセカンダリがマウントを実施すると、ノードがPrimaryに昇格し、ファイルが共有されています。

root@sandbox:/# mount -t xfs /dev/drbd0 /mnt
root@sandbox:/# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  rasp2.nyan.local connection:Connecting

root@sandbox:/# ll /mnt
total 4
drwxr-xr-x  2 root root   21  5月  7 21:40 ./
drwxr-xr-x 21 root root 4096  5月  5 18:03 ../
-rw-r--r--  1 root root    0  5月  7 21:40 mounted

drbd.serviceダウン中の新プライマリへの書き込み

ダウン中のノードはマウントが解除されます。

root@rasp2:/# ll /mnt
total 8
drwxr-xr-x  2 root root 4096  2月  1 20:02 ./
drwxr-xr-x 23 root root 4096  5月  7 21:22 ../
root@rasp2:/# df | grep /mnt

この状態で先ほど昇格したプライマリにファイルを作成してみます。

root@sandbox:/# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  rasp2.nyan.local connection:Connecting

root@sandbox:/# mount -t xfs /dev/drbd0 /mnt
root@sandbox:/# touch /mnt/update
root@sandbox:/# ll /mnt
total 4
drwxr-xr-x  2 root root   35  5月  7 21:51 ./
drwxr-xr-x 21 root root 4096  5月  5 18:03 ../
-rw-r--r--  1 root root    0  5月  7 21:40 mounted
-rw-r--r--  1 root root    0  5月  7 21:51 update
root@sandbox:/# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  rasp2.nyan.local connection:Connecting

drbd.serviceダウンしたノードの復旧/復旧後のステータス

Primaryが変更された状態でサービスダウンしたノードを復旧します。

root@rasp2:/# systemctl is-active drbd.service 
inactive
root@rasp2:/# systemctl start drbd.service 
root@rasp2:/# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  sandbox role:Primary
    peer-disk:UpToDate

root@rasp2:/# systemctl is-active drbd.service 
active

復旧後はSecondaryのため、マウントポイントは解除されたままになります。

root@rasp2:/# ll /mnt
total 8
drwxr-xr-x  2 root root 4096  2月  1 20:02 ./
drwxr-xr-x 23 root root 4096  5月  7 21:22 ../
root@rasp2:/#  df | grep /mnt

プライマリを交換してみます。

root@sandbox:/# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  rasp2.nyan.local role:Secondary
    peer-disk:UpToDate

root@sandbox:/# umount /mnt
root@sandbox:/# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  rasp2.nyan.local role:Secondary
    peer-disk:UpToDate

ダウン中の変更も反映されていることがわかります。

root@rasp2:/# mount -t xfs /dev/drbd0 /mnt
root@rasp2:/# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  sandbox role:Secondary
    peer-disk:UpToDate

root@rasp2:/# ll /mnt
total 4
drwxr-xr-x  2 root root   35  5月  7 21:51 ./
drwxr-xr-x 23 root root 4096  5月  7 21:22 ../
-rw-r--r--  1 root root    0  5月  7 21:40 mounted
-rw-r--r--  1 root root    0  5月  7 21:51 update

ネットワークダウン時の状態確認

ネットワークをダウンさせてみます。

root@rasp2:/# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  sandbox role:Secondary
    peer-disk:UpToDate
root@rasp2:/# ip a | grep eth
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether dc:a6:32:fd:6a:b3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.22/24 brd 192.168.3.255 scope global eth0
root@rasp2:/# ip l set eth0 down
client_loop: send disconnect: Broken pipe

他ノードから確認すると、サービスダウン時と同様の状態になるようです。 プライマリに昇格させることで、引き続きディスクを利用することができます。

root@sandbox:/# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  rasp2.nyan.local connection:Connecting
root@sandbox:/# drbdadm status r0
r0 role:Primary
  disk:UpToDate
  rasp2.nyan.local connection:Connecting

DRBDのNFS対応

DRBDではAct-Sby構造をとるため、NFSとして共有する場合もACT側を常に参照している必要があります。

Pacemakerの導入

インストール方法

Pacemakerをインストールします。
指定しなくてもcorosyncなども関連パッケージとして自動でインストールされます。

apt install pcs

初めに初期登録されている情報を削除します。

pcs cluster destroy

haclusterユーザが追加されているのでパスワードを設定します。
クラスタとして登録する全てのノードで実施します。

USER_PASSWD=pacemaker
printf "$USER_PASSWD\n$USER_PASSWD\n" | passwd hacluster 2> /dev/null

クラスタの作成

クラスタを作成します。 以下は192.168.3.254192.168.3.22の二つのホストをDRBD-HAクラスタに追加する例です。

printf "$USER_PASSWD\n" | pcs host auth 192.168.3.254 192.168.3.22 -u hacluster
pcs cluster setup DRBD-HA 192.168.3.254 192.168.3.22 --start --enable

セットアップが完了すると、両方のノードから以下のようにステータスが確認できるようになります。

root@rasp2:~# pcs cluster status
Cluster Status:
 Cluster Summary:
   * Stack: corosync
   * Current DC: 192.168.3.22 (version 2.0.3-4b1f869f0f) - partition with quorum
   * Last updated: Fri May  7 23:23:32 2021
   * Last change:  Fri May  7 23:22:36 2021 by hacluster via crmd on 192.168.3.22
   * 2 nodes configured
   * 0 resource instances configured
 Node List:
   * Online: [ 192.168.3.22 192.168.3.254 ]

PCSD Status:
  192.168.3.254: Online
  192.168.3.22: Online
root@sandbox:/# pcs cluster status
Cluster Status:
 Cluster Summary:
   * Stack: corosync
   * Current DC: 192.168.3.22 (version 2.0.3-4b1f869f0f) - partition with quorum
   * Last updated: Fri May  7 23:23:43 2021
   * Last change:  Fri May  7 23:22:36 2021 by hacluster via crmd on 192.168.3.22
   * 2 nodes configured
   * 0 resource instances configured
 Node List:
   * Online: [ 192.168.3.22 192.168.3.254 ]

PCSD Status:
  192.168.3.22: Online
  192.168.3.254: Online

Pacemakerにリソースを追加

リソース追加は設定ファイルを作成して行い、この設定ファイルをクラスターに登録するようにします。

Stonithの無効化

今はノードが2台のため、STONITHを無効にしておきます(無限再起動防止)

pcs -f drbdcluster property set stonith-enabled=false

VirtualIPリソースの登録

ノードにVIPを付与するように設定します。本環境ではip=192.168.3.240 cidr_netmask=24 nic=eth0を指定します。

pcs -f drbdcluster resource create VirtualIP ocf:heartbeat:IPaddr2 \
    ip="192.168.3.240" cidr_netmask="24" nic="eth0" \
    op monitor interval="10s"

FileSystemリソースの登録

アクティブ側でdrbdをマウントする設定を作成します。device=/dev/drbd0 directory=/mnt fstype=xfsで設定します。

設定する前にdrbdのroleが全てSecondaryになっていることを確認してください

pcs -f drbdcluster resource create DRBD-mount ocf:heartbeat:Filesystem \
    device="/dev/drbd0" directory="/drbd" fstype="xfs" \
    op start timeout="60s" on-fail="restart" \
    op stop timeout="60s" \
    op monitor interval="10s" timeout="60s" on-fail="restart"

NFSサーバリソースの作成

デーモンを設定します。systemdリソースを使う方法とheatbeat:nfsserverを使う方法があります。

pcs -f drbdcluster resource create NFS-daemon systemd:nfs-server \
    op start timeout="20s" on-fail="restart" \
    op stop timeout="20s" \
    op monitor interval="10s" timeout="10s" on-fail="restart" start-delay="20s"

systemdでうまくいかない場合はheartbeatの方を試してみてください。

pcs -f drbdcluster resource create NFS-daemon ocf:heartbeat:nfsserver  \
    op start timeout="20s" \
    op stop  timeout="20s" \
    op monitor interval="10s" timeout="10s" on-fail="restart" start-delay="20s"

exportsの内容もプライマリノードで自動作成するようにします。

pcs -f drbdcluster resource create NFS-exportfs ocf:heartbeat:exportfs \
  clientspec="192.168.3.0/24" options="rw,async,no_root_squash,no_subtree_check" directory="/drbd" fsid="root"

リソースをグループに追加

最後にグループに追加を行うと、VIPとDRBD領域のマウントが連動するようになります。

pcs -f drbdcluster resource group add DRBD-group VirtualIP DRBD-mount NFS-daemon NFS-exportfs

設定の適応

作成された設定をcib-pushで読み込ませます。

root@sandbox:~# pcs cluster cib-push drbdcluster
CIB updated
root@sandbox:~# pcs status
Cluster name: DRBD-HA
Cluster Summary:
  * Stack: corosync
  * Current DC: 192.168.3.254 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Sat May  8 01:56:28 2021
  * Last change:  Sat May  8 01:56:15 2021 by hacluster via crmd on 192.168.3.254
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ 192.168.3.22 192.168.3.254 ]

Full List of Resources:
  * Resource Group: DRBD-group:
    * VirtualIP (ocf::heartbeat:IPaddr2):    Started 192.168.3.22
    * DRBD-mount    (ocf::heartbeat:Filesystem):     Started 192.168.3.22
    * NFS-daemon    (systemd:nfs-server):    Started 192.168.3.22
    * NFS-exportfs  (ocf::heartbeat:exportfs):   Started 192.168.3.22

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

DRBD動作確認

設定を全て終了後、NFSがちゃんとマウントできるかを確かめてみます。

root@rasp2:/# mount -t nfs 192.168.3.240:/drbd /mnt
root@rasp2:/# cd /mnt
root@rasp2:/mnt# ll
total 8
drwxr-xr-x  2 root root   32  5月  8 01:06 ./
drwxr-xr-x 24 root root 4096  5月  8 00:57 ../
-rw-r-----  1 root root   30  5月  8 01:06 .rmtab
-rw-r--r--  1 root root    0  5月  8 01:06 test

root@sandbox:/# mount -t nfs 192.168.3.240:/drbd /mnt
root@sandbox:/# cd mnt/
root@sandbox:/mnt# ll
total 8
drwxr-xr-x  2 root root   32  5月  8 01:06 ./
drwxr-xr-x 22 root root 4096  5月  8 00:57 ../
-rw-r-----  1 root root   30  5月  8 01:07 .rmtab
-rw-r--r--  1 root root    0  5月  8 01:06 test

いずれのノードも問題なくNFSマウントが実施でき、動作していることがわかります。

フェイルオーバーのテスト(Stanby)

ノードをスタンバイに設定し、フェイルオーバーも動作していることを確認します。

root@sandbox:~# pcs node standby 192.168.3.22
root@sandbox:~# pcs status
Cluster name: DRBD-HA
Cluster Summary:
  * Stack: corosync
  * Current DC: 192.168.3.254 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Sat May  8 02:01:01 2021
  * Last change:  Sat May  8 02:00:47 2021 by root via cibadmin on 192.168.3.254
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Node 192.168.3.22: standby
  * Online: [ 192.168.3.254 ]

Full List of Resources:
  * Resource Group: DRBD-group:
    * VirtualIP (ocf::heartbeat:IPaddr2):    Started 192.168.3.254
    * DRBD-mount    (ocf::heartbeat:Filesystem):     Started 192.168.3.254
    * NFS-daemon    (systemd:nfs-server):    Started 192.168.3.254
    * NFS-exportfs  (ocf::heartbeat:exportfs):   Started 192.168.3.254

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled
root@sandbox:~# pcs node unstandby 192.168.3.22

フェイルオーバーのテスト(Nodedown)

再起動のフェイルオーバーも試してみます。

root@sandbox:~# pcs status
Cluster name: DRBD-HA
Cluster Summary:
  * Stack: corosync
  * Current DC: 192.168.3.254 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Sat May  8 02:01:35 2021
  * Last change:  Sat May  8 02:01:32 2021 by root via cibadmin on 192.168.3.254
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ 192.168.3.22 192.168.3.254 ]

Full List of Resources:
  * Resource Group: DRBD-group:
    * VirtualIP (ocf::heartbeat:IPaddr2):    Started 192.168.3.254
    * DRBD-mount    (ocf::heartbeat:Filesystem):     Started 192.168.3.254
    * NFS-daemon    (systemd:nfs-server):    Started 192.168.3.254
    * NFS-exportfs  (ocf::heartbeat:exportfs):   Started 192.168.3.254

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled
root@sandbox:~# reboot
root@sandbox:~# Connection to sandbox.local closed by remote host.
Connection to sandbox.local closed.

再起動直後

root@rasp2:~# pcs status
Cluster name: DRBD-HA
Cluster Summary:
  * Stack: corosync
  * Current DC: 192.168.3.22 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Sat May  8 02:02:46 2021
  * Last change:  Sat May  8 02:01:32 2021 by root via cibadmin on 192.168.3.254
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ 192.168.3.22 ]
  * OFFLINE: [ 192.168.3.254 ]

Full List of Resources:
  * Resource Group: DRBD-group:
    * VirtualIP (ocf::heartbeat:IPaddr2):    Started 192.168.3.22
    * DRBD-mount    (ocf::heartbeat:Filesystem):     Started 192.168.3.22
    * NFS-daemon    (systemd:nfs-server):    Started 192.168.3.22
    * NFS-exportfs  (ocf::heartbeat:exportfs):   Started 192.168.3.22

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

時間経過後(Onlineにノードが復帰します。)

root@rasp2:~# pcs status
Cluster name: DRBD-HA
Cluster Summary:
  * Stack: corosync
  * Current DC: 192.168.3.22 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Sat May  8 02:04:56 2021
  * Last change:  Sat May  8 02:01:32 2021 by root via cibadmin on 192.168.3.254
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ 192.168.3.22 192.168.3.254 ]

Full List of Resources:
  * Resource Group: DRBD-group:
    * VirtualIP (ocf::heartbeat:IPaddr2):    Started 192.168.3.22
    * DRBD-mount    (ocf::heartbeat:Filesystem):     Started 192.168.3.22
    * NFS-daemon    (systemd:nfs-server):    Started 192.168.3.22
    * NFS-exportfs  (ocf::heartbeat:exportfs):   Started 192.168.3.22

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled
root@rasp2:~# 

終わりに

これでDRBDをNFSとして利用する準備が整いました。Dockerでマウントするなりk8sで永続ボリュームにするなりやり放題です。

ただ、NFSで共有してしまうと正直DRBDのメリットが少し薄れてしまうところがある、NFSの場合は結局インターフェースの通信速度にディスクアクセスが頭打ちになってしまいます。
そのため、実稼働ではプライマリのノードでのみサービスが稼働する仕組みなどを作る必要がありそうです。

RaspberryPiのような非力なデバイスではCephやGlusterFSのような分散ファイルシステムよりも速度や安定性に期待できそうです。

参考