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 是生产环境中最常用的动态算法之一,适合长连接、请求耗时波动大、节点异构的集群。
哈希类调度:源地址哈希与一致性哈希
源地址哈希(Source Hash)对客户端源 IP 做哈希,再对后端数量取模,即 hash(src_ip) % N,结果决定落到哪台。同一客户端 IP 会稳定命中同一后端,实现会话保持,适合未做集中式会话存储的应用。它的风险在于:N 变化时几乎所有映射都会改变;且当大量客户端经同一 NAT 出口访问时,哈希会集中到少数节点,造成倾斜。
一致性哈希(Consistent Hashing)把后端节点和请求键都映射到一个哈希环上,请求顺时针找到第一个节点。节点增减时只影响相邻区间的键,迁移量约为 1/N,远小于取模方式。为缓解数据倾斜,通常为每个物理节点引入多个虚拟节点(如每台 100~200 个),使环上分布更均匀。一致性哈希适合缓存集群、有状态服务、需要减少节点变更引发缓存雪崩的场景。
响应与随机类调度
最快响应(Least Response Time / Fastest)综合响应时间和活跃连接数,优先选择响应最快且连接较少的节点。它需要负载均衡器持续探测或统计后端响应时延,对探测频率和统计窗口敏感,适合对延迟敏感的服务,但实现复杂、易受瞬时抖动影响。
随机(Random)按等概率挑选后端,实现简单、无状态、无需维护指针,在节点数量多且请求量足够大时,分布会趋近均匀。加权随机则按权重概率抽取。随机算法适合大规模无状态集群,能避免轮询指针带来的同步开销。
幂等调度强调同一请求重复投递到同一后端,或对同一业务键保持稳定映射,常与哈希类算法结合,用于重试、去重、订单处理等场景。它关注的不是“均匀”,而是“稳定”。
如何选择:从流量特征出发
选择算法时,先问四个问题:后端是否同构?请求耗时是否接近?是否需要会话保持?节点是否会频繁增减?同构、短请求、无状态,选轮询或随机;异构但请求均匀,选加权轮询;异构且耗时差异大,选加权最少连接;需要会话保持且节点稳定,选源地址哈希;需要会话保持且节点会扩缩容,选一致性哈希;对延迟极敏感,可评估最快响应。
真实流量下,算法效果最终体现在连接数分布、P99 时延和错误率上。建议在负载均衡器侧采集每台后端的活跃连接、新建连接速率和响应时间,按分钟粒度观察。若发现某台长期偏离权重比例,应检查健康检查、慢启动和会话保持配置,而不是频繁更换算法。