更新:似乎需要自定义跟踪脚本才能在 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