
1. はじめに:ステートフルサービスのHA化と技術的背景
ITインフラにおいて、データベース(MySQL等)やファイルサーバー(NFS等)といったステートフルなサービスの可用性を確保することは重要です。これらのサービスはメモリ上だけでなくディスク上のデータ整合性が求められるため、ステートレスなサービスと比較して冗長化の難易度が高くなります。
従来、Linux環境でのHA(High Availability)構成にはPacemakerとCorosyncの組み合わせが標準的に用いられてきましたが、設定の複雑さが課題でした。本記事では、これらに代わる新しい選択肢として「DRBD Reactor」を用いた、シンプルで堅牢なHA構成を解説します。
過去の記事で3ノード構成での「DRBD Reactor」の設定例を紹介しておりますが、LINBIT社が正式に2ノード構成をサポートしたため、今回はその設定例をご紹介します。
2. DRBD Reactorの採用理由
DRBD Reactorは、DRBDの開発元であるLINBIT社が提供する次世代のクラスタマネージャです。Linux標準の「systemd」と密接に連携し、systemdのユニット依存関係をそのまま活用するため、管理のハードルが低いのが特徴です。軽量でありながら、DRBDのステータス変化に応じたサービスの自動制御を確実に行います。
3. 構成の検討:2ノード構成における課題
クラスタ設計において最も回避すべき事態は、データ破壊を招く「スプリットブレイン」です。通常、3ノード構成にして「クォーラム(過半数)」で合意形成を図るのが理想ですが、コストやリソースの制約から2ノードで構成したいケースも多くあります。
しかし、2ノードではクォーラムが成立しないため、DRBDは安全装置として「相手の状態が不明な間は昇格を拒否する」という挙動をとります。これを解決し、自動フェイルオーバーを成立させるのが「フェンシング」です。
4. 解決策:STONITHの設定
本構成では、仮想化基盤のvSphere REST APIを活用した「STONITH(Shoot The Other Node In The Head)」を実装します。ネットワーク分断時に生存ノードがvCenterへ命令を送り、対象ノードの仮想マシンを強制制御(再起動)することで、データの不整合を物理的に防ぎ、安全にサービスを継続させます。
検証環境がvShpere9で動いているので、設定例としてfence-agents-vmware-restを使います。オンプレミス環境ならばIPMIやiLOなどを使ったSTONITH設定、AWSならばこちらの記事で紹介している設定など、環境にあった設定を選んでいただければ動作します。
5. 検証環境の構成
- OS: AlmaLinux 9.x
- DRBD: DRBD 9.x
- HA管理: DRBD Reactor 1.x
- フェンスエージェント: fence-agents-vmware-rest
- ハイパーバイザー: VMware vSphere (vCenter API)
6. 構築および設定手順
6.1 必要なパッケージのインストール
DRBD本体、Reactor、リソースエージェントに加え、vCenter APIを操作するためのフェンスエージェントをインストールします。
# DRBD、LVM、リソースエージェント、およびvSphere用フェンスエージェントのインストール
[root@node1 ~]# dnf -y install drbd kmod-drbd lvm2 resource-agents fence-agents-vmware-rest
# DRBDの自動起動は無効化(Reactorが制御するため)
[root@node1 ~]# systemctl disable --now drbd
# NFS関連パッケージのインストールと起動
[root@node1 ~]# dnf -y install nfs-utils rpcbind
[root@node1 ~]# systemctl enable --now rpcbind
6.2 DRBDリソースの設定 (nfs.res)
フェンシングを有効にするための重要な設定です。fencing resource-and-stonith を指定し、通信断時にハンドラを呼び出すよう設定します。
ファイルパス: /etc/drbd.d/nfs.res
resource nfs {
net {
# 通信断時にI/Oを停止してフェンシングを要求する(必須)
fencing resource-and-stonith;
}
handlers {
# フェンシング実行時に呼び出すスクリプトを指定
fence-peer "/usr/lib/drbd/vmware_fence.sh";
}
options {
# DRBD Reactor(Promoter)を正常動作させるための必須設定
auto-promote no;
on-suspended-primary-outdated force-secondary;
}
volume 0 {
device /dev/drbd0;
disk /dev/almalinux/nfsinfo;
meta-disk internal;
}
volume 1 {
device /dev/drbd1;
disk /dev/almalinux/drbddata;
meta-disk internal;
}
on node1 {
address 192.168.153.11:7777;
node-id 0;
}
on node2 {
address 192.168.153.12:7777;
node-id 1;
}
}
6.3 初期化とファイルシステム作成
[root@node1 ~]# drbdadm create-md nfs
[root@node1 ~]# drbdadm up nfs
[root@node1 ~]# drbdadm primary --force nfs
# ファイルシステムの作成と管理用ディレクトリの準備
[root@node1 ~]# mkfs.ext4 /dev/drbd0
[root@node1 ~]# mount /dev/drbd0 /nfsdata/internal/nfs
[root@node1 ~]# mkfs.xfs /dev/drbd1
[root@node1 ~]# mount /dev/drbd1 /nfsdata/exports/nfs/data
[root@node1 ~]# mkdir -p /nfsdata/internal/nfs/nfsinfo /nfsdata/internal/nfs/tickle
[root@node1 ~]# drbdadm secondary nfs
6.4 DRBD Reactor設定 (nfs.toml)
DRBD Reactorの設定ファイルを作成します。両ノード同じ設定になるので、node1で作成後、scpコマンドでnode2にコピーして下さい。
設定中のIPaddr2 、Filesystem 、nfsserver 、exportfs 、portblock はすべてPacemakerのリソースエージェントです。DRBD ReactorはPacemakerのリソースエージェントを利用できます。
ファイルパス: /etc/drbd-reactor.d/nfs.toml
[[promoter]]
id = "nfs"
[promoter.resources.nfs]
stop-services-on-exit = true
start = [
"ocf:heartbeat:portblock portblock action=block ip=10.125.153.10 portno=2049 protocol=tcp",
"""ocf:heartbeat:Filesystem fs_cluster_private device=/dev/drbd0 \
directory=/nfsdata/internal/nfs fstype=ext4 run_fsck=no""",
"""ocf:heartbeat:Filesystem fs_1 device=/dev/drbd1 \
directory=/nfsdata/exports/nfs/data fstype=xfs run_fsck=no""",
"""ocf:heartbeat:nfsserver nfsserver nfs_ip=10.125.153.10 \
nfs_server_scope=10.125.153.10 nfs_shared_infodir=/nfsdata/internal/nfs/nfsinfo""",
"""ocf:heartbeat:exportfs export_drbd_nfs_vol clientspec=10.125.153.10/255.254.0.0 \
directory=/nfsdata/exports/nfs/data fsid=1d0b09e0-1f65-5ae4-98c4-8661f84a5325 \
options='rw,all_squash,anonuid=0,anongid=0'""",
"ocf:heartbeat:IPaddr2 virtual_ip cidr_netmask=24 ip=10.125.153.10",
"""ocf:heartbeat:portblock portunblock action=unblock ip=10.125.153.10 \
portno=2049 protocol=tcp tickle_dir=/nfsdata/internal/nfs/tickle""",
]

