Keepalived 状态变更需通过 notify 指令调用外部脚本实现通知,脚本接收 $1 参数判断 MASTER/BACKUP/FAULT 状态并执行邮件、Webhook 或日志等操作,须加防抖机制和异步处理避免阻塞。

Keepalived 状态变更(如 MASTER 切换为 BACKUP)本身不自带通知能力,需通过其 vrrp_script 与 notify 指令配合外部脚本完成通知。核心在于利用 Keepalived 的 notify 钩子,在状态变化时触发自定义逻辑。
配置 notify 脚本监听状态变更
Keepalived 支持为每个 VRRP 实例指定 notify 指令,该指令会在状态进入 FAULT、BACKUP、MASTER 时被调用,并传入当前状态作为参数。脚本需具备可执行权限,并能接收该参数进行分支处理。
- 在 vrrp_instance 块中添加:
notify /etc/keepalived/notify.sh - 脚本第一行应为
#!/bin/bash,并确保chmod +x - 脚本内可用
$1获取当前状态(如 "MASTER"),用 case 或 if 判断后执行对应动作
在 notify 脚本中集成通知方式
通知方式取决于实际运维环境,常见包括邮件、Webhook、企业微信/钉钉机器人、日志记录或调用 API。脚本中无需复杂框架,只需标准 Shell 工具即可实现。
- 发邮件:使用
mail或sendmail命令,例如:echo "VIP 切换至 $(hostname)($1)" | mail -s "Keepalived Status Change" admin@example.com - 调用钉钉机器人:用
curlPOST JSON 消息到 Webhook URL,注意设置-H 'Content-Type: application/json' - 写入本地日志:用
logger或直接echo "$(date): $1 on $(hostname)" >> /var/log/keepalived-notify.log
避免重复通知与状态误判
Keepalived 在脑裂、网络抖动或优先级调整时可能频繁触发状态切换,导致通知轰炸。需在脚本中加入简单防抖机制。
- 记录上次状态到临时文件(如
/var/run/keepalived.laststate),每次执行前比对,仅当状态真正变化时发送通知 - 避免在 notify 中执行耗时操作(如长连接 HTTP 请求),超时可能导致 Keepalived 主进程阻塞;建议异步执行(后台 & 或 at)
- 不要依赖 notify 脚本做服务启停——那是 notify_master / notify_backup 的职责;统一用 notify 即可覆盖全部状态
验证与调试要点
配置完成后需主动触发状态切换验证流程是否生效,而非等待故障发生。
- 手动停止高优先级节点的 keepalived:
systemctl stop keepalived,观察另一节点是否升为 MASTER 并触发通知 - 检查脚本输出:重定向 stdout/stderr 到日志文件,或用
journalctl -u keepalived -f查看运行时错误 - 确认 VIP 是否正常漂移:
ip addr show,排除网络层问题干扰通知逻辑判断


















