13.5.1 健康检查类型与工作原理
健康检查用于评估后端服务器可用性并驱动故障转移。HAProxy提供TCP、HTTP、应用层自定义与外部脚本等检查类型,检查线程按固定间隔探测,结合超时与“连续成功/失败”阈值完成状态转换,从而决定是否摘除或恢复后端。
1) TCP连接检查(端口可达性)#
适用于任何TCP服务,成本低但无法验证业务逻辑。
# /etc/haproxy/haproxy.cfg
defaults
mode tcp
timeout connect 3s
timeout server 30s
timeout client 30s
backend bk_tcp_app
balance roundrobin
option tcp-check
default-server inter 2s fall 3 rise 2
server s1 10.0.0.11:9000 check
server s2 10.0.0.12:9000 check
验证与预期效果:
# 查看后端健康状态
echo "show stat" | socat stdio /run/haproxy/admin.sock | grep bk_tcp_app
# 预期:s1/s2 的 status 为 UP;若端口不可达则为 DOWN
2) HTTP健康检查(就绪/存活)#
通过HTTP请求判断业务是否就绪,可按状态码与内容匹配。
# /etc/haproxy/haproxy.cfg
defaults
mode http
option httplog
timeout connect 3s
timeout server 10s
timeout client 10s
backend bk_http_api
balance leastconn
option httpchk GET /healthz HTTP/1.1\r\nHost:\ api.example.com
http-check expect status 200
default-server inter 2s fall 3 rise 2
server s1 10.0.0.21:8080 check
server s2 10.0.0.22:8080 check
验证:
# 后端直接检查
curl -i http://10.0.0.21:8080/healthz
# 预期返回 HTTP/1.1 200
# HAProxy统计
echo "show stat" | socat stdio /run/haproxy/admin.sock | grep bk_http_api
3) 应用层自定义检查(示例:MySQL)#
通过发送探测报文验证服务可用性。
# /etc/haproxy/haproxy.cfg
defaults
mode tcp
timeout connect 3s
timeout server 10s
timeout client 10s
backend bk_mysql
option tcp-check
tcp-check connect
tcp-check send "SELECT 1;\r\n"
tcp-check expect string "1"
default-server inter 3s fall 3 rise 2
server db1 10.0.0.31:3306 check
server db2 10.0.0.32:3306 check
验证:
echo "show stat" | socat stdio /run/haproxy/admin.sock | grep bk_mysql
4) 外部脚本检查(高度定制)#
使用外部脚本返回码控制健康状态,需注意权限与执行开销。
# /etc/haproxy/haproxy.cfg
global
external-check
insecure-fork-wanted
backend bk_ext
option external-check
external-check command /etc/haproxy/checks/check_api.sh
server s1 10.0.0.41:9001 check
# /etc/haproxy/checks/check_api.sh
#!/usr/bin/env bash
# 0=UP, 非0=DOWN
curl -sf http://$HAPROXY_SERVER_ADDR:$HAPROXY_SERVER_PORT/readyz >/dev/null
exit $?
chmod +x /etc/haproxy/checks/check_api.sh
systemctl reload haproxy
故障判定与恢复阈值说明#
inter:检查间隔fall:连续失败次数达到阈值后判定DOWNrise:连续成功次数达到阈值后判定UP
示例:inter 2s fall 3 rise 2表示连续3次失败标记DOWN,连续2次成功标记UP。
安装与基础环境准备(示例)#
# Debian/Ubuntu
apt-get update && apt-get install -y haproxy socat curl
# RHEL/CentOS
yum install -y haproxy socat curl
systemctl enable --now haproxy
排错要点(含命令)#
- 检查端口连通性
nc -vz 10.0.0.21 8080
- 检查HAProxy配置语法
haproxy -c -f /etc/haproxy/haproxy.cfg
- 查看日志(是否出现 health check failed)
journalctl -u haproxy -n 200
- 确认健康检查URI是否返回200
curl -i http://10.0.0.21:8080/healthz
- 后端超时误判
将timeout connect/server适当增大,与业务响应时延匹配。
练习(动手验证)#
- 配置一个HTTP后端,添加
/healthz接口并使用option httpchk验证。 - 修改
fall为1,观察后端一次超时即被摘除的影响。 - 将
timeout server设置为1s,模拟慢响应服务,观察误判并恢复到合理值。
以上示例覆盖健康检查类型与工作原理,并通过命令、配置与排错实践验证检查行为。