6.5 フェンシングスクリプト (vmware_fence.sh)
fence_vmware_rest を利用して相手ノードを制御します。相手のノート停止に成功した時に終了コード 7 を返すことで、DRBDにフェンシング完了を伝えます。
ファイルパス: /usr/lib/drbd/vmware_fence.sh
#!/bin/bash
if [ "$HOSTNAME" = "node1" ]; then
TARGET_VM="al96-node2"
elif [ "$HOSTNAME" = "node2" ]; then
TARGET_VM="al96-node1"
fi
/usr/sbin/fence_vmware_rest \
--ip=10.124.128.90 \
--username='administrator@vsphere.local' \
--password='<PASSWORD>' \
--ssl-insecure \
--action=reboot \
--plug="$TARGET_VM"
# 成功時は終了コード 7 を返す(DRBDの仕様)
[ $? -eq 0 ] && exit 7 || exit 1
このスクリプトは、DRBDのハンドラー(handlers)からフェンシングの設定により呼び出されます。
7. 動作検証とフェイルオーバーテスト
設定完了後、以下のテストを実施し、期待通りの挙動を確認しました。
- テスト1:手動スイッチオーバー
drbd-reactorctl evict nfsを実行。リソースが安全にアンマウントされ、待機系ノードへ数秒で移動することを確認。 - テスト2:異常系(ノードダウン)とフェンシング 稼働系を強制電源断。待機系がvCenter経由でフェンシング(再起動)を発動し、自動的に昇格。終了コード「7」によりDRBDはフェンシング完了を理解して正常に動作。
- テスト3:クライアントからのI/O継続テスト 2GBのファイル書き込み中に4回の系切り替えを実施。切り替え完了後に書き込みが自動再開し、最終的なファイル整合性がバイト単位で一致することを確認。
8. まとめ
DRBD Reactorは、systemdを活用することでHA管理をシンプルにします。2ノード構成であっても、正しいフェンシングの実装(fencing resource-and-stonith の指定と終了コード 7 の返却)により、信頼性の高いHAシステムを構築可能です。
付録:PacemakerとDRBD Reactorの比較
Pacemakerの概念に慣れているエンジニア向けの対応表です。
| 項目 | Pacemaker (pcs) | DRBD Reactor |
| 管理デーモン | pacemaker.service | drbd-reactor.service |
| 設定方式 | CIB (XML) / 同期型 | .tomlファイル / 分散型 |
| サービス管理 | OCF等の直接制御 | systemdユニットの自動生成 |
| ステータス確認 | pcs status | drbd-reactorctl status |
| リソース移動 | pcs resource move | drbd-reactorctl evict |