keepalived配置文件

keepalived配置文件

我正在尝试在 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,发现有关缺少跟踪脚本的错误。

相关内容