私は3つのmongodbボックスにkeepalivedを実装しようとしていますが、いずれかのボックスのmongodがダウンした場合や、何らかの理由でアプリケーションを再構成する必要がないためにプライマリノードを別のシステムに移動する必要がある場合に使用します。
Keepalived.confはかなり単純です。1つはmongodが実行されていることを確認するためのVRRP_scriptと、もう1つはローカルのmongodインスタンスがプライマリノードであるかどうかを確認するためのbashスクリプトを実行するためのものです。
!Configuration File for keepalived
# Global definitions
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtprelay.penton.com
smtp_connect_timeout 30
}
# Check to see if mongod is running
vrrp_script chk_mongod {
script "killall -0 mongod" # verify the pid exists
interval 2 # check every 2 seconds
# weight 2 # add 2 points if OK
}
# Check to see if this node is the primary
vrrp_script chk_mongod_primary {
script "/usr/local/bin/chk_mongo_primary.sh"
interval 2
# weight 2
}
# Virtual interface configuration
vrrp_instance VI_1 {
state MASTER
interface eth0 #interface to monitor
virtual_router_id 51
priority 101 # 101 on mater, 100 on backup
virtual_ipaddress {
192.168.122.99
}
track_script {
chk_mongod
chk_mongo_primary
}
}
ノードでmongodサービスをシャットダウンすると、/ var/log/messagesに次のような出力が表示されると予想されるように、フローティングIPが別のボックスにシフトします。
Jul 17 16:23:34 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Script(chk_mongod) failed
Jul 17 16:23:35 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Instance(VI_1) Entering FAULT STATE
Jul 17 16:23:35 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Instance(VI_1) removing protocol VIPs.
Jul 17 16:23:35 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Instance(VI_1) Now in FAULT state
Jul 17 16:23:35 mongodbtest01 Keepalived_healthcheckers[30303]: Netlink reflector reports IP 192.168.122.99 removed
Mongodを元に戻すと、IPはそのボックスに戻ります(優先順位があるため)。
Jul 17 16:27:42 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Script(chk_mongod) succeeded
Jul 17 16:27:43 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Instance(VI_1) prio is higher than received advert
Jul 17 16:27:43 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jul 17 16:27:44 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Instance(VI_1) Entering MASTER STATE
Jul 17 16:27:44 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Instance(VI_1) setting protocol VIPs.
Jul 17 16:27:44 mongodbtest01 Keepalived_vrrp[30304]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.122.99
Mongodがダウンして再びアップしたときに、各ログ出力のVRRP_Script(chk_mongod)に注意してください。ただし、このノードがプライマリではなくなるようにレプリカセットを再構成すると、chk_mongod_primaryという名前のVRRP_Scriptの実行が成功または失敗することはわかりません。コマンドラインからスクリプトをテストしましたが、毎回期待される結果が返されますが、collectdによって実行されることはないようです。
/usr/local/bin/chk_mongo_primary.shは次のようになります。
#!/bin/bash
# Check to see if this node is master
result=$(mongo --eval "printjson(db.isMaster().ismaster)" 2>&1)
m_status=`echo $result | cut -d' ' -f 8`
if [ "$m_status" == "true" ] ;
then
echo "I am primary"
exit 0
else
echo "I am secondary"
exit 1
fi
私はさまざまなことを試し、他のキープアライブ構成を調べて、どこが間違っているのかを理解できるかどうかを確認しましたが、これは私を困惑させました。
誰かが私がどこで間違っているのかについての手がかりを提供できますか?
前もって感謝します。
これは解決されました。問題は、confファイルのtrack_scriptセクションにある太い指のスクリプト名でした。これは、構成ファイルを解析して結果を出力するkeepalived --dump-confを実行することで解決しました。/var/log/messagesを追跡したところ、トラックスクリプトが見つからないというエラーが見つかりました。