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:连续失败次数达到阈值后判定DOWN
  • rise:连续成功次数达到阈值后判定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

排错要点(含命令)#

  1. 检查端口连通性
nc -vz 10.0.0.21 8080
  1. 检查HAProxy配置语法
haproxy -c -f /etc/haproxy/haproxy.cfg
  1. 查看日志(是否出现 health check failed)
journalctl -u haproxy -n 200
  1. 确认健康检查URI是否返回200
curl -i http://10.0.0.21:8080/healthz
  1. 后端超时误判
    timeout connect/server 适当增大,与业务响应时延匹配。

练习(动手验证)#

  1. 配置一个HTTP后端,添加 /healthz 接口并使用 option httpchk 验证。
  2. 修改 fall1,观察后端一次超时即被摘除的影响。
  3. timeout server 设置为 1s,模拟慢响应服务,观察误判并恢复到合理值。

以上示例覆盖健康检查类型与工作原理,并通过命令、配置与排错实践验证检查行为。