KeepalivedとVRRPのプロトコル仕様
Keepalivedは、Linuxベースのインフラ環境において単一障害点(SPOF)を排除するために設計されたオープンソースのハイアベイラビリティソリューションです。その制御機構の中核を担うのがVRRP(Virtual Router Redundancy Protocol)であり、物理的なネットワーク機器に依存せず、論理的なゲートウェイ冗長化を実現します。
VRRPのアーキテクチャと動作メカニズム
一般的なネットワーク構成では、クライアント端末はデフォルトルーティングのために固定IPアドレスを参照しています。この方式は運用が簡素ですが、ゲートウェイ機器のダウン時に対応不可能な弱点を抱えています。VRRPはこの課題を解決するため、複数の物理ノードをグループ化し、「仮想ルーター」として統合ManagedなIP(VIP)を提供します。
- VRRP Router: VRRPデーモンプロセスを実行している実際のサーバーノード
- Virtual Router: VRID(0〜255)で識別される論理単位。複数の物理ノードがプール化され、外部からは単一のMAC/IPアドレスを持つ機器として認識されます。
VRRP通信は専用マルチキャストアドレス224.0.0.18を用いて行われます。Master格のノードのみが所定間隔でAdvertisementパケットを送信し、Backup格はその受信状態を監視します。優先度パラメータに基づく選挙アルゴリズムにより、障害発生時に制御権限が高速かつ自動的に移譲されます。クライアント側はVIPを固定参照しているため、内部的なロール切り替えを意識する必要がありません。
検証環境の準備と基本インストール
実務レベルでの導入では、少なくとも2台のエッジサーバーに負荷分散機能とWebサーバースack Stackを構築し、対で運用する構成が標準的です。
主要パッケージの展開手順は以下の通りです:
sudo yum install -y keepalived && sudo systemctl enable --now keepalived.service
Keepalived設定ファイルのカスタマイズ
設定は/etc/keepalived/keepalived.confにて一元管理されます。グローバル領域とVRRPインスタンス領域に大別され、以下は現代的なテンプレート例です。
global_defs {
notification_email {
infra-ops@example.com
alerting@example.com
}
notification_email_from ha-monitor@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 10
router_id LB_POOL_01
}
# バックエンドプロキシの死活監視定義
vrrp_script check_lb_health {
script "/usr/local/bin/monitor_lb_proc.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance CLUSTER_ETH0 {
interface ens192
state BACKUP
virtual_router_id 150
priority 115
advert_int 1
authentication {
auth_type AH
auth_pass SecureClusterKey24
}
track_script {
check_lb_health
}
virtual_ipaddress {
10.20.30.100/24 dev ens192
10.20.30.101/24 dev ens192
}
}
プロセス死活監視シェルスクリプトの実装
VRRPはLayer3/Layer4レベルの検知にとどまるため、上位アプリケーションの異常対応には独自スクリプトとの連携が不可欠です。
#!/usr/bin/env bash
# 保存先: /usr/local/bin/monitor_lb_proc.sh
# プロセス存在確認を行い、ダウン時にKeepalivedを降格させる
TARGET_PROCESS="nginx"
STATUS=$?
if ! pgrep -f "$TARGET_PROCESS" >/dev/null 2>&1; then
logger -t "KEEPALIVED_CHECK" "CRITICAL: $TARGET_PROCESS has terminated."
systemctl stop keepalived.service
exit 1
fi
exit $STATUS
作成後は実行権限を付与し、冗長構成の各ノード間でファイル同期を行ってください。
VRRPフェイルオーバーと非先占モード(nopreempt)
デフォルト動作では、優先度が高いノードが再起動すると即時にVIPの保持権限を返そうとします。これによりMASTER → BACKUP → MASTERという不要な遷移が発生し、セッション切れやキャッシュ失効を引き起こす原因となります。
これを防ぐにはnopreemptディレクティブを適用します。重要なのは、このオプションがstate BACKUPとして定義されたノードに対してのみ機能する点です。したがって、両ノードの初期ステートをBACKUPに統一し、起動順序と優先度スコアだけで自動的にマスターが選出される設計を採用する必要があります。
vrrp_instance CLUSTER_ETH0 {
...
state BACKUP
priority 115
nopreempt
...
}
この構成により、一度VIPを獲得したノードが復旧後も他能動ノードを妨害せず、安定した稼働状態を維持できます。
スプリットブレイン(Split-Brain)現象と緩和策
クラスタ運用において致命的な事象の一つがスプリットブレインです。通信経路の分断により両ノードが互いの活動状況を認識できなくなり、同時にVIPを割り当てたり共有記憶域への並列書き込みを試みたりする状態を指します。
主な誘因
- ハートビート用NICのハードウェア不良、ケーブル断線、中間スイッチの故障
- ファイアウォールルールの変更によるVRRPマルチキャストトラフィックの遮断
- システムクロズの齟齬、DNS名前解決の競合、設定ファイルのバージョン不整合
技術的対策アプローチ
- 通信経路の物理的分離: 専用セグメントまたはクロスケーブルを用い、単一障害点を排除した冗長リンクを構成します。
- Stonith/Fencing機構の組み込み: IPMIや専用マネージャー経由で故障疑いノードを強制的に電源断する安全装置を設けます。
- 精密監視とインシデント自動転送: 閾値監視だけでなく、ログ分析やメトリクス可視化を組み合わせ、早期発見体制を構築します。
- 排他制御ロジックの活用: クラスタリングミドルウェア側のロック機能を利用し、片系ノードのみが共有データ領域へアクセス可能な状態を強制します。
厳密な設計原則の遵守と定期テスト実施により、ビジネスレベルの許容停止時間(RTO)を大幅に短縮することが可能です。