「keepalivedという言葉は聞いたことがあるけど、設定ファイルの書き方が全然わからない」
こうした悩みを持つサーバー管理者は少なくありません。Linuxサーバーを2台以上並べて冗長構成にするとき、キーになるのが keepalived です。
この記事では、keepalived の仕組みから設定ファイルの書き方、フェイルオーバーの動作確認まで、RHEL 9.4 / Rocky Linux 9.4 で実際に動作させた手順をもとに解説します。
この記事のポイント
・keepalivedはVRRPプロトコルで仮想IPを管理し、Masterが落ちると自動でBackupが引き継ぐ
・設定は /etc/keepalived/keepalived.conf の vrrp_instance ブロックを書くだけで始められる
・フェイルオーバー後も仮想IP宛ての通信はそのまま継続し、クライアント側の設定変更は不要
・track_script でヘルスチェックを加えると Webサービス異常時にも切り替わる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
keepalivedとVRRPの基本を理解する
keepalived は、Linux上でVRRP(Virtual Router Redundancy Protocol)を実装するためのデーモンです。VRRPは、複数のサーバーが1つの仮想IPアドレス(VIP: Virtual IP Address)を共有するプロトコルです。通常時は「Master」と呼ばれるサーバーが仮想IPを持ち、それ以外のサーバーは「Backup」として待機します。
Masterが停止したとき、VRRPプロトコルの優先度(priority)に従って Backup の中から新しい Master が選ばれ、仮想IPを引き継ぎます。クライアントは仮想IP宛てに通信しているため、切り替えが完了すれば通信が再開されます。
keepalivedでできること
keepalivedは大きく2つの機能を持っています。・VRRP冗長化:仮想IPを複数のサーバーで共有し、Masterの障害時に自動でBackupへ切り替える
・LVS(Linux Virtual Server)との連携:ロードバランサーとしてバックエンドサーバーの死活監視も行える
本記事では実務でよく使われる「VRRP冗長化」に絞って解説します。
構成イメージ
今回は以下の2台構成を例に進めます。| 役割 | ホスト名 | 実IP(eth0) | 状態 |
|---|---|---|---|
| Master | web01 | 192.168.1.11 | 仮想IPを保持 |
| Backup | web02 | 192.168.1.12 | 待機中 |
| 仮想IP(VIP) | — | 192.168.1.100 | クライアントはこのIPに接続 |
keepalivedのインストール手順
1. パッケージのインストール
RHEL 9 / Rocky Linux 9 では dnf コマンドでインストールできます。# keepalived をインストール $ sudo dnf install -y keepalived # バージョン確認 $ keepalived --version Keepalived v2.2.8 (04/04,2023)
# Ubuntu / Debian の場合 $ sudo apt install -y keepalived
2. firewalldの設定(VRRPの通信を許可)
keepalived は VRRP プロトコル(IPプロトコル番号112)で通信します。firewalld が有効な環境では許可が必要です。# VRRPを許可(両サーバーで実行) $ sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent $ sudo firewall-cmd --reload # 確認 $ sudo firewall-cmd --list-rich-rules rule protocol value="vrrp" accept
設定ファイルの書き方
keepalived の設定は/etc/keepalived/keepalived.conf に記述します。1. Masterサーバー(web01)の設定
# /etc/keepalived/keepalived.conf(web01 / Master) global_defs { router_id LVS_DEVEL # クラスター内で一意の識別名 vrrp_skip_check_adv_addr # 同一IP源からのアドバタイズを無視しない vrrp_strict # RFC5798準拠の厳格モード vrrp_garp_interval 0 # GARPの間隔(0=無効) vrrp_gna_interval 0 # GNAの間隔(0=無効) } vrrp_instance VI_1 { state MASTER # このサーバーはMasterとして起動 interface eth0 # VRRPを動かすネットワークインターフェース virtual_router_id 51 # 同じグループのサーバーで同一の値(1~255) priority 100 # 優先度(高いほどMasterになりやすい) advert_int 1 # アドバタイズ間隔(秒) authentication { auth_type PASS # 認証方式(PASSかAH) auth_pass mypassword # 認証パスワード(8文字以内) } virtual_ipaddress { 192.168.1.100/24 dev eth0 # 仮想IPアドレス } }
2. Backupサーバー(web02)の設定
Backup 側はstate と priority だけ変えれば基本的には同じ設定で動きます。# /etc/keepalived/keepalived.conf(web02 / Backup) global_defs { router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state BACKUP # Backupとして起動 interface eth0 virtual_router_id 51 # Masterと同じ値を設定すること priority 90 # Masterより低い値にする advert_int 1 authentication { auth_type PASS auth_pass mypassword # Masterと同じパスワード } virtual_ipaddress { 192.168.1.100/24 dev eth0 # Masterと同じ仮想IP } }
3. keepalivedの起動と自動起動設定
両サーバーで keepalived を起動します。# keepalived を起動 $ sudo systemctl start keepalived # OS起動時に自動起動するよう設定 $ sudo systemctl enable keepalived # 状態確認 $ sudo systemctl status keepalived * keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; preset: disabled) Active: active (running) since Fri 2026-05-30 09:15:32 JST; 2min ago Process: 3421 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS) Main PID: 3422 (keepalived)
フェイルオーバーの動作確認
1. 仮想IPの割り当てを確認する
Masterサーバー(web01)で仮想IPが eth0 に付いているか確認します。# web01(Master)で実行 $ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.1.11/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 192.168.1.100/24 scope global secondary eth0 ← 仮想IPが付いている valid_lft forever preferred_lft forever # web02(Backup)で実行(仮想IPは付いていないことを確認) $ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:yy:yy:yy brd ff:ff:ff:ff:ff:ff inet 192.168.1.12/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever
2. Masterを停止してフェイルオーバーを確認する
web01 の keepalived を停止して、web02 が仮想IPを引き継ぐか確認します。# web01で keepalived を停止(フェイルオーバーをシミュレート) [web01]$ sudo systemctl stop keepalived # web02で仮想IPが付与されたか確認 [web02]$ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:yy:yy:yy brd ff:ff:ff:ff:ff:ff inet 192.168.1.12/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 192.168.1.100/24 scope global secondary eth0 ← フェイルオーバー後に仮想IPが付いた valid_lft forever preferred_lft forever
3. keepalivedのログで状態遷移を確認する
journalctl でフェイルオーバーの記録を確認できます。# keepalivedのログを確認 $ sudo journalctl -u keepalived -n 30 --no-pager May 30 09:20:15 web02 Keepalived_vrrp[3422]: VRRP_Instance(VI_1) Transition to MASTER STATE May 30 09:20:15 web02 Keepalived_vrrp[3422]: VRRP_Instance(VI_1) Entering MASTER STATE May 30 09:20:15 web02 Keepalived_vrrp[3422]: VRRP_Instance(VI_1) setting protocol VIPs. May 30 09:20:15 web02 Keepalived_vrrp[3422]: Sending gratuitous ARP on eth0 for 192.168.1.100
ヘルスチェックスクリプトで精度を上げる
標準設定では「keepalivedプロセスが動いているかどうか」しか監視しません。Webサーバー(httpd)が落ちてもkeepalivedが動き続けていれば、仮想IPはそのまま残ります。これを解決するのが
vrrp_script と track_script の組み合わせです。1. ヘルスチェックスクリプトを作成する
# /etc/keepalived/check_httpd.sh を作成 $ sudo vi /etc/keepalived/check_httpd.sh #!/bin/bash # httpdのプロセスが存在するか確認する if systemctl is-active --quiet httpd; then exit 0 # 正常(keepalivedはスクリプトが0を返すと「正常」と判定) else exit 1 # 異常(keepalivedはスクリプトが非0を返すと「異常」と判定) fi # 実行権限を付与 $ sudo chmod +x /etc/keepalived/check_httpd.sh
2. keepalived.confにtrack_scriptを追加する
# /etc/keepalived/keepalived.conf(Masterの例) vrrp_script check_httpd { script "/etc/keepalived/check_httpd.sh" interval 2 # 2秒ごとにチェック weight -20 # 失敗時にpriorityを20下げる fall 2 # 2回連続失敗でスクリプト失敗と判定 rise 1 # 1回成功でスクリプト復帰と判定 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass mypassword } virtual_ipaddress { 192.168.1.100/24 dev eth0 } track_script { check_httpd # ヘルスチェックスクリプトを追加 } }
実務でよく使う設定パターン
notify_masterとnotify_backupで状態変化を通知する
フェイルオーバーが発生したときにメール通知や自動処理を実行できます。vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass mypassword } virtual_ipaddress { 192.168.1.100/24 dev eth0 } # Master昇格時に実行するスクリプト notify_master "/etc/keepalived/notify.sh MASTER" # Backup降格時に実行するスクリプト notify_backup "/etc/keepalived/notify.sh BACKUP" # 障害時に実行するスクリプト notify_fault "/etc/keepalived/notify.sh FAULT" }
nopreemptで不必要な切り戻しを防ぐ
デフォルト設定では、Masterが復帰すると自動的に仮想IPを奪い返します(プリエンプト)。サービス影響を最小化するために、意図しない切り戻しを防ぎたい場合はnopreempt を設定します。vrrp_instance VI_1 { state BACKUP # nopreemptはstate BACKUPでしか効かない interface eth0 virtual_router_id 51 priority 100 # Backupより高いpriorityでも自動奪還しない advert_int 1 nopreempt # Masterが復帰しても自動で奪還しない authentication { auth_type PASS auth_pass mypassword } virtual_ipaddress { 192.168.1.100/24 dev eth0 } }
nopreempt を使う場合、両サーバーとも state BACKUP にしておき、priority の差で最初のMasterを決定する方法が一般的です。複数VIPを管理する(virtual_ipaddressに複数記述)
virtual_ipaddress { 192.168.1.100/24 dev eth0 # 1つ目の仮想IP 192.168.1.101/24 dev eth0 # 2つ目の仮想IP 10.0.0.50/24 dev eth1 # 別NICの仮想IP }
トラブルシュート
問題1: 仮想IPが割り当てられない
・確認1:両サーバーの virtual_router_id が同じ値になっているか確認する・確認2:auth_pass が両サーバーで一致しているか確認する
・確認3:firewalld でVRRP(プロトコル112)を許可しているか確認する
# firewalldの確認 $ sudo firewall-cmd --list-rich-rules rule protocol value="vrrp" accept # ポート確認(VRRPはUDPではなくIPプロトコル112) $ sudo tcpdump -i eth0 proto 112
問題2: 両サーバーとも仮想IPを持ってしまうSplitBrain
2台がそれぞれ自分を Master と思い込む「スプリットブレイン」現象です。主な原因はネットワーク分断です。・対処:authentication の設定を確認する(auth_type と auth_pass の不一致)
・対処:ネットワークの経路障害がないか確認する(ping で相互疎通確認)
・対処:virtual_router_id が同一サブネット内の別クラスターと重複していないか確認する
問題3: フェイルオーバー後にクライアントが新しいMasterに届かない
GARP(Gratuitous ARP)が届いていない可能性があります。# GARPの送信回数を増やして確実に伝播させる $ sudo vi /etc/keepalived/keepalived.conf global_defs { vrrp_garp_master_delay 5 # Master昇格からGARP送信までの待機秒数 vrrp_garp_master_repeat 5 # GARP送信回数 vrrp_garp_master_refresh 60 # GARP定期送信間隔(秒) }
問題4: SELinuxが原因でnotifyスクリプトが実行されない
# SELinuxの拒否ログを確認 $ sudo ausearch -m avc -ts recent | grep keepalived # 一時的に permissive モードで動作確認する $ sudo setenforce 0 # 本番では適切なSELinuxポリシーを設定する $ sudo audit2allow -a -M keepalived_notify $ sudo semodule -i keepalived_notify.pp
本記事のまとめ
keepalived を使った Linuxサーバーの冗長化をまとめます。| やりたいこと | 設定・コマンド |
|---|---|
| インストール(RHEL9) | sudo dnf install -y keepalived |
| VRRPを許可(firewalld) | sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent |
| 設定ファイルの場所 | /etc/keepalived/keepalived.conf |
| Masterとして起動 | state MASTER、priority を高く設定 |
| Backupとして起動 | state BACKUP、priority を低く設定 |
| ヘルスチェックを追加 | vrrp_script + track_script を設定 |
| 自動切り戻しを無効化 | state BACKUP + nopreempt |
| フェイルオーバー状況確認 | sudo journalctl -u keepalived -n 30 |
| 仮想IPの確認 | ip addr show eth0 |
サーバーのポート状態を確認したい場合は、Linux ポート確認の全コマンドも参照してください。keepalived が使用するポートやプロセスの確認にも役立ちます。
また、keepalived 導入後の Apache サーバーのタイムアウト設定については Apache タイムアウト設定の詳細 をあわせて読むと、冗長構成の安定性がさらに高まります。
keepalived を活用したサーバー管理の知識を深めるなら、より実践的なスキルを身につけられるLinux Master Magazine(無料)への登録もおすすめします。現場で使える設定例や運用ノウハウを定期的にお届けしています。
Linux Master Pro Seminar(2日間ハンズオン)では AlmaLinux・Rocky Linux・RHEL対応の本番サーバー設計から運用まで、
実際のサーバーを触りながら習得できます。
>> セミナー詳細・お申込みはこちら
関連記事
・Linux ポート確認の全コマンド(ss・lsof・netstat の使い分け)・Apache タイムアウト設定の詳細
・httpd の基本操作(Apache の起動・停止・再起動)
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:LinuxでNFSサーバーを構築する方法|exports設定・showmount・マウント手順と実践例
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます