13.5.2 配置指令与参数详解

健康检查相关指令主要在 defaultsfrontendbackendlisten 段中定义,用于控制探测方式、频率、超时与故障判定。以下从常用指令、参数含义与组合实践进行详解,并给出可执行示例、排错与练习。

文章图片

1. 全局与默认级别的检查参数#

关键指令说明
- option httpchk [<method> <uri> [<version>]]:启用 HTTP 主动检查。
- option tcp-check:启用 TCP 脚本检查。
- default-server:统一设置 server 的检查参数。

完整示例(/etc/haproxy/haproxy.cfg)

global
  log /dev/log local0
  maxconn 50000

defaults
  mode http
  option httplog
  timeout connect 3s
  timeout client  30s
  timeout server  30s
  timeout check   2s
  retries 2
  option httpchk GET /health HTTP/1.1
  default-server inter 2000 rise 2 fall 3 slowstart 30s

命令解释与预期效果
- option httpchk GET /health:每 2s 请求 /health
- default-server inter 2000 rise 2 fall 3:连续 2 次成功即 UP,3 次失败即 DOWN。
- 预期效果:节点健康状态在 4~8 秒内完成切换。

2. server 级别的检查指令#

关键指令说明
- check:启用检查。
- inter/rise/fall/downinter/fastinter/port/backup:单节点定制。

示例(backend 配置)

backend web_pool
  balance roundrobin
  option httpchk GET /health HTTP/1.1
  http-check expect status 200
  server app1 10.0.0.11:8080 check inter 1500 rise 2 fall 2
  server app2 10.0.0.12:8080 check inter 1500 rise 2 fall 2 backup
  server app3 10.0.0.13:9090 check port 9090 inter 3000 rise 3 fall 2

命令解释与效果
- backup:app2 仅在主节点异常时接管流量。
- port 9090:检查端口与服务端口一致或可独立指定。

3. HTTP 检查相关参数#

示例:自定义 Host 与内容匹配

backend api_pool
  option httpchk GET /health HTTP/1.1\r\nHost:\ api.example.com
  http-check send meth GET uri /health ver HTTP/1.1 hdr Host api.example.com
  http-check expect status 200
  http-check expect rstring "OK"
  server api1 10.0.1.21:8080 check
  server api2 10.0.1.22:8080 check

解释
- http-check expect rstring "OK":响应内容包含 OK 才 UP。
- 若健康接口返回 404,可用 http-check disable-on-404 直接标记 DOWN。

4. TCP 检查脚本指令#

适用场景:MySQL/Redis/Kafka 等无 HTTP 探针的服务。

示例:Redis TCP 探测

backend redis_pool
  mode tcp
  option tcp-check
  tcp-check connect
  tcp-check send PING\r\n
  tcp-check expect string +PONG
  server r1 10.0.2.11:6379 check inter 2s rise 2 fall 2
  server r2 10.0.2.12:6379 check inter 2s rise 2 fall 2

验证命令

haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl reload haproxy

5. 超时与重试参数#

示例:低延迟业务

defaults
  timeout connect 1s
  timeout check   800ms
  retries 1

解释
- timeout check:单次检查等待时间。
- retries:连接失败后尝试次数,结合 fall 决定 DOWN 的速度。

6. 状态控制与权重#

示例:权重与手动禁用

backend payment_pool
  server pay1 10.0.3.11:8080 check weight 30
  server pay2 10.0.3.12:8080 check weight 70
  server pay3 10.0.3.13:8080 check disabled

操作命令(通过 stats socket 动态控制)

echo "enable server payment_pool/pay3" | socat stdio /run/haproxy/admin.sock
echo "disable server payment_pool/pay1" | socat stdio /run/haproxy/admin.sock

7. 监控与可视化相关#

启用统计页

listen stats
  bind *:8404
  mode http
  stats enable
  stats uri /stats
  stats refresh 5s

健康检查日志

defaults
  option log-health-checks

查看状态

curl -s http://127.0.0.1:8404/stats | head

8. 参数组合建议#

  • 快速故障发现
    cfg default-server inter 1000 fall 2 rise 3 timeout check 1s
  • 稳健型配置
    cfg default-server inter 3000 fall 3 rise 2 timeout check 2s
  • 应用层检查
    cfg option httpchk GET /health http-check expect status 200

9. 排错与验证步骤#

常见问题
- 健康检查一直 DOWN:检查 URI 是否返回 200,Host 头是否匹配。
- 误判频繁:检查 inter/falltimeout check 是否过小。
- 健康检查无响应:查看防火墙或安全组是否放行探测端口。

排错命令

# 1. 校验配置
haproxy -c -f /etc/haproxy/haproxy.cfg

# 2. 查看运行日志(Debian/Ubuntu)
journalctl -u haproxy -f

# 3. 直接探测后端
curl -v http://10.0.0.11:8080/health

10. 练习#

  1. 搭建 2 个 Nginx 后端,分别返回 OKDOWN,配置 http-check expect rstring "OK",验证流量仅进入健康节点。
  2. fall 从 3 改为 1,观察切换速度变化,并记录误判情况。
  3. stats 页面确认节点状态,并用 socat 手动禁用/启用节点。