在公司内网通过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机制竟然工作正常了。
暂未探寻究竟,也未尝试其它目录,权且记录,以备后查。