banner
约 300 字
1 分钟

用 HAProxy 做负载均衡与高可用

摘要

介绍 HAProxy 的负载均衡配置、常用算法(轮询/最少连接/源哈希/URI)、健康检查熔断、会话保持、ACL 路由与 stats 可观测,并对比 Nginx/LVS。

用 HAProxy 做负载均衡与高可用

引言

单台后端扛不住流量或怕单点故障时,就需要负载均衡。HAProxy 以高性能和极精细的健康检查著称,是四层(TCP)/七层(HTTP)均衡的经典选择,尤其适合对可用性要求严苛的场景。

一、最小配置

haproxy
frontend http_in
    bind *:80
    default_backend app_pool

backend app_pool
    balance roundrobin
    server app1 10.0.0.11:8080 check
    server app2 10.0.0.12:8080 check
    server app3 10.0.0.13:8080 check

balance roundrobin 表示轮询;check 开启对后端的健康检查。

二、负载均衡算法

  • roundrobin:轮流分发,默认且通用,权重可配。

  • leastconn:发给当前连接数最少的后端,适合长连接(如 WebSocket、数据库)。

  • source:按客户端 IP 哈希,保证同一用户落到同一后端(会话保持)。

  • uri:按请求 URI 哈希,适合缓存型场景。

  • random:随机,配合大型后端池表现好。

haproxy
backend app_pool
    balance leastconn
    server app1 10.0.0.11:8080 weight 3 check

三、健康检查与熔断

haproxy
server app1 10.0.0.11:8080 check inter 2000 rise 2 fall 3
  • inter 2000:每 2 秒探一次。

  • rise 2:连续 2 次成功才认为恢复。

  • fall 3:连续 3 次失败则摘掉该节点。

单台故障会被自动剔除,恢复后自动回流,从而实现高可用。还可针对 HTTP 做七层检查:

haproxy
option httpchk GET /healthz
http-check expect status 200

四、会话保持(Stickiness)

haproxy
backend app_pool
    stick-table type ip size 200k expire 30m
    stick on src
    server app1 10.0.0.11:8080 check

stick on src 把同一客户端 IP 绑定到固定后端,适合无法共享会话状态的应用。

五、ACL 与按路径路由

haproxy
frontend http_in
    bind *:80
    acl is_api path_beg /api
    use_backend api_pool if is_api
    default_backend web_pool

六、统计与可观测

haproxy
frontend stats
    bind *:8404
    stats enable
    stats uri /
    stats auth admin:changeme

通过 stats 页面能看到每个后端的实时状态、请求数与健康情况,排障非常方便。

七、与 Nginx / LVS 的取舍

维度

HAProxy

Nginx

LVS

层级

L4/L7

L7(主)

L4

健康检查

极精细

较弱(需模块/Plus)

依赖外部

场景

纯均衡、大并发

反代+Web 一体

超大流量入口

八、常见坑

  1. 后端没挂但被误摘:检查间隔与阈值是否过严。

  2. 会话不一致:有状态服务记得加 stickiness。

  3. 单点:HAProxy 本身也要做主备(keepalived + VRRP)。

小结

需要严肃的负载均衡与健康检查时,HAProxy 是首选。配合反向代理或 keepalived,就能搭出稳健的多实例高可用架构。下一篇我们深入代理协议本身:HTTP、HTTPS、SOCKS5 与透明代理。

延伸

  • HAProxy 官方《Configuration Manual》

  • 下一篇:《代理协议进阶:HTTP/HTTPS/SOCKS5 与透明代理》

END