我正在尝试以这样的方式配置keepalived,如果主节点上运行的任何应用程序或服务出现故障,keepalived应该将其视为故障,并且备份节点应该充当主节点并接管主节点的浮动IP。
我编写了一个脚本来检查主服务器上的服务 X 是否发生故障,然后它是否应该转换到备份节点。
我的 keepalived 配置是:
global_defs {
enable_script_security
}
vrrp_script keepalived_check {
script "/root/new/check.sh"
interval 1
timeout 1
rise 2
fall 2
weight 0 reverse
}
vrrp_instance V1_11 {
state MASTER
interface ens3
virtual_router_id 51
priority 101
advert_int 1
unicast_src_ip 192.168.10.129
unicast_peer {
192.168.10.130
}
authentication {
auth_type PASS
auth_pass 1122
}
virtual_ipaddress {
192.168.10.231/24
}
track_script {
keepalived_check
}
}
检查服务状态的脚本:
#!/bin/bash
var="$(systemctl is-active myservice.service)"
if [ $var == "active" ]
then
echo 0
else
echo 5
fi
我使用以下方法手动停止了“myservice”
systemctl stop myservice.service
脚本的输出结果与预期一致,为“5”。但是,使用上述配置,主节点仍为主要节点,并且不会将所有权转移给备份节点。我是否遗漏了任何特定配置,能否帮助我找到?
答案1
再见,因为我遇到了同样的问题,所以让我分享一下我的解决方法。不要问我为什么,但是脚本失败后,由于受监控的进程被标记为 DOWN,我被迫重新启动 keepalived 进程。
此外,在我的环境中(Ubuntu 20.04),keepalived 进程的唯一退出代码是 0 和 1。
因此,无需对 keepalived.conf 进行任何更改,只需将脚本调整为以下内容即可:
#!/bin/sh
var=$(systemctl is-active apache2)
if [ "$var" = "active" ]
then
exit 0
else
#workaround
systemctl restart keepalived
exit 1
fi
它也应该对你有用!祝你好运。
PS:对于其他未来的读者,请确保你可以通过以下方式执行脚本keepalived_script用户