我正在尝试在 3 个 mongodb 盒上实现 keepalived,其想法是,如果其中一个盒上的 mongod 出现故障或者我们由于某种原因需要将主节点移动到另一个系统,则我们的应用程序不需要重新配置。
keepalived.conf 非常简单,有 2 个 VRRP_scripts,一个用于检查 mongod 是否正在运行,另一个用于执行 bash 脚本,检查本地 mongod 实例是否是主节点。
keepalived配置文件
!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 服务,浮动 IP 就会转移到另一个节点,正如我所料,我会在 /var/log/messages 中看到这样的输出
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
我尝试了各种各样的方法,并查看了其他 keepalived 配置,看看是否能找出问题所在,但这让我很困惑。
有人能提供线索告诉我哪里错了吗?
提前致谢。
答案1
问题已经解决,问题出在 conf 文件的 track_script 部分中,脚本名称写错了。通过运行 keepalived --dump-conf 可以解决此问题,该命令会解析配置文件并输出结果。我跟踪了 /var/log/messages,发现有关缺少跟踪脚本的错误。