Keepalived的priority动态衰减机制是按健康检查失败条件扣分而非定时递减,通过vrrp_script定义检测逻辑并配合weight(推荐负值)实现故障降权,如chk_haproxy脚本失败两次使priority从100降至70,备节点设为80即可触发主备切换。

Keepalived 的 priority 动态衰减机制,本质是通过健康检查失败自动降低节点优先级,从而触发主备切换——它不是“定时递减”,而是“按条件扣分”,更精准、更可控。核心靠 vrrp_script 配合 weight 参数实现。
配置 vrrp_script 定义检测逻辑
在 /etc/keepalived/keepalived.conf 的全局块或实例外定义脚本,例如检测后端服务是否存活:
- 脚本返回 0 表示健康,不调整优先级
- 脚本返回非 0(如 1)表示异常,按 weight 值修改当前节点优先级
- weight 可为正(提升)或负(衰减),推荐用负值实现“故障即降权”
示例:检测 HAProxy 端口是否响应
vrrp_script chk_haproxy {
script "/usr/bin/timeout 2 /usr/bin/curl -f http://127.0.0.1:8404/health || exit 1"
interval 3
fall 2
rise 3
weight -30
}
在 vrrp_instance 中绑定并启用该脚本
确保该脚本被实例引用,且初始 priority 设置合理(如主节点设为 100,衰减后仍高于备节点初始值):
- 若主节点 priority = 100,weight = -30,则检测失败两次后实际优先级变为 70
- 备节点 priority 建议设为 90 或更低(如 80),这样主节点衰减后(70)
- 必须配置 track_script,否则脚本不生效
示例片段:
vrrp_instance VI_HA {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication { auth_type PASS; auth_pass 123456; }
virtual_ipaddress { 192.168.10.100/24 dev eth0 }
track_script {
chk_haproxy
}
}
理解衰减后的优先级计算规则
Keepalived 实际使用的优先级 = 配置文件中 priority + 所有生效 weight 值之和。关键细节:
- weight 仅在脚本执行失败(fall 次数达标)后才生效;恢复成功(rise 次数达标)后 weight 自动撤销
- 多个脚本可同时 track,权重叠加(如 chk_haproxy -30 + chk_disk -10 → 总衰减 -40)
- 最终优先级不会低于 1 或高于 255,超出范围会被截断
- 若衰减后主节点优先级 ≤ 备节点,且备节点未被抑制(nopreempt 未启用),则立即触发切换
验证与调优建议
部署后需主动验证衰减是否生效:
- 手动停掉 HAProxy:
systemctl stop haproxy,观察日志:tail -f /var/log/syslog | grep keepalived,应看到 “priority changed” 和 “entering FAULT state” 类提示 - 检查运行时优先级:
ip a看 VIP 是否漂移;或读取内核状态:cat /proc/net/ip_vs_stats(若启用了 LVS) - 避免过激衰减:weight 不宜过大(如 -100),否则一次检测失败就跌破备节点,易误切;推荐 -10 ~ -40 区间,配合 fall/rise 控制稳定性










