Keepalived通过vrrp_script调用自定义CPU检测脚本实现负载过高时自动降权切换:编写check_cpu.sh脚本读取1分钟平均负载并与阈值比较,返回0/1退出码;在keepalived.conf中配置vrrp_script设置interval、weight(如-30)、fall/rise,并在vrrp_instance中track_script引用;主节点降权后优先级低于备节点即触发VIP漂移。

Keepalived 本身不直接监控 CPU 负载,但它支持通过自定义脚本(vrrp_script)触发权重调整或状态切换。要实现“CPU 负载过高时自动降级、让备机接管 VIP”,关键在于:用外部脚本检测 CPU 使用率,并将结果反馈给 Keepalived 的 VRRP 实例。
下面给出可落地的配置逻辑和实操步骤:
一、编写 CPU 负载检测脚本
在两台节点上统一创建检测脚本,例如 `/etc/keepalived/check_cpu.sh`:```bash #!/bin/bash # 检查过去1分钟平均负载是否超过阈值(如 8 核机器设为 6.0) LOAD=$(uptime | awk -F'average:' '{print $2}' | awk '{print $1}' | sed 's/,//') THRESHOLD=6.0
if (( $(echo "$LOAD > $THRESHOLD" | bc -l) )); then echo "CPU load high: $LOAD" exit 1 # Keepalived 视为失败 else echo "CPU load OK: $LOAD" exit 0 # Keepalived 视为健康 fi
<p>赋予执行权限:<br>
<font color="gray">chmod +x /etc/keepalived/check_cpu.sh</font></p>
<H3>二、在 keepalived.conf 中集成该脚本</H3>
在 `vrrp_instance` 块中添加 `track_script`,并设置 `weight` 使高负载时降低优先级:
<p>- 主节点(priority 100)配置示例:</p>
<p>```conf
vrrp_script check_cpu {
script "/etc/keepalived/check_cpu.sh"
interval 3 # 每3秒检查一次
weight -30 # 检测失败时,priority 减去30 → 100→70
fall 3 # 连续3次失败才触发降权
rise 2 # 连续2次成功才恢复权重
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication { ... }
virtual_ipaddress { 192.168.1.100/24 }
track_script {
check_cpu
}
}
```</p>
<p>- 备节点(priority 90)保持相同 `track_script` 配置,但无需改 `weight`;当主节点因 CPU 过载被降权至 70(<90),备节点会自动抢占 VIP。</p>
<H3>三、关键注意事项</H3>
- <strong>CPU 阈值需按实际核数校准</strong>:比如 4 核建议设为 3.0,16 核可设为 12.0,避免误切。
- <strong>脚本必须返回标准退出码</strong>:0 表示健康,非 0(如 1)表示异常;Keepalived 仅识别 exit code。
- <strong>确保 `bc` 工具已安装</strong>:Debian/Ubuntu 运行 <font color="gray">apt install bc</font>,CentOS/RHEL 运行 <font color="gray">yum install bc</font>。
- <strong>避免与其它 health check 冲突</strong>:若同时监控 HAProxy/Nginx,请合并逻辑或分脚本独立 track,防止互相干扰。
<H3>四、验证方式</H3>
- 手动模拟高负载:<font color="gray">stress-ng --cpu 8 --timeout 60s</font>(需先安装 stress-ng)
- 查看日志:<font color="gray">tail -f /var/log/syslog | grep keepalived</font>(Debian)或 <font color="gray">journalctl -u keepalived -f</font>
- 观察 VIP 是否漂移:<font color="gray">ip a | grep 192.168.1.100</font>
不复杂但容易忽略

















