12.1.4 健康检查与故障检测原理

健康检查与故障检测原理#

Keepalived 的健康检查由 vrrphealth-checker 协同:health-checker 负责探测服务与链路,将状态反馈给 vrrp,vrrp 通过优先级变化触发选举与 VIP 漂移。

原理草图(健康检查→优先级变化→切换)

文章图片

1. 探测对象与方式
- 本地服务:Nginx/MySQL/HAProxy 端口或进程存活。
- 上游依赖:LVS RealServer 可达性与响应。
- 链路:网卡、网关连通性、VIP 可达性。
- 应用级:HTTP 状态码、响应内容关键字。

2. 关键参数与故障判定
- interval:探测间隔(秒)
- fall:连续失败次数达到阈值判定故障
- rise:连续成功次数达到阈值判定恢复
- weight:脚本探测后动态调整 VRRP 优先级

3. 示例:HTTP + 脚本双重探测

目标:Nginx 异常时降低优先级触发漂移;上游接口异常时先降级不切换。

# 安装(以 RHEL/CentOS 为例)
yum install -y keepalived curl

# 创建脚本:检查业务接口是否可用
cat >/etc/keepalived/check_api.sh <<'EOF'
#!/bin/bash
URL="http://127.0.0.1/healthz"
curl -fsS --max-time 2 "$URL" >/dev/null
exit $?
EOF
chmod +x /etc/keepalived/check_api.sh

配置文件 /etc/keepalived/keepalived.conf

global_defs {
    router_id LVS_01
}

vrrp_script chk_api {
    script "/etc/keepalived/check_api.sh"
    interval 2
    fall 3
    rise 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # HTTP 端口检查(Nginx)
    track_script {
        chk_api
    }

    virtual_ipaddress {
        192.168.10.100/24
    }
}

预期效果
- /healthz 连续失败 3 次后,优先级降低 20。
- 若备机优先级高于主机降低后的值,触发选举并漂移 VIP。
- 服务恢复 2 次成功后,优先级恢复。

4. 示例:TCP 端口探测 + LVS RealServer

virtual_server 10.0.0.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 10.0.0.11 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 1
        }
    }
}

命令解释
- delay_loop:健康检查间隔
- TCP_CHECK:TCP 三次握手判断存活

5. 故障触发与切换验证

# 查看 VRRP 状态与优先级变化
journalctl -u keepalived -f

# 模拟故障:停止 Nginx
systemctl stop nginx

# 验证 VIP 是否漂移(在备机执行)
ip addr show | grep 192.168.10.100

6. 排错与诊断命令(必会)

# 语法检查与配置定位
keepalived -t -f /etc/keepalived/keepalived.conf

# 实时观察 VRRP 报文(多播/单播)
tcpdump -i eth0 vrrp

# 查看脚本返回码
/etc/keepalived/check_api.sh; echo $?

# 查看实例状态
ip -d link show eth0

7. 常见问题与处理
- 频繁切换:增大 fall/riseinterval,避免短暂抖动。
- 脚本不生效:确认脚本可执行、返回码正确(0=成功)。
- VRRP 报文不通:检查防火墙、组播/单播配置、网卡绑定。

8. 练习
1. 将 interval 从 2 改为 5,观察切换延迟变化。
2. 给脚本增加 weight -30,验证主机优先级降低后的选举结果。
3. 使用 curl -I 在脚本中检测关键字与状态码并验证效果。