负载均衡算法有哪些?
- 标签:负载均衡、Spring Cloud、微服务、后端
🏛 业务架构师
常见负载均衡算法按业务约束选:
- 轮询:依次分配——无状态、同质服务的默认;
- 加权轮询:按机器配置/容量分权重——混合配置集群(8 核与 16 核混部)的必要选择;
- 最少连接/最少活跃调用:把请求给当前最闲的节点——请求耗时不均的场景(有的 10ms 有的 10s,轮询会误判负载);
- 一致性哈希:同一 key(用户/订单)恒定落到同一节点——两个业务理由:会话保持(有状态服务)与缓存命中(本地缓存按节点分布);
- 随机:简单,海量请求下近似均匀。
架构视角的三层负载均衡体系(每层目标不同):
- DNS/CDN 层:地理就近——用户到哪个机房;
- 接入层(LVS/Nginx):四层/七层分发——跨实例均摊入口流量,七层可按业务路由(路径、灰度标签);
- 服务层(RPC 客户端负载均衡):注册中心列表 + 算法选择——客户端直连均衡是微服务的主流形态(少一跳接入层)。
两个实战要点:
- 一致性哈希的扩容代价:节点从 N 到 N+1,一致性哈希只迁移 ~1/N 的 key,普通取模则全量重分布——本地缓存场景扩容时,一致性哈希把缓存失效率从 100% 压到 1/N,业务抖动最小化,这是选它的核心理由;但要处理热点 key 打爆单节点(虚拟节点 + 热点二次打散);
- 健康检查与摘除:均衡的前提是列表健康——失败节点快速摘除(否则流量打到尸体上),配合优雅发布(先摘流量再重启)实现无损变更。
一句话:负载均衡 = 把流量按业务约束(状态、容量、健康度)分配的艺术——算法只是工具,约束分析才是架构。
🏗 系统架构师
负载均衡算法按层次(服务端/客户端/全局)与策略讲:
静态算法:
- 轮询(Round Robin):依次分发,实现简单;前提是实例性能相近——异构机器会失衡;
- 加权轮询(WRR):按机器配置(4C8G 权重 2,8C16G 权重 4)分配比例,平滑加权轮询避免集中命中;
- 随机 / 加权随机:大量请求下分布近似均匀,实现最简;
- 源地址哈希(IP Hash):同一客户端 IP 恒定到同一节点(会话保持);风险是热点 IP 与节点下线后的重分布(一致性哈希缓解)。
动态算法(感知节点状态,智能但复杂):
- 最少连接(Least Connections):优先发给当前连接最少的节点,长短请求混合场景比轮询均衡;
- 加权最少连接、最短响应时间(RT 感知)、最小活跃数(Dubbo 的 LeastActive:活跃调用数少=处理快,自动规避慢节点);
- 一致性哈希:节点增减只影响相邻区段(重映射 1/N),分布式缓存分片与带状态路由(用户固定到某节点)标配;虚拟节点抹平分布不均。
架构分层落地:DNS/GSLB(地理级)→ LVS/F5 四层(性能极高,ECMP 扩展)→ Nginx/网关 七层(upstream:轮询/least_conn/一致性哈希)→ RPC 客户端负载均衡(随机 + 最小活跃 + 一致性哈希)。
我的选型:无状态服务加权轮询足够;请求耗时差异大用最少连接/最小活跃数;有状态亲和需求用一致性哈希并规划好节点下线的重分布;健康检查剔除(被动失败摘除 + 主动探测)比算法本身更影响可用性。
💻 全栈开发专家
静态算法:
- 轮询:依次分发,最简单;默认假设机器同配。
- 加权轮询:按机器配置/性能分权重(8C16G 权重 2,4C8G 权重 1)。Nginx 平滑加权轮询避免"权重大的连收 3 个再轮别人"的毛刺。
- 随机 / 加权随机:实现最简,大量请求下趋近均匀。
- 源 IP Hash:同一 IP 恒定到同一节点——会话保持用,但节点变化会重分布。
动态算法(感知节点状态):
- 最少连接(least_conn):转发给当前连接最少的节点,处理耗时不均时比轮询公平;
- 最短响应时间、最少活跃调用(Dubbo 的 leastactive):请求快的多干。
一致性 Hash(重点):
- 普通 hash(
hash(node) % N)在节点增减时全量重映射; - 一致性 hash 把节点和 key 映射到 2^32 环上,key 顺时针找最近节点——节点变化只影响相邻区段;
- 虚拟节点解决数据倾斜(每物理节点裂 150+ 虚节点均匀撒环上)。
java
TreeMap<Long, String> ring; // hash -> node
// 查找:ceilingEntry(keyHash),环尾回绕到 firstEntry落地位置分层:DNS(地理级)→ LVS/Nginx(四层/七层)→ 网关(路由规则)→ RPC 客户端(spring cloud loadbalancer/Dubbo 内置)。我的选型:同构节点轮询/最少连接即可;有状态路由(用户粘滞、分片缓存命中)用一致性 hash + 虚拟节点。