我有 2 个应用服务器都配置为运行 php cron 作业,但只有 1 个可以随时运行该作业。由于我已经将keepalived用于其他目的,我正在考虑在cron作业中使用一些逻辑来检查节点是否具有虚拟ip,然后执行作业。所以理论上,即使两台服务器同时运行 cron 作业,也只有 1 台服务器会执行“真正的”作业。
但我的问题是如何检查节点是否有vip?有人可以建议我吗?
谢谢。
我有 2 个应用服务器都配置为运行 php cron 作业,但只有 1 个可以随时运行该作业。由于我已经将keepalived用于其他目的,我正在考虑在cron作业中使用一些逻辑来检查节点是否具有虚拟ip,然后执行作业。所以理论上,即使两台服务器同时运行 cron 作业,也只有 1 台服务器会执行“真正的”作业。
但我的问题是如何检查节点是否有vip?有人可以建议我吗?
谢谢。
我只需要这样做。如果您只想检查您所在的框是否浮动公共 ip,并且该 ip 是 abcd,那么运行以下内容就足够了:
ip a | grep a.b.c.d
我很确定在 bash 中您可以将该命令的输出用作条件本身。如果机器没有浮动公共 ip,则输出应该为空,因此评估为 false,如果 ip 匹配,那么它应该评估为 true。
Here's a generalized script I suggest calling is_primary to do that:
#!/bin/bash
#
# Tells you if this node is the primary or secondary with keepalived
conf=/etc/keepalived/keepalived.conf
# Not sure why I can't do this in 1 step, but this works:
vip=$(expr "$(cat $conf)" : '.*\bvirtual_ipaddress\s*{\s*\(.*\)/*}')
vip=`expr "$vip" : '\([^ ]*\)' | sed 's/\./\\\\./g'`
if ip addr | grep -q "$vip"
then echo Primary ; exit 0
else echo Secondary ; exit 1
fi