4. 连接调度核心算法与适用场景

负载均衡器收到一个连接请求后,必须从后端服务器集合中挑出一台来承接。这个“挑”的动作就是连接调度算法。算法决定了流量在真实服务器之间的分布形态,也决定了系统在节点故障、性能差异、会话保持等场景下的表现。本节围绕轮询、加权轮询、最少连接、加权最少连接、源地址哈希、一致性哈希、最快响应、随机与幂等调度展开,重点说明每种算法的判断依据、参数含义、适用条件,以及在同一批流量下它们会呈现怎样的分布差异。

静态调度:轮询与加权轮询

轮询(Round Robin,RR)是最直观的算法:维护一个指针,每来一个连接就按顺序指向下一台服务器,循环往复。假设后端有 A、B、C 三台,连接依次落到 A→B→C→A→B→C。它的前提假设是各服务器处理能力相近、当前负载相近。一旦三台机器配置不同,轮询就会把同样的连接数压给弱机,导致弱机先饱和。

加权轮询(Weighted Round Robin,WRR)用权重修正这一偏差。权重通常按 CPU 核数、内存、基准压测吞吐量来设定。例如 A、B、C 权重为 5:3:2,则每 10 个连接中 A 分 5 个、B 分 3 个、C 分 2 个。实现上常见两种:一是平滑加权轮询,每轮把“当前权重”加上静态权重、选中最大者、再减去总权重,使分配序列交错而非成块出现;二是普通加权轮询,按权重比例成批分配。平滑方式能避免同一台机器被连续打满,短连接场景下更稳。

轮询类算法不感知后端真实负载,属于静态调度。它们适合无状态服务、请求耗时接近、节点规格一致的场景,例如静态资源集群、同构的 API 网关层。

动态调度:最少连接与加权最少连接

最少连接(Least Connection,LC)不看权重,只看“当前活跃连接数”,把新连接交给活跃连接最少的那台。它天然适应请求耗时差异大的场景:慢请求会累积活跃连接数,算法自动把新流量引向空闲节点。判断依据是 active_connections,通常还配合慢启动,避免新上线节点瞬间被打满。

加权最少连接(Weighted Least Connection,WLC)把权重和活跃连接数结合,常用判据是 active_connections / weight 最小者胜出。这样既尊重节点能力差异,又反映实时负载。以 A(权重5)、B(权重3)、C(权重2) 为例,若当前活跃连接为 A=20、B=6、C=2,则比值分别为 4、2、1,新连接给 C。WLC 是生产环境中最常用的动态算法之一,适合长连接、请求耗时波动大、节点异构的集群。

同一批 100 个连接在六种算法下的分布对比(示例) 后端 A/B/C 权重 5:3:2,A 处理较慢,B、C 较快 算法 判断依据 A / B / C 分布 适用场景 轮询 RR 顺序指针 34 / 33 / 33 同构无状态 加权轮询 WRR 静态权重 50 / 30 / 20 异构、请求均匀 最少连接 LC 活跃连接数 22 / 39 / 39 长连接、耗时差异大 加权最少连接 WLC 连接数 / 权重 38 / 34 / 28 异构 + 动态负载 源地址哈希 SH hash(源IP) % N 依赖客户端分布 会话保持 一致性哈希 CH 哈希环 + 虚拟节点 节点增减迁移少 缓存、有状态 注:分布为教学示例,用于说明算法倾向;真实结果取决于请求耗时、连接时长与客户端分布。

哈希类调度:源地址哈希与一致性哈希

源地址哈希(Source Hash)对客户端源 IP 做哈希,再对后端数量取模,即 hash(src_ip) % N,结果决定落到哪台。同一客户端 IP 会稳定命中同一后端,实现会话保持,适合未做集中式会话存储的应用。它的风险在于:N 变化时几乎所有映射都会改变;且当大量客户端经同一 NAT 出口访问时,哈希会集中到少数节点,造成倾斜。

一致性哈希(Consistent Hashing)把后端节点和请求键都映射到一个哈希环上,请求顺时针找到第一个节点。节点增减时只影响相邻区间的键,迁移量约为 1/N,远小于取模方式。为缓解数据倾斜,通常为每个物理节点引入多个虚拟节点(如每台 100~200 个),使环上分布更均匀。一致性哈希适合缓存集群、有状态服务、需要减少节点变更引发缓存雪崩的场景。

响应与随机类调度

最快响应(Least Response Time / Fastest)综合响应时间和活跃连接数,优先选择响应最快且连接较少的节点。它需要负载均衡器持续探测或统计后端响应时延,对探测频率和统计窗口敏感,适合对延迟敏感的服务,但实现复杂、易受瞬时抖动影响。

随机(Random)按等概率挑选后端,实现简单、无状态、无需维护指针,在节点数量多且请求量足够大时,分布会趋近均匀。加权随机则按权重概率抽取。随机算法适合大规模无状态集群,能避免轮询指针带来的同步开销。

幂等调度强调同一请求重复投递到同一后端,或对同一业务键保持稳定映射,常与哈希类算法结合,用于重试、去重、订单处理等场景。它关注的不是“均匀”,而是“稳定”。

如何选择:从流量特征出发

选择算法时,先问四个问题:后端是否同构?请求耗时是否接近?是否需要会话保持?节点是否会频繁增减?同构、短请求、无状态,选轮询或随机;异构但请求均匀,选加权轮询;异构且耗时差异大,选加权最少连接;需要会话保持且节点稳定,选源地址哈希;需要会话保持且节点会扩缩容,选一致性哈希;对延迟极敏感,可评估最快响应。

实践建议:先用加权最少连接作为默认起点,再根据监控中的连接分布、响应时延和错误率做调整。任何算法上线前,都应在预发环境用真实流量比例验证分布是否符合预期。
注意:算法只决定“选谁”,不解决后端本身过载。若某节点健康检查通过但处理能力已耗尽,动态算法只能缓解,不能替代容量规划与限流。

真实流量下,算法效果最终体现在连接数分布、P99 时延和错误率上。建议在负载均衡器侧采集每台后端的活跃连接、新建连接速率和响应时间,按分钟粒度观察。若发现某台长期偏离权重比例,应检查健康检查、慢启动和会话保持配置,而不是频繁更换算法。