こんにちは。よこやんです。
先日、納品済みのサーバが止まってしまうという事態が発生しました。
しかも休日にね…
何かと問題のあるサーバで、さすがのお客様もお怒りのようです。(構築したのは僕じゃない…僕じゃないんだ…)
そこで、Linux(Red hat)サーバを冗長化しよう!となりました。というかしてくれ!ですね。
調べたところ、どうやらサーバが2台あれば、「Keepalived」を使って冗長化ができるらしいことがわかりました。
今回は、その時の構築メモです。
・Keepalivedとは?
Keepalivedは、Linuxベースのシステムでロードバランシングと高可用性を実現するためのソフトウェアです。
ロードバランシングのフレームワークはLVS(Linux Virtual Server)を利用してLayer4のロードバランシングを実現し、バックエンドサーバのサービスを監視して複数のサーバの稼働状況に応じて、負荷分散を行う機能を実現しています。
高可用性はルータなどを冗長化する際に利用されるVRRP(Virtual Router Redundancy Protocol)を使って、仮想IPアドレス(VIP)を管理し、これによりサービスに参加する複数の機器(ノード)に対して、Keepalivedが1つの仮想IPアドレスを提供することで、複数ノードの内どれかが故障した場合でもサービスを継続できるように設計することが可能です。
参考
・Keepalivedの設定方法:高可用性とVIPの実現、動作確認の手順
・Keepalived 最新情報 | OSSサポートのOpenStandia™【NRI】
今回、実装するのは高可用性の方ですね。
2台のサーバを用意し、1台が止まっても、もう1台に自動で切り替わることでシステムが落ちないようにしたいと思います。
・インストールと設定
まず、Keepalivedを2台のサーバ両方にインストールします。
sudo yum install keepalived
Keepalivedをインストールすると、「/etc/keepalived」に「keepalived.conf」が作成されます。
これを設定することで、仮想IPアドレスが指定できます。
今回、仮想IPアドレスを「192.168.100.10」に設定します。
普段動いているサーバをMASTER、障害があったときに切り替わるサーバをBACKUPとし、それぞれ設定していきます。
MASTER
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.100.10/24
}
}
BACKUP
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 90 # MASTERより低く設定
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.100.10/24
}
}
・vrrp_instance (インスタンス名)
インスタンスの名前(自由に設定可能)です。複数のインスタンスがある場合
に区別するために使われます。
・state
MASTER 起動時にこのサーバが優先的に仮想IPを持つように設定されます。
BACKUP バックアップサーバとして起動します。
→最初に仮想IPを持たせたいサーバにMASTERを指定します。
・interface
仮想IPアドレスを設定するネットワークインターフェース名です。
環境によって異なるので、要確認です。
・virtual_router_id
VRRPグループを識別する一意なIDです。(0~255)
同じ仮想IPアドレスを共有するサーバ群は同じIDを使います。
違う仮想IPアドレスを管理する場合は、別のIDを設定します。
・priority
VRRPインスタンスの優先度です。(数値が大きいほど優先される)
MASTERは通常100にし、BACKUPはそれ以下にします。(例:90)
MASTERがダウンすると、次に高いpriorityのサーバが仮想IPアドレスを引き継
ぎます。
・advert_int
VRRPアドバタイズメントの間隔です。(秒単位)
通常は1秒。障害検知の速さにかかわるパラメータです。
小さくすると切り替えが早くなりますが、ネットワーク負荷がわずかに増える
そうです。
・authentication
VRRPパケットの認証設定です。
auth_type PASSはパスワード認証です。
auth_pass 1234は認証パスワード(任意の文字列)です。
→LAN内でのセキュリティを確保する役割があるそうです。
・virtual_ipaddress
VRRPによって共有される仮想IPアドレスを指定します。
実際にクライアントがアクセスするVIPをここに記載します。
192.168.100.10が共有される仮想IPアドレスです。
参考
・Red Hat公式ドキュメント:Keepalivedを用いたロードバランサーの初期設定
・Oracle公式ドキュメント:Keepalivedを使用した仮想IPアドレスのフェイルオーバー構成
・さくらのナレッジ:「Linux Virtual Server」と「Keepalived」で作る冗長化ロードバランサー
設定が終了したら、Keepalivedを再起動しましょう。
設定した内容はKeepalivedのサービスを再起動しないと有効化されません。
sudo systemctl restart keepalived
またサーバ起動時に自動でサービスが上がるようにしておきましょう。
sudo systemctl enable keepalived
・確認
以下のコードでMASTERに仮想IPアドレスが割り振られているか確認します。
「inet 192.168.100.10/24 scope global eth0」のように返ってくればOKです。
「eth0」の部分はネットワークインターフェースの名前によって変わります。
ip a | grep 192.168.100.10
ここで私ははまったのですが、
MASTERとBACKUPの両方で、「ip a | grep 192.168.100.10」のコマンドが返ってきました。(両方に仮想IPアドレスが割り振られている状態)
本来は1つのサーバのみ返ってくるのが正しいです。
ファイアウォールの設定でVRRPを許可すると改善されました。
firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept'
#リロードで設定を反映
firewall-cmd --reload
以上の設定を行うと、サーバの電源が落ちたり、ネットワークが切断されたり、Keepalivedのサービスが止まった時に自動でサーバが切り替わります。
ただこの場合、Apacheが止まってしまった場合、サーバは自動で切り替わりません。Apacheが止まった場合も自動で切り替わるようにするには、追加で設定が必要になります。
以下、Apacheに対応する設定になります。
・追加設定(Apache対応)
Apache対応するには、先ほど編集した「keepalived.conf」をさらに編集する必要があります。
赤字がApache対応のために追記した部分です。
MASTER
vrrp_script chk_httpd {
script "/etc/keepalived/check_httpd.sh"
interval 2
weight -20
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface eno1
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.251.10/24
}
track_script {
chk_httpd
}
}
BACKUP
vrrp_script chk_httpd {
script "/etc/keepalived/check_httpd.sh"
interval 2
weight -20
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 90 # MASTERより低く設定
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.100.10/24
}
track_script {
chk_httpd
}
}
・vrrp_script (インスタンス名)
インスタンスの名前(自由に設定可能)です。複数のインスタンスがある場合
に区別するために使われます。
・script
実行するスクリプトのパスを指定します。スクリプトは終了コード0で成功、0
以外で失敗と判断されます。
・interval
スクリプトを実行する間隔(秒)を指定します。
・timeout
スクリプトの実行がタイムアウトと見なされるまでの時間(秒)を指定しま
す。
・weight
スクリプトの結果が成功した場合に、VRRPインスタンスの優先度に加算され
る値を指定します。失敗した場合は減算されます。
・fall
スクリプトが連続して失敗と判断される回数を指定します。この回数に達する
と、状態が「異常」と見なされます。
・rise
スクリプトが連続して成功と判断される回数を指定します。この回数に達する
と、状態が「正常」と見なされます。
参考
・A.3. keepalived のインストールおよび設定
・Keepalivedの通知スクリプトと追跡スクリプトについて
・Keepalived and high availability: Advanced topics
scriptに指定した、「check_httpd.sh
」の中身は以下になります。
pidof httpd >/dev/null && exit 0 || exit 1
#確認(httpdが起動している場合0、起動していない場合1を返す)
sh check_httpd.sh; echo "終了コード:$?"
Keepalivedを再起動すると、
httpdが止まった場合もBACKUPのサーバに仮想IPアドレスが切り替わるようになったかと思います。
・まとめ
今回はKeepalivedを使用し、サーバを冗長化しました。
無料でこのような機能があるなんて、すばらしいですね。
実際、httpdのサービスが止まってしまうことが度々あったので、導入当初から設定しておけばよかったのに…
まぁ実際に問題が起きないと対応しないですよね。
そういえば、証明書の切り替えはどうするんだ?と思ったのですが、同じ証明書をBACKUPサーバに配置しておけばOKみたいですね。
また、今回はやりませんでしたが、BACKUPサーバに切り替わったタイミングでメールを送信する、なんてこともできるみたいですね。
機会があったらやってみたいです。
以上、よこやんでした!
コメント