Keepalived:当主服务器上的检查脚本发现应用程序的服务已关闭时,不会转换到备份节点

Keepalived:当主服务器上的检查脚本发现应用程序的服务已关闭时,不会转换到备份节点

我正在尝试以这样的方式配置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用户

相关内容