为什么当 HAProxy 掉线时 keepalived track_script 不会重新启动 keepalived?

为什么当 HAProxy 掉线时 keepalived track_script 不会重新启动 keepalived?

更新:似乎需要自定义跟踪脚本才能在 HAProxy 死机时真正进行故障转移和重新启动。已发布为答案。

我已经使用互联网上数十个示例中的相同跟踪脚本设置了 keepalived(加上 VIP)+ haproxy + galera_node(在同一主机上,配置如下)。我不明白的是,当我终止haproxy在给定节点上运行的进程时,会出现以下内容/var/log/syslog

Keepalived_vrrp[29230]: VRRP_Instance(250) Entering MASTER STATE
Keepalived_vrrp[29230]: VRRP_Script(check_haproxy) failed

有道理。它确实失败了。但奇怪的是,keepalived它既没有放弃 VIP,也没有进入 BACKUP 状态,而这正是所需的行为(下图中,haproxy 离开几分钟后 VIP 仍然存在)。我是否误解了它的keepalived工作原理,或者我的配置中是否存在其他明显错误?(Ubuntu 14.04 上的 KA 版本为 1.2.7)

# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 0e:02:c6:83:82:74 brd ff:ff:ff:ff:ff:ff 
    inet 10.10.10.202/24 brd 10.20.18.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.10.10.250/32 scope global eth0
       valid_lft forever preferred_lft forever 

keepalived配置文件

global_defs
{
  router_id    mynode
}

vrrp_script check_haproxy
{
   script      "killall -0 haproxy"
   interval    1
   fall        2
   weight      2
}

vrrp_instance 200
{
   virtual_router_id 200
   advert_int   1
   nopreempt
   priority     90
   state        BACKUP
   interface    eth0
   notify       /etc/keepalived/log_status.sh

   virtual_ipaddress
   {
     10.10.10.250 dev   eth0
   }

   track_script
   {
     check_haproxy
   }
}

答案1

我现在正在使用自定义的 track_script 来解决这个问题。如果 haproxy 没有运行,它会重新启动 keepalived。似乎 keepalived 仅在启动/重启时使用默认跟踪脚本进入备份模式,而不是在运行时进入备份模式 ¯\_(ツ)_/¯

#!/bin/sh
# restart keepalive if haproxy died
pid=`/bin/pidof haproxy`
test -z "$pid" && { service keepalived restart &>/dev/null; exit 1; }
exit 0

相关内容