Keepalived 中不存在 delay_loop 参数,实际由 vrrp_script 的 interval、fall/rise、weight 与 vrrp_instance 的 advert_int、preemption 共同决定切换行为;interval 控制检测频率以平衡精度与负载,fall/rise 实现防抖,weight 触发优先级变更,preempt_delay 或 preempt off 避免震荡,辅以内核参数调优保障脚本可靠执行。

明确核心逻辑:Keepalived 不通过 delay_loop 控制切换延迟,而是靠 vrrp_script 的 interval(检测频率)、fall/rise(失败/恢复阈值)和 weight(权重偏移),联动 vrrp_instance 的优先级变化,最终触发状态迁移。所谓“延迟切换”,本质是让优先级下降足够多、持续足够久,才使 BACKUP 节点满足接管条件。
用 interval 控制检测粒度,避免过载
检测太密会增加 CPU 和网络开销,尤其当脚本调用 curl、ping 或自定义服务探活时。
- 普通 HTTP 服务:interval 设为 3–5 秒较稳妥;短于 2 秒易引发瞬时并发压力
- 数据库连接检测:建议 5–10 秒,避免连接池耗尽或触发 DB 限流
- 仅链路层探测(如 ping 网关):可设为 1–2 秒,开销极低,适合快速感知物理中断
用 fall/rise 配合 weight 实现“防抖”
单次检测失败不等于真实故障。通过 fall 和 rise 设置连续失败/成功次数,可过滤毛刺,减少误切。
- 例如:
fall 3 rise 2 interval 4表示:每 4 秒检测一次,连续失败 3 次才降权,连续成功 2 次才加权 - 搭配 weight -30:若原始 priority 是 100,三次失败后变为 70,低于 BACKUP 的 90,才会触发切换
- 这样既避免了因网络抖动导致的频繁漂移,又保留了对持续性故障的敏感响应
结合 advert_int 与 non-preemptive 模式稳住主节点
即使检测脚本已降权,若未关闭抢占(preemption),高优先级节点恢复后可能立刻抢回 VIP,造成二次震荡。
- 在 vrrp_instance 中显式写
preempt_delay 5:恢复后等待 5 秒再尝试抢占,留出缓冲窗口 - 或设
preempt off(非抢占模式),由人工/运维策略控制主备归属,适合强一致性场景 - advert_int 保持默认 1 秒即可 —— 它只影响 VRRP 心跳广播频率,不参与健康决策,调大反而延长故障发现时间
内核与系统级配套不可少
检测脚本再精准,若系统限制过严,也会失真或超时失败:
- 确保
net.ipv4.ip_nonlocal_bind = 1,否则脚本中 bind 到 VIP 会失败 - 调整
net.core.somaxconn和net.ipv4.tcp_max_syn_backlog,防止高频 curl/ping 触发连接队列溢出 - 限制脚本资源:用 systemd 或 cgroups 控制其 CPU/memory 使用,避免拖垮主进程

















