Skip to main content

Notify script is not working on Keepalived v1.3.5

· 2 min read

在公司内网通过 Keepalived 的 VIP 机制及诊断脚本提供一些高可用服务及智能选择服务,但由于内网网络设备及环境复杂,导致在上面组建的 Overlay 网络内的 ARP 广播不通畅,在 Keepalived 主备切换切换后当前有效节点的 MAC 地址通知不到客户端,从而导致客户端不能连接到正确的服务节点,因此就想使用 Keepalived 的 notify scripts, 在 Keepalived 状态转变后在所有客户端执行一个脚本更新 MAC 地址。

脚本也简单,定义客户端列表直接 shell 上去设置 MAC 地址(节点间通过 ssh key 配置了自动登录):

#!/bin/sh

declare -a nodes=(
"192.168.126.8"
"192.168.126.9"
"192.168.126.10"
"192.168.126.11"
"192.168.126.12"
"192.168.126.13"
"192.168.126.14"
"192.168.126.15"
)

ip addr show eth0 | grep 192.168.126.99
foundVip=$?

for ip in "${nodes[@]}"; do
if [ $foundVip -eq 0 ]; then
MAC=`ip addr show eth0 | grep ff:ff:ff:ff:ff:ff | awk '{print $2}'`
ssh root@$ip arp --set 192.168.126.99 $MAC
fi
done

环境:CentOS 7.6, Kernel 4.20.5, Keepalived v1.3.5

按照 track_script 和 real_server 中定义 MISC_TASK 脚本的惯例用法, 把脚本放在了/usr/libexec/keepalived 目录下, 配置了 execute 权限, 单独测试脚本工作正常。在 vrrp_instance 中配置 notify 脚本路径及执行用户 root, 如下:

vrrp_instance VI_POSTGRESQL {
...
virtual_ipaddress {
192.168.126.99/24 dev eth0 label eth0:1
}
...
notify "/usr/libexec/keepalived/update_mac_for_vip.sh" root
}

配置完成后停止/启动脚本测试了多次, 都不能得到执行, Google 了半天, 有些资料提到 Keepalive 其中的一个 patch 把 notify 的配置方法改成了 array, 于是尝试按列表方式配置 notify scripts, 如下:

notify {

    "/usr/libexec/keepalived/update_mac_for_vip.sh" root

}

依然不奏效。

一个偶然的尝试把脚本从/usr/libexec/keepalived 路径移到了/etc/keepalived 目录下, 并更新 Keepalived 配置文件/etc/keepalived/keepalived.conf, 重启 Keepalived 后, notify 机制竟然工作正常了。

暂未探寻究竟,也未尝试其它目录,权且记录,以备后查。

ClustrMaps