keepalived 记录了故障但不会进行故障转移

keepalived 记录了故障但不会进行故障转移

我正在运行 2 个共享公共 IP 的 keepalived 服务器(Server1 和 Server2)。Server1 是主服务器,每当 haproxy 死机时,Server2 应该接管。如果 Server1 恢复,Server2 应该释放 vIP 并让 Server1 再次接管。

我已经设法使用下面两个配置来运行它,但是,我最近注意到它停止工作了。

服务器运行的是 CentOS 7,并且已完全更新。如果我手动终止 Server1 上的 keepalived,它会故障转移到 Server2,当 keepalived 重新启动时,Server1 会再次接管。但是,如果我终止 haproxy,keepalived 会记录 check_haproxy 检查失败,但不会进行故障转移。

为了确保它不是 FW 或 SELinux,我删除了所有 IPtables 规则并禁用了 SELinux。

配置如下:

服务器1

global_defs {
    # Keepalived process identifier
    # Probably should be unique: http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html
    lvs_id haproxy_DH
}
# Script used to check if HAProxy is running
vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}
# Virtual interface
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
    state EQUAL
    interface eno16777984
    virtual_router_id 51
    notify /etc/keepalived/notify.sh
    priority 100
    # The virtual ip address shared between the two loadbalancers
    virtual_ipaddress {
        10.9.17.20
        10.9.17.19
    }
    track_script {
        check_haproxy
    }
}

服务器2

global_defs {
    # Keepalived process identifier
    # Probably should be unique: http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html
    lvs_id haps2a

# Script used to check if HAProxy is running
vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}
# Virtual interface
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
    state EQUAL
    interface eno16777984
    virtual_router_id 51
    notify /etc/keepalived/notify.sh
    priority 100
    # The virtual ip address shared between the two loadbalancers
    virtual_ipaddress {
        10.9.17.20
        10.9.17.19
    }
    track_script {
        check_haproxy
    }
}

答案1

我找不到任何文档来解释 的含义state EQUAL。我通常将初始状态定义为 ,BACKUP并让选举过程选择主实例。

我将您的配置文件复制到实验室环境,发现global_defsServer2 的 keepalived.conf 中缺少右括号 。但是,尽管缺少该字符,故障转移似乎仍能正常工作

请检查tcpdump -i eno16777984 vrrp是否存在不相关的 VRRP 数据包VRID=51。或者尝试将 更改virtual_router_id为其他数字。由于 VRRP 数据包被发送到多播地址224.0.0.18,因此网络中的每个虚拟 IP 都必须使用唯一的VRID

另外,如果您打算让 Server1 接管虚拟 IP,我建议您priority 101在其 中设置vrrp_instanceRFC5798部分6.4.3. 主人表示如果 Server1 的 IP 地址大于 Server2 的 IP 地址,并且两个服务器具有相同的优先级,则 Server1 赢得选举并获得虚拟 IP。但是,keepalived似乎只比较优先级。


编辑:实际上,我在第二次测试中忘记删除右括号。实际上,keepalived 启动过程会忽略缺失的括号,但运行时故障转移不起作用。

答案2

除了配置文件中的正确语法外,还请注意,killall现在 CentOS 7 上默认未安装。您需要安装psmisc此包,或者可以使用script "pidof haproxy"

相关内容