Keepalived 通过 notify 机制在状态切换时调用脚本实现精准告警,推荐结合 vrrp_script 健康检查与轻量异步通知,并记录日志;替代方案是采集其 syslog 交由 ELK 或 Alertmanager 统一告警。

Keepalived 本身不内置告警发送功能,但可通过其 vrrp_script 和 notify 机制,结合外部脚本实现“状态变化即告警”。关键不是让 Keepalived 主动监控,而是让它在角色切换(MASTER/BACKUP/FAULT)时触发自定义脚本,由脚本完成告警发送。
利用 notify 配合状态判断发送精准告警
Keepalived 支持为每个 VRRP 实例配置 notify 指令,会在状态切换时自动调用脚本,并传入三个参数:$1(名称)、$2(新状态:MASTER/BACKUP/FAULT)、$3(优先级)。这是最可靠、最轻量的联动入口。
- 在 keepalived.conf 的 vrrp_instance 块中添加:
notify /usr/local/bin/keepalived_notify.sh - 脚本中用 case 判断 $2,只对 MASTER 和 FAULT 发送告警(BACKUP 通常无需告警,FAULT 表示检测失败)
- 避免在 notify 中执行耗时操作(如发邮件、调 API),建议写入队列或异步调用,防止阻塞 Keepalived 主进程
通过 vrrp_script 检测服务健康并触发告警
若需在服务异常(如 Nginx 崩溃)时提前告警,而非等到 VIP 切换,可定义 vrrp_script 并关联到实例,再在 notify 脚本中识别该脚本退出状态。
- 定义检查脚本(如 /etc/keepalived/check_nginx.sh),返回 0(正常)或非 0(异常)
- 在 keepalived.conf 中声明:
vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 }
并将其加入 instance 的 track_script - Keepalived 不会直接通知脚本失败,但会导致优先级降低甚至进入 FAULT 状态 —— 因此 notify 脚本中检测到 FAULT 时,可结合日志或临时标记进一步确认是否由 chk_nginx 引起
告警脚本推荐实践:轻量 + 可靠 + 可追溯
告警脚本应聚焦“发得准、留得下、不拖慢”,不建议在其中做复杂逻辑。
- 使用 curl 调用企业微信/钉钉机器人 Webhook,5 行内完成 HTTP POST,附带主机名、状态、时间、VIP
- 将每次触发记录到本地日志(如 /var/log/keepalived-alert.log),含时间戳和完整参数,便于回溯
- 加简单锁机制(如 flock)避免并发重复告警;对连续 FAULT 做限频(如 5 分钟内只发一次)
- 测试时用 keepalived -d -f /etc/keepalived/keepalived.conf 手动模拟状态切换验证脚本执行
替代方案:用日志+Filebeat+告警系统联动
如果已有 ELK 或 Prometheus+Alertmanager,更推荐解耦方式:
- 启用 Keepalived 日志(修改 syslog 配置,确保 local0.info 写入 /var/log/keepalived.log)
- 用 Filebeat 或 journalctl -u keepalived 实时采集 “Transition to MASTER”、“Entering FAULT state” 等关键词
- 在 Alertmanager 或日志平台配置匹配规则,触发邮件/短信/IM 告警 —— 这种方式更易维护、审计,且不依赖 Keepalived 进程稳定性

















