Keepalived / Virtual Router Redundancy Protocol

VRRP(Virtual Router Redundancy Protocol)は、サーバやルータなどを冗長化するプロトコルで、複数台のサーバに同じIPアドレス(仮想IP:VIP)を割り当てて、一つのサーバとして扱うことができます。
KeeppalivedのVRRP機能を利用して、Webサーバがダウンしたときに、バックアップサーバに切り替えるテストをしてみました。

参考)
「Ubuntu 20.04 で Keepalived を同一筐体で用いて冗長構成/負荷分散する」
https://weseek.co.jp/tech/2989/

参考にさせていただいたサイトでは、マスターもバックアップも同じ設定ファイルで書かれており、状態によって切り替える工夫がされています。

環境) Ubuntu 22.04 x 2 / VirtualBox

インストール

sudo apt-get install keepalived

設定ファイル編集

sudo vi /etc/keepalived/keepalived.conf

sudo vi /etc/keepalived/virtualserver-backup.conf

#空ファイル

sudo vi /etc/keepalived/virtualserver-master.conf

sudo vi /etc/keepalived/notify_master.sh

sudo vi /etc/keepalived/notify_backup.sh

スクリプト実行ユーザ追加

sudo useradd keepalived_script

sudo visudo

….下記追記
keepalived_script ALL=(ALL:ALL) NOPASSWD: ALL

パーミッションの変更

cd /etc/keepalived
sudo chmod u+x notify_backup.sh notify_master.sh
sudo chown keepalived_script:keepalived_script notify_backup.sh notify_master.sh

IPフォワード設定

sudo vi /etc/sysctl.d/98-keepalived.conf

設定更新

sudo sysctl -p

loにvip割り当て

sudo vi /etc/netplan/99_lo_config.yaml

設定更新

sudo netplan apply

確認

ip a show lo

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.1.11/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

再起動

sudo service keepalived status
sudo service keepalived restart

Webアプリ
index.htmlにサーバを識別できる名前を入れておく。(場所は任意。サーバ起動まで同じ場所)

生存確認用にファイル作成

touch health

サーバ起動

python3 -m http.server 8000

確認

sudo journalctl -u keepalived

設定うまくいっていれば、ログが表示されます。

WebClientは、WSLのコンソールからCurlコマンドで確認しました。
最初は、リアルサーバのIPにアクセス、次にバーチャルIPにアクセスし、ラウンドロビンでアクセスできるていることを確認後、n0cのサーバをダウンさせました。
一回は失敗しましたが、その後はn0dの方に切り替わっています。

実行結果

実際に動かしてみると、理解が深まります。
まずは簡単なWebサーバでしたが、この環境を他のサーバでも使おうと思います。