KeepalivedとHAProxyによるレイヤ4 / 7冗長化クラスタ構築――VRRPスプリットブレイン防止と高信頼ヘルスチェック実務
要旨:Webサービス、DNSキャッシュ基盤、APIゲートウェイなど、クリティカルな公開フロントエンドにおいて単一障害点(SPOF)を排除するためには、HAProxyによる負荷分散とKeepalived(VRRP)によるVIP(仮想IP)フェイルオーバーの組み合わせが定番かつ最も堅牢な構成である。本稿では、商用運用で頻発するVRRPスプリットブレイン障害の防止策、HAProxyプロセス監視スクリプトの実装、非同期ヘルスチェックのチューニング手順をまとめる。
1. レイヤ4/7高可用性クラスタのシステム構成図
2台のLinuxロードバランサー(Primary / Backup)を用意し、VIP(Virtual IP: 仮想IPアドレス)をKeepalivedのVRRPプロトコルによって共有する。クライアントからのインバウンド通信は常にVIP宛に届き、Primaryノード上のHAProxyがバックエンドのWeb/アプリサーバ群へトラフィックをインテリジェントに負荷分散する。Primaryノードのハードウェア障害やHAProxyプロセスのダウン時には、サブ秒単位でBackupノードへVIPが自動移行する。
2. Keepalived設定とHAProxyヘルスチェックスクリプト
単なるpingによる死活監視ではなく、HAProxyプロセスが正常に応答しているかを監視するチェックスクリプト(track_script)を構成する。HAProxyが異常停止した場合は即座に優先度(priority)を引き下げ、健全なBackupノードへVIPをフェイルオーバーさせる。
# /etc/keepalived/keepalived.conf (Primaryノード)
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight -20
fall 2
rise 2
}
vrrp_instance VI_STATIC {
state MASTER
interface bond0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass Secr3tP@ssw0rd!
}
virtual_ipaddress {
192.0.2.10/24 dev bond0
}
track_script {
chk_haproxy
}
}
3. スプリットブレイン(Dual Master)防止の運用鉄則
ネットワーク瞬断やスイッチ間トランクの障害により、PrimaryとBackupの両者が互いのVRRPアドバタイズメントを見失い、双方で同一VIPが重複起動してしまう「スプリットブレイン障害」は、パケット消失やセッション切断を招く最悪の事態である。これを確実に防ぐため、以下の3重防壁を導入する。
- ユニキャストVRRP通信の採用:マルチキャストパケットのドロップを回避するため、
unicast_peerを明示指定してノード間を1対1で直結する。 - デュアルネットワーク監視:管理LAN(帯外ネットワーク)とサービスLANの2経路で死活状態を相互検証する。
- カーネルパニック時の即時リブート:
kernel.panic = 10をsysctlに設定し、ハングアップしたノードが速やかに自滅・再起動するよう安全弁を設ける。