12.4.2 健康检查类型与参数配置

健康检查用于判断主节点服务可用性并触发VRRP状态切换,需结合业务形态选择检查方式与参数阈值,避免误切与漏切。下文包含原理草图、配置示例、脚本、排错与练习。

原理草图:健康检查影响优先级与切换

文章图片

1. 健康检查类型(含示例命令)
- 脚本检查(vrrp_script):自定义检测端口、接口、进程、文件等。
bash # 检测本地HTTP接口是否返回200 curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/health | grep -q 200
- TCP/HTTP检查(脚本内实现):适用于Web与TCP服务。
bash # TCP端口探测(nc) nc -z -w1 127.0.0.1 3306
- 进程检查:适合单进程服务。
bash pgrep -f nginx >/dev/null
- 文件/资源检查:检测磁盘、挂载、配置漂移。
bash # 检测挂载点是否存在 mountpoint -q /data
- 网络检查:检测网关/上游/LB/DNS。
bash ping -c1 -W1 10.0.0.1 >/dev/null

2. 核心参数与含义(命令/日志关联)
- interval:检查周期,过大切换迟缓,过小易抖动。
- timeout:单次超时,建议 < interval
- weight:检查结果对优先级影响,负值降级。
- rise/fall:连续成功/失败次数阈值(或脚本内实现)。
- user:脚本执行用户(最小权限)。
- script:脚本绝对路径,可执行。
- track_script:绑定vrrp实例,影响状态机。

验证参数是否生效:

# 查看keepalived运行状态与脚本日志
systemctl status keepalived
journalctl -u keepalived -f

3. 配置示例(完整可用,含注释)
文件:/etc/keepalived/keepalived.conf

vrrp_script chk_http {
    script "/etc/keepalived/scripts/chk_http.sh"
    interval 2
    timeout 1
    fall 3
    rise 2
    weight -30
    user root
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.100/24
    }
    track_script {
        chk_http
    }
}

4. 脚本示例(可执行与返回码说明)
文件:/etc/keepalived/scripts/chk_http.sh

#!/usr/bin/env bash
# 说明:返回0成功,非0失败
URL="http://127.0.0.1/health"
CODE=$(curl -s -o /dev/null -w "%{http_code}" "$URL" || echo 000)

if [ "$CODE" = "200" ]; then
  exit 0
else
  # 记录失败原因,便于排错
  logger -t keepalived "health check failed, code=$CODE"
  exit 1
fi
# 授权与测试
chmod +x /etc/keepalived/scripts/chk_http.sh
/etc/keepalived/scripts/chk_http.sh; echo $?

5. 参数配置建议(场景化)
- 关键业务interval 1-2stimeout 1sfall 2-3rise 2-3weight -20~-50
- 普通业务interval 3-5stimeout 2sfall 2-3rise 2-3
- 多指标:端口存活 + 业务探活 + 存储可用,分配不同weight叠加。

6. 排错清单与命令(明确说明)
- 脚本未执行:路径/权限问题
bash ls -l /etc/keepalived/scripts/chk_http.sh
- 脚本执行但无效:检查返回码
bash /etc/keepalived/scripts/chk_http.sh; echo $?
- 切换不发生:优先级未低于对端
bash ip -4 addr show dev eth0 | grep 10.0.0.100
- 日志确认
bash journalctl -u keepalived --since "10 min ago" | tail -n 50

7. 练习题(含预期效果)
1. 将interval从2s改为1s,观察日志中的检查频率变化。
预期:日志出现频率增加,切换响应更快但更敏感。
2. 修改脚本让健康检查失败(返回1),观察VIP是否从MASTER漂移。
预期:MASTER优先级下降,VIP切换到BACKUP节点。
3. 增加一个磁盘挂载检查脚本,并设置weight -20
预期:当/data丢失时触发降级,综合优先级降低。

8. 常见误区
- 仅用进程检查忽略业务异常,导致“假存活”。
- interval过短、timeout过大导致并发堆积。
- 权重设置过小,检查失败无法触发切换。
- 脚本依赖外部资源导致健康检查与业务故障耦合。