keepalivedコマンドでLinuxサーバーを冗長化する方法|VRRP設定・仮想IP・フェイルオーバーの実践例

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > keepalivedコマンドでLinuxサーバーを冗長化する方法|VRRP設定・仮想IP・フェイルオーバーの実践例
TITLE: keepalivedでLinuxサーバーを冗長化する方法|VRRP設定・仮想IP・フェイルオーバーの実践例 BASENAME: keepalived-vrrp-linux CATEGORY: Linuxサーバー構築(Rocky Linux/RHEL9) TAGS: keepalived,VRRP,冗長化,高可用性,フェイルオーバー,仮想IP,Linux,RHEL9,Rocky Linux 「Webサーバーをもう1台追加したのに、片方が落ちたら結局サービス停止になってしまった」
「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サービス異常時にも切り替わる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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 系の場合は apt で同様にインストールできます。

# 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 側は statepriority だけ変えれば基本的には同じ設定で動きます。

# /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

切り替わりは通常1~3秒程度で完了します。クライアントから仮想IP(192.168.1.100)宛てに ping を打ち続けると、数パケットのロスで回復するのを確認できます。

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

「Transition to MASTER STATE」と「Entering MASTER STATE」が記録されていれば、正常にフェイルオーバーが動作しています。

ヘルスチェックスクリプトで精度を上げる

標準設定では「keepalivedプロセスが動いているかどうか」しか監視しません。Webサーバー(httpd)が落ちてもkeepalivedが動き続けていれば、仮想IPはそのまま残ります。

これを解決するのが vrrp_scripttrack_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 # ヘルスチェックスクリプトを追加 } }

上記設定では、httpd が停止すると priority が 100 - 20 = 80 になります。Backupの priority が 90 なので自動的に Backup が Master に昇格します。

実務でよく使う設定パターン

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
keepalived はシンプルな設定ファイルだけで高可用性を実現できる、実務に直結したツールです。まずは仮想環境で2台を立ててフェイルオーバーを体験してみてください。動作原理を実感すると、本番環境への適用がスムーズになります。

サーバーのポート状態を確認したい場合は、Linux ポート確認の全コマンドも参照してください。keepalived が使用するポートやプロセスの確認にも役立ちます。

また、keepalived 導入後の Apache サーバーのタイムアウト設定については Apache タイムアウト設定の詳細 をあわせて読むと、冗長構成の安定性がさらに高まります。

keepalived を活用したサーバー管理の知識を深めるなら、より実践的なスキルを身につけられるLinux Master Magazine(無料)への登録もおすすめします。現場で使える設定例や運用ノウハウを定期的にお届けしています。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
Linux Master Pro Seminar(2日間ハンズオン)では AlmaLinux・Rocky Linux・RHEL対応の本番サーバー設計から運用まで、
実際のサーバーを触りながら習得できます。

>> セミナー詳細・お申込みはこちら

関連記事

Linux ポート確認の全コマンド(ss・lsof・netstat の使い分け)
Apache タイムアウト設定の詳細
httpd の基本操作(Apache の起動・停止・再起動)

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。