12.1.4 健康检查与故障检测原理
健康检查与故障检测原理#
Keepalived 的健康检查由 vrrp 与 health-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/rise 或 interval,避免短暂抖动。
- 脚本不生效:确认脚本可执行、返回码正确(0=成功)。
- VRRP 报文不通:检查防火墙、组播/单播配置、网卡绑定。
8. 练习
1. 将 interval 从 2 改为 5,观察切换延迟变化。
2. 给脚本增加 weight -30,验证主机优先级降低后的选举结果。
3. 使用 curl -I 在脚本中检测关键字与状态码并验证效果。