keepalived 关闭-守护进程关闭时不运行“通知”挂钩

keepalived 关闭-守护进程关闭时不运行“通知”挂钩

我在跑保持活跃在 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

相关内容