keepalived を使って Linux プロキシサーバーのフェイルオーバーを設定する方法
Linux で高可用性を設定するのは、必ずしも簡単ではありません。特に、プロキシ サーバーをスムーズに稼働させたい場合はなおさらです。1 台のサーバーがクラッシュしたり、ネットワークに問題が発生すると、IP アドレスが正しく引き継がれないため、クライアントでエラーが発生することがあります。ここで keepalived が威力を発揮します。keepalived は、1 台のサーバーに障害が発生した場合にもう 1 台のサーバーがシームレスに引き継ぎ、ダウンタイムによる一時的な中断を回避します。ポイントは、仮想 IP がサーバー間で切り替わるように VRRP を正しく構成することです。どの IP が実 IP でどの仮想 IP かを明確に理解しておく必要があります。これらの IP を間違えると、あらゆる種類のネットワーク障害につながる可能性があります。ここでは、keepalived を使用して Linux フェイルオーバー クラスターを設定するために機能した手順を、特に Squid プロキシ サーバーに合わせて調整した手順で説明します。これまでのところ CentOS 7 で動作しており、RHEL ベースのディストリビューションにもほぼ当てはまります。
Linuxでkeepalivedを使用してフェールオーバークラスターを構築する方法
VRRPの原理と知っておくべきこと
VRRPを初めて使う方のために、簡単に説明します。VIP(仮想IP)とは、サーバー間で移動するフローティングIPです。この概念は誰もが知っていますが、VRRPではこれが動的に処理されるため、プライマリサーバー(マスター)がダウンすると、バックアップサーバーが引き継ぎます。VRRPは仮想ルータID(VRID)を使用するため、複数のグループが衝突することはありません。また、優先順位によってどのサーバーがマスターになるかが決定されます。ハートビートパケット(224.0.0.18へのマルチキャスト)は、他のサーバーに「私は生きている」という情報を伝えます。バックアップサーバーがマスターからの情報を受信できない場合は、バックアップサーバーが代わりにマスターサーバーになります。念のため、スイッチがマルチキャストトラフィックに対応していることを確認してください。対応していないと、面倒なことになりかねません。また、実IPを仮想IPとして使用しないでください。サーバーに障害が発生してIPが移動した場合、IPが復旧した際にVRRPが解決するまでネットワークから切断される可能性があります。設定によっては奇妙に感じるかもしれませんが、クリーンな状態を保つために、実IPをVIPとして再利用するのは避けてください。
ステップ1: keepalivedと基本設定のインストール
- yum (またはyum/dnf ) を使用してインストールします。
# yum install keepalived
vrrp_script chk_squid_service { script "/usr/sbin/squid -k check" interval 3 } vrrp_instance proxy_ip1 { state MASTER interface eth0 virtual_router_id 1 priority 255 virtual_ipaddress { 192.168.2.101/24 dev eth0 label eth0:1 } track_interface { eth1 } track_script { chk_squid_service } } vrrp_instance proxy_ip2 { state BACKUP interface eth0 virtual_router_id 2 priority 100 virtual_ipaddress { 192.168.2.102/24 dev eth0 label eth0:2 } track_interface { eth1 } track_script { chk_squid_service } }
ステップ2: ネットワークとファイアウォールの設定
keepalived を起動する前に、iptables のルールを確認してください。VRRP トラフィック(マルチキャスト 224.0.0.18/8)を許可する必要があります。例えば、以下のようになります。
# iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT # iptables -A INPUT -p vrrp -i eth0 -j ACCEPT
一部の設定では、デフォルトのファイアウォールがこれをブロックするため、必ず許可してください。起動時にkeepalivedが起動するように設定することも忘れないでください。
# systemctl enable keepalived # systemctl start keepalived
実行したら、インターフェースを確認します。
# ip a show eth0
両方のサーバーが起動して実行されると、インターフェースに割り当てられた仮想 IP が表示されます。
ステップ3: Keepalivedがサービスとインターフェースの障害に応答することを確認する
これが肝心な点です。Squidなどのアプリとインターフェースを監視します。チェックを追加する方法は次のとおりです。
vrrp_script chk_squid_service { script "/usr/sbin/squid -k check" interval 3 } vrrp_instance proxy_ip1 {...track_script { chk_squid_service } } vrrp_instance proxy_ip2 {...track_script { chk_squid_service } }
このスクリプトは3秒ごとに実行されます。Squidがダウンした場合、keepalivedはサーバーに障害が発生したと判定し、VIPを正常なノードに移動します。アプリのクラッシュやネットワークインターフェースのオフライン化などの問題を検出するのに非常に便利です。
ステップ4: フェイルオーバーのテスト – 意図的に中断する
設定が完了したら、テストを行います。proxy-serv01(ifconfig eth0 downまたはip link set eth0 down)のeth0をオフにし、proxy-serv02がVIPを占有するかどうかを確認します。次のコマンドを実行します。
# ip a show eth0
ログを観察します:
# cat /var/log/messages | grep -i keepalived
最初のサーバーがFAULT状態になり、バックアップがMASTERに切り替わることを示すメッセージが表示されます。eth0を再びオンにすると、サーバーは自動的に元の状態に戻り、ログにも変更が記録されます。
外部ネットワーク障害のシミュレーションでも同様です。eth1 を無効にすると、keepalived がそれを処理し (track_interface が設定されている場合)、必要に応じて役割を反転します。
フェイルセーフ動作を確認するために、Squid を手動で停止することを忘れないでください。
# systemctl stop squid
ログには、keepalived がサービスが停止していることを認識し、それに応じて IP を切り替えたことが示されます。
まとめ
この設定は冗長ではあるものの、少し調整を加えると驚くほど信頼性が高くなりました。重要なのは、仮想IPアドレスが実際のインターフェースに直接結び付けられていないこと、そしてチェックが正確であることです。1台のマシンでは安定するまでに1、2回失敗するかもしれませんが、実稼働環境では予期せぬ障害を非常にスムーズに処理できます。ネットワークインターフェースとアプリサービスの両方にヘルスチェックを実装することで、回復力が向上し、事態の収拾に役立ちます。
まとめ
- yum install keepalivedで keepalived をインストールします。
- VRRPインスタンスを慎重に定義し、優先順位を設定し、仮想IPを指定します。
- マルチキャスト トラフィックのファイアウォール ルールを構成する
- アプリとインターフェースのヘルスチェックを追加する
- 意図的にネットワークとサービスを中断してテストする
結びの言葉
高可用性の設定は確かに少し難解ですが、一度うまく機能するようになれば、本当に安心です。重要なのは、徹底的な監視とテストです。この記事が、プロキシ設定の耐障害性を高めるための確固たる基盤となることを願っています。これは複数のシステムでうまく機能した例ですが、誰かのダウンタイム削減に役立つことを願っています。