【HAProxy 数据面】Backend / server / LB:算法、队列与连接复用边界
内容提要
本文深入解析HAProxy backend机制,涵盖负载均衡算法(如轮询、最少连接、哈希)在无粘滞会话时的选主逻辑;server maxconn限制并发连接,超出部分进入队列,超时或队列满则返回503;http-reuse策略控制连接复用;fullconn动态调整队列槽位,redispatch与backup实现故障转移。排障时需区分算法、队列、复用三层,并与Envoy进行对比分析。
延伸解读
选主路径:粘滞优先于算法
HAProxy 的 balance 算法并非总是生效。当 cookie、stick-table 或哈希粘滞命中时,请求会被钉在特定 server 上,算法仅作为无持久化信息或连接被重新分派时的回退路径。排障时若发现负载不均,应先确认是否存在粘滞命中,再检查算法配置,避免误判为算法失效。
503 的多种成因:队列与健康集合
收到 503 不一定代表上游进程崩溃。可能原因包括:server 的 maxconn 槽位长期不足导致队列超时、maxqueue 触发改派但无可用 server、或健康集合为空(全部 MAINT/check 失败)。排障时应先区分请求是否进入 backend、是否在队列中等待,再结合日志与 stats 计数定位具体环节。
连接复用:线程亲和与池边界
http-reuse 策略控制空闲连接复用,但受线程亲和限制:可复用的 backend 连接不会在任意线程间无锁横传,因此即使全局池中有空闲连接,当前线程也可能看不到兼容项而新建连接。这与 Envoy 每 Worker 分池类似,理解这一点有助于解释为何连接数可能高于预期。
动态权重与慢启动:机制而非故障
慢启动通过动态权重算法在 server 恢复后逐步提高权重,避免冷缓存或刚编译的应用被瞬时打满。它改变的是权重的时间函数,而非健康状态位。因此,在 check 变为 UP 后,可能出现“已 UP 但流量仍少”的窗口,这是机制预期行为,不应视为故障。
Q&A
HAProxy 中 backend 的负载均衡算法在什么情况下才会生效?
负载均衡算法只在没有持久化信息可用,或连接被重新分派到另一台 server 时才会生效。如果 cookie、stick-table 或哈希粘滞命中了目标 server,则会优先使用粘滞指定的 server,算法作为默认和回退路径。
HAProxy 中 server 的 maxconn 参数有什么作用?超过后会发生什么?
server 的 maxconn 参数限制并发连接数(HTTP 模式下为并发请求数)。当并发连接超过该值时,新请求会进入队列等待槽位。默认值为 0 表示不限制。如果队列也满了或等待超时,请求会失败并返回 503。
HAProxy 的 http-reuse 策略有哪些模式?默认是哪个?
http-reuse 有四种模式:never(不共享空闲连接)、safe(默认,会话首个请求总是使用自己的连接,后续请求可复用)、aggressive(允许更多首请求复用已证明可复用的连接)、always(最大程度复用)。默认是 safe。
HAProxy 中 timeout queue 和 maxqueue 分别控制什么?
timeout queue 控制请求在队列中等待槽位的最大时间,超时则丢弃并返回 503。maxqueue 限制每个 server 队列中最多等待的连接数,达到后新请求会被改派到其他 server(可能打断粘滞)。默认 maxqueue 为 0 表示不设上限。
HAProxy 中 backup server 的作用是什么?option allbackups 有什么效果?
backup server 在活跃 server 全部不可用时接替服务。option allbackups 开启后,当普通 server 全部挂掉时,会对所有 backup server 做负载均衡,而不是只使用第一台 backup。这改变了故障转移的模式,从单台接力变成 backup 池接盘。
HAProxy 中 fullconn 参数的作用是什么?
fullconn 用于描述 backend 负载爬坡的参考负载点。当 server 同时配置了 maxconn 和 minconn 时,server 的实际接受上限会在 minconn 和 maxconn 之间随 backend 并发连接数变化,fullconn 是达到 maxconn 的参考负载点。未配置时 HAProxy 会自动估算。目的是平常压低单机并发,高峰时再放开。
HAProxy 的 leastconn 算法适合什么场景?为什么短 HTTP 请求不适合默认使用?
leastconn 算法适合长会话场景,因为它会选择当前连接数最低的 server。对于短 HTTP 请求,连接持续时间短,连接数分布相对均匀,使用 leastconn 收益有限,轮询或 random 通常就足够了。文档明确 leastconn 更适合长会话。
HAProxy 与 Envoy 在连接池和并发限制方面有什么主要区别?
HAProxy 使用 server maxconn 加队列来限制并发,连接池通过 http-reuse 和 per-server 池实现,且线程亲和;Envoy 使用 circuit breaker 跨 Worker 共享限额,连接池是每 Worker 的。HAProxy 的被动摘除主要靠健康检查,Envoy 有 outlier detection 作为一等公民。