Keepalivedによる高可用性クラスタの構築:VRRP実装から実践的なフェイルオーバー設定まで

Keepalivedの概要とアーキテクチャ

高可用性(HA)インフラストラクチャにおいて、単一障害点(SPOF)の排除は最重要課題の一つです。Keepalivedは、VRRP(Virtual Router Redundancy Protocol)をベースとした軽量かつ高性能なソリューションとして、サーバークラスターの監視と自動フェイルオーバー機能を提供します。

VRRPプロトコルの動作メカニズム

VRRPは、複数のルーター(サーバー)を仮想的なグループとして統合し、単一の仮想IPアドレス(VIP)を共有するプロトコルです。

動作フロー:

  1. 仮想IPの定義:クライアントは物理サーバーのIPではなく、仮想IP(VIP)に対して接続を行います
  2. 役割の割り当て:1台のMASTERと1台以上のBACKUPで構成されます
  3. ヘルスチェック:MASTERはマルチキャスト(224.0.0.18)またはユニキャストでVRRP広告パケットを定期送信します
  4. 自動切替:BACKUPが広告パケットを受信できなくなると、優先度に基づいた選挙を行い、新しいMASTERがVIPを引き継ぎます

Keepalivedの内部構造

コンポーネント機能概要
coreメインプロセスの制御、設定ファイルのパース、全体のライフサイクル管理
checkヘルスチェック機能。TCP/HTTP/SSL等のプロトコルでバックエンドサーバーを監視
vrrpVRRPスタックの実装。状態遷移、広告パケットの送受信、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_idVRRPグループ識別子(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          # ノンプリエンプトを有効化
    
    # ... その他の設定
}

ノンプリエンプトのメリット:

  • 復旧時の不必要な切替を回避
  • スプリットブレイン発生時の影響を最小化
  • メンテナンス時の計画的な切替と復帰が容易

ノンプリエンプトモードを使用する場合、全ノードのstateBACKUPに設定し、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化とリアルサーバーのヘルスチェックを一元的に管理できます。

タグ: Keepalived VRRP 高可用性 linux フェイルオーバー

6月1日 17:09 投稿