DRBD Reactorによる2ノードHAクラスタの構築

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.servicedrbd-reactor.service
設定方式CIB (XML) / 同期型.tomlファイル / 分散型
サービス管理OCF等の直接制御systemdユニットの自動生成
ステータス確認pcs statusdrbd-reactorctl status
リソース移動pcs resource movedrbd-reactorctl evict