我在跑保持活跃在 Debian (Lenny, Squeeze) 下,在一个相当简单的设置中,我只是 (ab) 将其用作 VRRP 守护进程来决定两个相同机器之间的某些虚拟 IP 的主控权。所有神奇的事情都发生在通知-脚本。
当我完全停止守护进程(使用 debian 的 init 脚本)时,keepalived 不会运行用于备份或至少故障模式的通知脚本,这正是我所怀疑和需要的。
我可以“修复” rc-script,但会产生一些不良影响 - 通知脚本将被硬编码到 rc-script 中,从而引入这两者之间不必要的耦合,并导致将补丁移植到下一个 Debian 版本时出现混乱,所以这不是我真正想要的方式...
有没有什么提示可以更清楚地解决此问题?
vrrp_instance FOORRP {
virtual_router_id 42
interface eth0
state BACKUP
priority 200
nopreempt
authentication {
auth_type AH
auth_pass foobar42
}
notify "/usr/local/bin/vrrp-state"
virtual_ipaddress {
127.0.0.2
}
}
PS:“三个notify_”脚本的使用不会改变任何东西
PPS:在变更日志(版本 1.1.16)其中提到了一些内容,在某种程度上符合我的问题(尽管我在 keepalived 中没有使用任何与 lvs 相关的东西),但我使用的是较新的版本(1.1.20):“在 keepalived 关闭时,notify_down 不会对工作中的真实服务器执行。”
答案1
查阅了更多文档并最终找到了它:
notify_stop "/usr/local/bin/vrrp-state fault"
按预期工作.... X-}
答案2
我最近遇到了这样的问题,我发现不执行这些脚本是合乎逻辑的。这些脚本会在发生特定事件(例如成为主服务器或从服务器)时执行。除非手动关闭并且有充分理由,否则不应关闭 Keepalived 进程。如果您担心 Keepalived 进程出现故障(不是手动关闭的情况),您可以使用监控。它是一个很好的工具,可以监控您正在运行的进程,并在任何一个进程失败时重新启动它们。
正如您所提到的,您可以简单地修改 keepalived 的启动脚本来执行所需的脚本(例如停止其他服务)。我认为这比修补 keepalived 代码、自己维护它以及每次想要重新安装/升级它时再次执行必要的修补程序更干净。
答案3
您可以使用它notify
来获取有关以下 5 种状态转换的通知:
- 掌握
- 备份
- 过错
- 停止
- 已删除
你可以使用脚本来捕获以下任何一个:
#!/bin/bash
ENDSTATE=$3
NAME=$2
TYPE=$1
case $ENDSTATE in
"BACKUP") # Perform action for transition to BACKUP state
exit 0
;;
"FAULT") # Perform action for transition to FAULT state
exit 0
;;
"STOP") # Perform action for transition to STOP state
exit 0
;;
"MASTER") # Perform action for transition to MASTER state
exit 0
;;
*) echo "Unknown state ${ENDSTATE} for VRRP ${TYPE} ${NAME}"
exit 1
;;
esac