Keepalivedの概要とアーキテクチャ
高可用性(HA)インフラストラクチャにおいて、単一障害点(SPOF)の排除は最重要課題の一つです。Keepalivedは、VRRP(Virtual Router Redundancy Protocol)をベースとした軽量かつ高性能なソリューションとして、サーバークラスターの監視と自動フェイルオーバー機能を提供します。VRRPプロトコルの動作メカニズム
VRRPは、複数のルーター(サーバー)を仮想的なグループとして統合し、単一の仮想IPアドレス(VIP)を共有するプロトコルです。動作フロー:
- 仮想IPの定義:クライアントは物理サーバーのIPではなく、仮想IP(VIP)に対して接続を行います
- 役割の割り当て:1台のMASTERと1台以上のBACKUPで構成されます
- ヘルスチェック:MASTERはマルチキャスト(224.0.0.18)またはユニキャストでVRRP広告パケットを定期送信します
- 自動切替:BACKUPが広告パケットを受信できなくなると、優先度に基づいた選挙を行い、新しいMASTERがVIPを引き継ぎます
Keepalivedの内部構造
| コンポーネント | 機能概要 |
|---|---|
| core | メインプロセスの制御、設定ファイルのパース、全体のライフサイクル管理 |
| check | ヘルスチェック機能。TCP/HTTP/SSL等のプロトコルでバックエンドサーバーを監視 |
| vrrp | VRRPスタックの実装。状態遷移、広告パケットの送受信、VIP管理 |
インストール方法
パッケージマネージャーを使用する方法
# RHEL/CentOS系
dnf install keepalived -y
# サービス管理
systemctl enable --now keepalived
systemctl status keepalived
ソースコードからのビルド(推奨)
# 依存パッケージの導入
dnf install -y gcc openssl-devel libnl3-devel \
libnfnetlink-devel net-snmp-devel curl make
# ソース取得とビルド
cd /usr/local/src
KEEPALIVED_VER=2.3.1
curl -LO https://keepalived.org/software/keepalived-${KEEPALIVED_VER}.tar.gz
tar xf keepalived-${KEEPALIVED_VER}.tar.gz
cd keepalived-${KEEPALIVED_VER}
./configure --prefix=/opt/keepalived
make -j$(nproc) && make install
# systemdサービス登録
cp keepalived/keepalived.service /etc/systemd/system/
systemctl daemon-reload
アクティブ・スタンバイ構成の実装
構成例:
- プライマリサーバー:172.16.50.10
- セカンダリサーバー:172.16.50.20
- 仮想IP(VIP):172.16.50.200
- ネットワークインターフェース:ens192
プライマリサーバーの設定
設定ファイル:/etc/keepalived/keepalived.conf
global_defs {
router_id HA_PRIMARY
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_master_delay 10
}
vrrp_instance VRRP_GROUP_A {
state MASTER
interface ens192
virtual_router_id 88
priority 200
advert_int 2
# ユニキャスト通信(一部環境でのマルチキャスト問題を回避)
unicast_src_ip 172.16.50.10
unicast_peer {
172.16.50.20
}
authentication {
auth_type PASS
auth_pass HaSecret2024
}
virtual_ipaddress {
172.16.50.200/24 label ens192:vip
}
notify_master "/usr/local/bin/notify_master.sh"
notify_backup "/usr/local/bin/notify_backup.sh"
}
セカンダリサーバーの設定
global_defs {
router_id HA_SECONDARY
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_master_delay 10
}
vrrp_instance VRRP_GROUP_A {
state BACKUP
interface ens192
virtual_router_id 88
priority 150
advert_int 2
unicast_src_ip 172.16.50.20
unicast_peer {
172.16.50.10
}
authentication {
auth_type PASS
auth_pass HaSecret2024
}
virtual_ipaddress {
172.16.50.200/24 label ens192:vip
}
}
動作確認とフェイルオーバーテスト
# VIPの状態確認(プライマリサーバーで実行)
ip addr show ens192 | grep 172.16.50.200
# フェイルオーバーのテスト
# プライマリ側でKeepalivedを停止
systemctl stop keepalived
# セカンダリ側でVIPが付与されたか確認
ip addr show ens192
主要設定パラメータの解説
| パラメータ | 説明 | 推奨値 |
|---|---|---|
| state | 初期状態。実際の役割は優先度で決定 | MASTER/BACKUP |
| virtual_router_id | VRRPグループ識別子(0-255) | 全ノードで統一 |
| priority | 優先度(1-254)。高い値がMASTERに選出 | MASTER: 200, BACKUP: 150 |
| advert_int | 広告パケット送信間隔(秒) | 1-2秒 |
| authentication | ノード間認証 | PASS(簡易)またはAH(暗号化) |
ノンプリエンプトモードの活用
デフォルトでは、優先度の高いサーバーが復旧すると自動的にMASTERに復帰します(プリエンプト)。しかし、サービスの安定性を優先する場合、この挙動を無効化できます。vrrp_instance VRRP_GROUP_A {
state BACKUP
priority 150
nopreempt # ノンプリエンプトを有効化
# ... その他の設定
}
ノンプリエンプトのメリット:
- 復旧時の不必要な切替を回避
- スプリットブレイン発生時の影響を最小化
- メンテナンス時の計画的な切替と復帰が容易
ノンプリエンプトモードを使用する場合、全ノードのstateをBACKUPに設定し、priorityで初期MASTERを決定する設計パターンが推奨されます。
LVSとの連携によるロードバランサー高可用化
KeepalivedはLVS(Linux Virtual Server)と統合することで、ロードバランサー自体の冗長化とバックエンドサーバーのヘルスチェックを同時に実現できます。virtual_server 172.16.50.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 172.16.50.101 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.16.50.102 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
この構成により、ロードバランサー層のHA化とリアルサーバーのヘルスチェックを一元的に管理できます。