◆ DRBDパッケージをインストールします。
[root@pcmk-1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@pcmk-1 ~]# dnf install -y https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
[root@pcmk-1 ~]# dnf install -y kmod-drbd9x drbd9x-utils
[root@pcmk-1 ~]# dnf install -y policycoreutils-python-utils
DRBDはデフォルトのSELinuxセキュリティポリシーでは動作できません。ここでは単純にDRBDプロセスをSELinuxから除外します。
[root@pcmk-1 ~]# semanage permissive -a drbd_t
別ノード(pcmk-2)もここまでのインストール及び設定を行います。同じなので内容は省略します。
DRBDはポート7789を使用するように設定しますので、各ホストからはそのポートを許可します。
[root@pcmk-1 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address="10.0.1.102" port port="7789" protocol="tcp" accept'
success
[root@pcmk-1 ~]# firewall-cmd --reload
success
[root@pcmk-2 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address="10.0.1.101" port port="7789" protocol="tcp" accept'
success
[root@pcmk-2 ~]# firewall-cmd --reload
success
◆DRBD用のディスクボリュームを割り当てる
DRBDは各ノードに独自のブロックデバイスが必要です。これは物理ディスクパーティションや論理ボリューム次のようになります。
公式ドキュメントによれば、512MiBの論理ボリュームを使用しますが、これは単一のHTMLファイルとGFS2メタデータには十分すぎるほどだそうです。
[root@pcmk-1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
almalinux_basic 2 2 0 wz--n- 19.99g 1020.00m
[root@pcmk-1 ~]# lvcreate --name drbd-demo --size 512M almalinux_basic
Logical volume "drbd-demo" created.
[root@pcmk-1 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
drbd-demo almalinux_basic -wi-a----- 512.00m
root almalinux_basic -wi-ao---- <17.00g
swap almalinux_basic -wi-ao---- 2.00g
*余談ですが本来、VGの「almalinux_basic」の部分はインストール時のhostnameが正しいのですが、今回は雛型マシン「almalinux_basic」をVirtualBOXのコピー機能で複製した仮想マシンの為 、VGがそのまま残っています。本来のVGは「pcmk-1」となり、次に行うノード、pcmk-2のVGは「pcmk-2」となりますが、以下の例も同じ雛型マシンからコピーした為、VGが同じ「almalinux_basic」になっています。VGの名前を変更するとマシンが起動しなくなったため、止むを得ずそのまま使っていますが、VGが別ノードと重なっても正常に動作確認出来た為、VGはそのまま使用します。
同じサイズで2つ目のノードを繰り返します
[root@pcmk-1 ~]# ssh pcmk-2 -- lvcreate --name drbd-demo --size 512M almalinux_basic
Logical volume "drbd-demo" created.
念の為に2つ目のノードで確認
[root@pcmk-2 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
drbd-demo almalinux_basic -wi-a----- 512.00m
root almalinux_basic -wi-ao---- <17.00g
swap almalinux_basic -wi-ao---- 2.00g
◆DRBDの設定
DRBD構成を構築するための一連のコマンドは存在しないため、単純に 両方のノードでこのサンプル構成を実行します。
[root@pcmk-1 ~]#cat <<END >/etc/drbd.d/wwwdata.res
resource "wwwdata" {
device minor 1;
meta-disk internal;
net {
protocol C;
allow-two-primaries yes;
fencing resource-and-stonith;
verify-alg sha1;
}
handlers {
fence-peer "/usr/lib/drbd/crm-fence-peer.9.sh";
unfence-peer "/usr/lib/drbd/crm-unfence-peer.9.sh";
}
on "pcmk-1" {
disk "/dev/almalinux_basic/drbd-demo";
node-id 0;
}
on "pcmk-2" {
disk "/dev/almalinux_basic/drbd-demo";
node-id 1;
}
connection {
host "pcmk-1" address 10.0.1.101:7789;
host "pcmk-2" address 10.0.1.102:7789;
}
}
END
別ノード(pcmk-2)も上記と同じファイルを作成します。
◆DRBDの初期化
設定が整ったことで、DRBDを稼働させることができます。
これらのコマンドはDRBDリソースのローカルメタデータを作成します。 DRBDカーネルモジュールが読み込まれていることを確認し、DRBDリソースを呼び出します。 1つのノードで実行します。
[root@pcmk-1 ~]# drbdadm create-md wwwdata
initializing activity log
initializing bitmap (16 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
[root@pcmk-1 ~]# modprobe drbd
[root@pcmk-1 ~]# drbdadm up wwwdata
--== Thank you for participating in the global usage survey ==--
The server's response is:
you are the 3769th user to install this version
このノードでのDRBDの状況を確認します。
[root@pcmk-1 ~]# drbdadm status
wwwdata role:Secondary
disk:Inconsistent open:no
pcmk-2 connection:Connecting
別ノード(pcmk-2)も同様の操作を行います。
[root@pcmk-2 ~]# drbdadm create-md wwwdata
--== Thank you for participating in the global usage survey ==--
The server's response is:
[root@pcmk-2 ~]# modprobe drbd
[root@pcmk-2 ~]# drbdadm up wwwdata
結果が表示されない?
再びpcmk-1でDRBDの状況を確認すると、2つのDRBDノードが正しく通信していることが確認出来ます。
[root@pcmk-1 ~]# drbdadm status
wwwdata role:Secondary
disk:Inconsistent open:no
pcmk-2 role:Secondary
peer-disk:Inconsistent
データの整合性を保つために、DRBDにどのノードを指定すべきかを伝える必要があります。
pcmk-1からみてwwwdata role:Secondaryに成っている為、このノードをPrimaryにするには以下のコマンドを実行します。
[root@pcmk-1 ~]# drbdadm primary --force wwwdata
暫くして状況を確認すると以下の様に表示されます。
[root@pcmk-1 ~]# drbdadm status
wwwdata role:Primary
disk:UpToDate open:no
pcmk-2 role:Secondary
peer-disk:UpToDate
別ノードから確認すると以下の様になります。
[root@pcmk-2 ~]# drbdadm status
wwwdata role:Secondary
disk:UpToDate open:no
pcmk-1 role:Primary
peer-disk:UpToDate
◆DRBDディスクの入力
プライマリの役割を持つノード(pcmk-1)上のDRBDデバイス上でファイルシステムを作成します。
[root@pcmk-1 ~]# mkfs.xfs /dev/drbd1
meta-data=/dev/drbd1 isize=512 agcount=4, agsize=32765 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=131059, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@pcmk-1 ~]# mount /dev/drbd1 /mnt
念の為に正常にマウントが行われたのか確認します。
[root@pcmk-1 ~]# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 854M 33M 822M 4% /dev/shm
tmpfs 342M 5.4M 337M 2% /run
/dev/mapper/almalinux_basic-root 17G 5.1G 12G 30% /
/dev/sda1 960M 389M 572M 41% /boot
tmpfs 171M 52K 171M 1% /run/user/42
tmpfs 171M 36K 171M 1% /run/user/0
/dev/drbd1 448M 29M 419M 7% /mnt
新規作成したファイルシステムのマウントを確認出来たらウェブドキュメントを埋め込みます・
[root@pcmk-1 ~]# cat <<-END >/mnt/index.html
<html>
<body>My Test Site - DRBD</body>
</html>
END
[root@pcmk-1 ~]# cat /mnt/index.html
<html>
<body>My Test Site - DRBD</body>
</html>
ウェブドキュメントのルートと同じSELinuxポリシーを適用後、アンマウントします。
[root@pcmk-1 ~]# chcon -R --reference=/var/www/html /mnt
[root@pcmk-1 ~]# umount /dev/drbd1
◆DRBDデバイス用クラスタの設定
便利な機能の一つは、複数の変更をキューに入れられることです。ファイルに変更をまとめてコミットします。これを行うには、まずCIBの現在の生のXML設定でファイルに入力します。
[root@pcmk-1 ~]# pcs cluster cib drbd_cfg
DRBDデバイス用のクラスタリソースを作成し、両方のノードで同時にリソースを実行できるように追加のクローンリソースを作成します。
[root@pcmk-1 ~]# pcs -f drbd_cfg resource create WebData ocf:linbit:drbd \
drbd_resource=wwwdata op monitor interval=29s role=Promoted \
monitor interval=31s role=Unpromoted
[root@pcmk-1 ~]# pcs -f drbd_cfg resource promotable WebData \
promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 \
notify=true
Deprecation Warning: configuring meta attributes without specifying the 'meta' keyword is deprecated and will be removed in a future release
[root@pcmk-1 ~]# pcs resource status
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1
* WebSite (ocf:heartbeat:apache): Started pcmk-1
[root@pcmk-1 ~]# pcs resource config
Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)
Attributes: ClusterIP-instance_attributes
cidr_netmask=24
ip=10.0.1.103
Operations:
monitor: ClusterIP-monitor-interval-30s
interval=30s
start: ClusterIP-start-interval-0s
interval=0s timeout=20s
stop: ClusterIP-stop-interval-0s
interval=0s timeout=20s
Resource: WebSite (class=ocf provider=heartbeat type=apache)
Attributes: WebSite-instance_attributes
configfile=/etc/httpd/conf/httpd.conf
statusurl=http://localhost/server-status
Operations:
monitor: WebSite-monitor-interval-1min
interval=1min
start: WebSite-start-interval-0s
interval=0s timeout=40s
stop: WebSite-stop-interval-0s
interval=0s timeout=60s
すべての変更に納得したら、コミットできます。ファイルをライブCIBにプッシュすることで、すべて一度に処理します。
[root@pcmk-1 ~]# pcs cluster cib-push drbd_cfg --config
CIB updated
なお、以下のように上記のアップデートを一度で行うこともできます。
# pcs resource create WebData ocf:linbit:drbd \
drbd_resource=wwwdata op monitor interval=29s role=Promoted \
monitor interval=31s role=Unpromoted \
promotable promoted-max=1 promoted-node-max=1 clone-max=2 \
clone-node-max=1 notify=true
クラスターが新しい構成で何をしたのか見てみます。
[root@pcmk-1 ~]# pcs resource status
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1
* WebSite (ocf:heartbeat:apache): Started pcmk-1
* Clone Set: WebData-clone [WebData] (promotable):
* Promoted: [ pcmk-1 ]
* Unpromoted: [ pcmk-2 ]
DRBDのデバイスがPromoted: [ pcmk-1 ]がプライマリ、Unpromoted: [ pcmk-2 ]がセカンダリとして動作している事が分かります。
[root@pcmk-1 ~]# pcs resource config
Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)
Attributes: ClusterIP-instance_attributes
cidr_netmask=24
ip=10.0.1.103
Operations:
monitor: ClusterIP-monitor-interval-30s
interval=30s
start: ClusterIP-start-interval-0s
interval=0s timeout=20s
stop: ClusterIP-stop-interval-0s
interval=0s timeout=20s
Resource: WebSite (class=ocf provider=heartbeat type=apache)
Attributes: WebSite-instance_attributes
configfile=/etc/httpd/conf/httpd.conf
statusurl=http://localhost/server-status
Operations:
monitor: WebSite-monitor-interval-1min
interval=1min
start: WebSite-start-interval-0s
interval=0s timeout=40s
stop: WebSite-stop-interval-0s
interval=0s timeout=60s
Clone: WebData-clone
Meta Attributes: WebData-clone-meta_attributes
clone-max=2
clone-node-max=1
notify=true
promotable=true
promoted-max=1
promoted-node-max=1
Resource: WebData (class=ocf provider=linbit type=drbd)
Attributes: WebData-instance_attributes
drbd_resource=wwwdata
Operations:
demote: WebData-demote-interval-0s
interval=0s timeout=90
monitor: WebData-monitor-interval-29s
interval=29s role=Promoted
monitor: WebData-monitor-interval-31s
interval=31s role=Unpromoted
notify: WebData-notify-interval-0s
interval=0s timeout=90
promote: WebData-promote-interval-0s
interval=0s timeout=90
reload: WebData-reload-interval-0s
interval=0s timeout=30
start: WebData-start-interval-0s
interval=0s timeout=240
stop: WebData-stop-interval-0s
interval=0s timeout=100
◆ファイルシステム用クラスタの設定
動作するDRBDデバイスができたので、そのファイルシステムをマウントする必要があります。
[root@pcmk-1 ~]# pcs cluster cib fs_cfg
[root@pcmk-1 ~]# pcs -f fs_cfg resource create WebFS Filesystem \
device="/dev/drbd1" directory="/var/www/html" fstype="xfs"
Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')
[root@pcmk-1 ~]# pcs -f fs_cfg constraint colocation add \
WebFS with Promoted WebData-clone
[root@pcmk-1 ~]# pcs -f fs_cfg constraint order \
promote WebData-clone then start WebFS
Adding WebData-clone WebFS (kind: Mandatory) (Options: first-action=promote then-action=start)
また、Apacheも同じ環境で動かす必要があるとクラスターに伝える必要があります。Apacheが開始する前に、マシンがファイルシステムとして機能しなければなりません。
[root@pcmk-1 ~]# pcs -f fs_cfg constraint colocation add WebSite with WebFS
[root@pcmk-1 ~]# pcs -f fs_cfg constraint order WebFS then WebSite
Adding WebFS WebSite (kind: Mandatory) (Options: first-action=start then-action=start)
更新された設定を確認します。
[root@pcmk-1 ~]# pcs -f fs_cfg constraint
Location Constraints:
resource 'WebSite' prefers node 'pcmk-2' with score 50
Colocation Constraints:
resource 'WebSite' with resource 'ClusterIP'
score=INFINITY
Started resource 'WebFS' with Promoted resource 'WebData-clone'
score=INFINITY
resource 'WebSite' with resource 'WebFS'
score=INFINITY
Order Constraints:
start resource 'ClusterIP' then start resource 'WebSite'
promote resource 'WebData-clone' then start resource 'WebFS'
start resource 'WebFS' then start resource 'WebSite'
新しい設定を確認した後、アップロードして、クラスターがそれを実行します。
[root@pcmk-1 ~]# pcs cluster cib-push fs_cfg --config
CIB updated
[root@pcmk-1 ~]# pcs resource status
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1
* WebSite (ocf:heartbeat:apache): Started pcmk-1
* Clone Set: WebData-clone [WebData] (promotable):
* Promoted: [ pcmk-1 ]
* Unpromoted: [ pcmk-2 ]
* WebFS (ocf:heartbeat:Filesystem): Started pcmk-1
[root@pcmk-1 ~]# pcs resource config
Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)
Attributes: ClusterIP-instance_attributes
cidr_netmask=24
ip=10.0.1.103
Operations:
monitor: ClusterIP-monitor-interval-30s
interval=30s
start: ClusterIP-start-interval-0s
interval=0s timeout=20s
stop: ClusterIP-stop-interval-0s
interval=0s timeout=20s
Resource: WebSite (class=ocf provider=heartbeat type=apache)
Attributes: WebSite-instance_attributes
configfile=/etc/httpd/conf/httpd.conf
statusurl=http://localhost/server-status
Operations:
monitor: WebSite-monitor-interval-1min
interval=1min
start: WebSite-start-interval-0s
interval=0s timeout=40s
stop: WebSite-stop-interval-0s
interval=0s timeout=60s
Resource: WebFS (class=ocf provider=heartbeat type=Filesystem)
Attributes: WebFS-instance_attributes
device=/dev/drbd1
directory=/var/www/html
fstype=xfs
Operations:
monitor: WebFS-monitor-interval-20s
interval=20s timeout=40s
start: WebFS-start-interval-0s
interval=0s timeout=60s
stop: WebFS-stop-interval-0s
interval=0s timeout=60s
Clone: WebData-clone
Meta Attributes: WebData-clone-meta_attributes
clone-max=2
clone-node-max=1
notify=true
promotable=true
promoted-max=1
promoted-node-max=1
Resource: WebData (class=ocf provider=linbit type=drbd)
Attributes: WebData-instance_attributes
drbd_resource=wwwdata
Operations:
demote: WebData-demote-interval-0s
interval=0s timeout=90
monitor: WebData-monitor-interval-29s
interval=29s role=Promoted
monitor: WebData-monitor-interval-31s
interval=31s role=Unpromoted
notify: WebData-notify-interval-0s
interval=0s timeout=90
promote: WebData-promote-interval-0s
interval=0s timeout=90
reload: WebData-reload-interval-0s
interval=0s timeout=30
start: WebData-start-interval-0s
interval=0s timeout=240
stop: WebData-stop-interval-0s
interval=0s timeout=100
◆クラスターフェイルオーバーのテスト
クラスターのサービスをstopしてテストしていましたが別のサービスも稼働している為、ノード故障を安全にシミュレートするにはstandbyを実行します。
[root@pcmk-1 ~]# pcs node standby pcmk-1
[root@pcmk-1 ~]# pcs status
Cluster name: mycluster
WARNINGS:
warning: Support for the Master role is deprecated and will be removed in a future release. Use Promoted instead.
Warnings found during check: config not valid
Cluster Summary:
* Stack: corosync (Pacemaker is running)
* Current DC: pcmk-2 (version 2.1.10-1.1.el9_7-5693eaeee) - partition with quorum
* Last updated: Sat Apr 4 18:53:17 2026 on pcmk-1
* Last change: Sat Apr 4 18:53:13 2026 by root via root on pcmk-2
* 2 nodes configured
* 5 resource instances configured
Node List:
* Node pcmk-1: standby
* Online: [ pcmk-2 ]
Full List of Resources:
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-2
* WebSite (ocf:heartbeat:apache): Started pcmk-2
* Clone Set: WebData-clone [WebData] (promotable):
* Promoted: [ pcmk-2 ]
* Stopped: [ pcmk-1 ]
* WebFS (ocf:heartbeat:Filesystem): Started pcmk-2
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
リソースが全てpcmk-2に移動したことを確認出来たので、ノードのスタンバイ状態を戻します。
[root@pcmk-1 ~]# pcs node unstandby pcmk-1
[root@pcmk-1 ~]# pcs status
Cluster name: mycluster
Cluster Summary:
* Stack: corosync (Pacemaker is running)
* Current DC: pcmk-2 (version 2.1.10-1.1.el9_7-5693eaeee) - partition with quorum
* Last updated: Sat Apr 4 18:56:06 2026 on pcmk-1
* Last change: Sat Apr 4 18:56:04 2026 by root via root on pcmk-2
* 2 nodes configured
* 5 resource instances configured
Node List:
* Online: [ pcmk-1 pcmk-2 ]
Full List of Resources:
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-2
* WebSite (ocf:heartbeat:apache): Started pcmk-2
* Clone Set: WebData-clone [WebData] (promotable):
* Promoted: [ pcmk-2 ]
* Unpromoted: [ pcmk-1 ]
* WebFS (ocf:heartbeat:Filesystem): Started pcmk-2
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
クラスターは以前行ったリソースの固定設定のため、そのままになります。
pcmk-1にリソースを戻すにはpcmk-2も同様に一旦スタンバイ状態にします。
[root@pcmk-1 ~]# pcs node standby pcmk-2
暫く経ってから確認すると以下の状態になります。
[root@pcmk-1 ~]# pcs status
Cluster name: mycluster
WARNINGS:
warning: Support for the Master role is deprecated and will be removed in a future release. Use Promoted instead.
Warnings found during check: config not valid
Cluster Summary:
* Stack: corosync (Pacemaker is running)
* Current DC: pcmk-2 (version 2.1.10-1.1.el9_7-5693eaeee) - partition with quorum
* Last updated: Sat Apr 4 19:00:07 2026 on pcmk-1
* Last change: Sat Apr 4 18:59:42 2026 by root via root on pcmk-1
* 2 nodes configured
* 5 resource instances configured
Node List:
* Node pcmk-2: standby
* Online: [ pcmk-1 ]
Full List of Resources:
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1
* WebSite (ocf:heartbeat:apache): Started pcmk-1
* Clone Set: WebData-clone [WebData] (promotable):
* Promoted: [ pcmk-1 ]
* Stopped: [ pcmk-2 ]
* WebFS (ocf:heartbeat:Filesystem): Started pcmk-1
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
pcmk-1にリソースが移動したことを確認後、pcmk-2のスタンバイを解除します。
[root@pcmk-1 ~]# pcs node unstandby pcmk-2
暫く経った後、正常稼働を確認します。
[root@pcmk-1 ~]# pcs status
Cluster name: mycluster
Cluster Summary:
* Stack: corosync (Pacemaker is running)
* Current DC: pcmk-2 (version 2.1.10-1.1.el9_7-5693eaeee) - partition with quorum
* Last updated: Sat Apr 4 19:03:18 2026 on pcmk-1
* Last change: Sat Apr 4 19:02:17 2026 by root via root on pcmk-1
* 2 nodes configured
* 5 resource instances configured
Node List:
* Online: [ pcmk-1 pcmk-2 ]
Full List of Resources:
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1
* WebSite (ocf:heartbeat:apache): Started pcmk-1
* Clone Set: WebData-clone [WebData] (promotable):
* Promoted: [ pcmk-1 ]
* Unpromoted: [ pcmk-2 ]
* WebFS (ocf:heartbeat:Filesystem): Started pcmk-1
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled