负载均衡算法完全指南:从轮询到一致性哈希

系统梳理静态与动态负载均衡算法,涵盖轮询、随机、权重、IP Hash、一致性 Hash、最少连接、最快响应等,并对比 Nginx、Dubbo、Spring Cloud LoadBalancer 的实现差异。

$1.8k 字/约 8 min👁— views

import Chart from ‘…/…/components/Chart.vue’

export const weightedDistData = { labels: [‘节点 A (weight=3)’, ‘节点 B (weight=1)’, ‘节点 C (weight=2)’], datasets: [{ label: ‘请求占比 %’, data: [50, 16.7, 33.3], backgroundColor: [ ‘rgba(0,212,255,0.75)’, ‘rgba(255,0,170,0.75)’, ‘rgba(57,255,20,0.75)’, ], borderColor: [ ‘rgba(0,212,255,1)’, ‘rgba(255,0,170,1)’, ‘rgba(57,255,20,1)’, ], borderWidth: 1, }] }

export const weightedDistOptions = { plugins: { legend: { display: false }, tooltip: { callbacks: { label: (ctx) => ${ctx.raw}% } } }, scales: { x: { ticks: { color: ‘#8888aa’, font: { family: ‘JetBrains Mono’, size: 10 } }, grid: { color: ‘rgba(30,30,48,0.8)’ }, border: { display: false }, }, y: { min: 0, max: 60, ticks: { color: ‘#8888aa’, font: { family: ‘JetBrains Mono’, size: 10 }, callback: (v) => v + ‘%’ }, grid: { color: ‘rgba(30,30,48,0.8)’ }, border: { display: false }, } } }

export const algoSupportData = { labels: [‘轮询’, ‘加权轮询’, ‘随机’, ‘IP Hash’, ‘URL Hash’, ‘一致性Hash’, ‘最少连接’, ‘故障重试’], datasets: [ { label: ‘Nginx’, data: [5, 5, 5, 5, 5, 5, 5, 5], backgroundColor: ‘rgba(0,212,255,0.7)’, borderColor: ‘rgba(0,212,255,1)’, borderWidth: 1, borderRadius: 3, }, { label: ‘Dubbo’, data: [5, 5, 5, 0, 0, 5, 5, 5], backgroundColor: ‘rgba(57,255,20,0.7)’, borderColor: ‘rgba(57,255,20,1)’, borderWidth: 1, borderRadius: 3, }, { label: ‘Spring Cloud LB’, data: [5, 2, 5, 0, 0, 0, 0, 5], backgroundColor: ‘rgba(180,0,255,0.7)’, borderColor: ‘rgba(180,0,255,1)’, borderWidth: 1, borderRadius: 3, }, ] }

export const algoSupportOptions = { plugins: { legend: { labels: { color: ‘#c8c8d8’, font: { family: ‘JetBrains Mono’, size: 11 } } }, tooltip: { callbacks: { label: (ctx) => { const labels = [‘✖️ 不支持’, ‘’, ‘’, ‘’, ‘⚠️ 需自定义’, ‘✅ 支持’] return ${ctx.dataset.label}: ${ctx.raw === 5 ? '✅ 支持' : ctx.raw === 2 ? '⚠️ 需自定义' : '❌ 不支持'} } } } }, scales: { x: { ticks: { color: ‘#c8c8d8’, font: { family: ‘JetBrains Mono’, size: 9 }, maxRotation: 30 }, grid: { display: false }, border: { display: false }, }, y: { display: false, min: 0, max: 6, } } }

什么是负载均衡

负载均衡(Load Balancing)是指将客户端请求按照某种策略分发到多个后端服务节点,目标是:

  • 避免单点过载:防止某一节点 CPU/内存耗尽
  • 提升整体吞吐:充分利用集群资源
  • 容灾与高可用:节点故障时自动剔除,流量转移

负载均衡分为两大类:静态算法(不考虑节点实时状态)和动态算法(根据节点当前负载调度)。


静态负载均衡算法

1. 轮询(Round Robin)

最简单的算法:请求依次分发给每个节点,循环往复。

请求序列: 1  2  3  4  5  6
节点:     A  B  C  A  B  C

优点:实现简单,分布均匀(假设节点同质)
缺点:不考虑节点性能差异和请求处理时长

Nginx 配置

upstream backend {
    server 192.168.1.10;
    server 192.168.1.11;
    server 192.168.1.12;
    # 默认就是轮询
}

2. 随机(Random)

每次请求随机选择一个节点。大量请求下,统计上接近均匀分布。

优点:无状态,实现最简
缺点:小请求量时分布不均


3. 加权轮询(Weighted Round Robin)

根据节点处理能力分配权重,权重越高分得请求越多。

节点 A: weight=3, 节点 B: weight=1, 节点 C: weight=2
请求分配: A A A B C C A A A B C C ...

适用场景:集群中机器配置不均等(高配机器分更多流量)

upstream backend {
    server 192.168.1.10 weight=3;
    server 192.168.1.11 weight=1;
    server 192.168.1.12 weight=2;
}

weight=3:1:2 的实际请求分配比例:


4. IP Hash

对客户端 IP 取哈希,映射到固定节点。同一 IP 的请求始终路由到同一后端。

hash(client_ip) % server_count = 目标节点索引

优点:天然实现会话保持(Session Sticky),无需额外 Session 共享
缺点:节点增减时映射变化,大量 Session 失效;NAT 场景下多用户共享 IP 导致负载不均

upstream backend {
    ip_hash;
    server 192.168.1.10;
    server 192.168.1.11;
}

5. URL Hash

对请求 URL 取哈希,相同 URL 路由到同一节点。

适用场景:缓存服务器集群——同一资源固定落在同一节点,提升缓存命中率
缺点:热点 URL 可能导致某节点过载

upstream backend {
    hash $request_uri consistent;
    server 192.168.1.10;
    server 192.168.1.11;
}

6. 一致性哈希(Consistent Hashing)

普通哈希的问题:增减节点时,hash(key) % N 的 N 变化,几乎所有 key 都需要重新映射。

一致性哈希将所有节点和 key 映射到同一个圆环(0 ~ 2³²),key 顺时针找到的第一个节点即为目标节点。

          0
    ┌─────┼─────┐
  A(90°)  │   C(270°)
          │
        B(180°)

key_hash=120° → 顺时针 → C(270°)
key_hash=200° → 顺时针 → C(270°)
key_hash=300° → 顺时针 → A(90° + 360°)

优点:增减节点时只影响相邻区间,平均只有 1/N 的 key 需要迁移
缺点:节点少时容易分布不均;引入虚拟节点(每个物理节点映射多个点)可解决


动态负载均衡算法

7. 最少连接(Least Connections)

将新请求发送给当前活跃连接数最少的节点。

节点 A: 活跃连接 100  → 不选
节点 B: 活跃连接 20   → 选择
节点 C: 活跃连接 55   → 不选

优点:自适应节点处理能力,长连接场景效果好(如 WebSocket)
缺点:需要维护连接计数,有一定开销

upstream backend {
    least_conn;
    server 192.168.1.10;
    server 192.168.1.11;
}

8. 加权最少连接(Weighted Least Connections)

综合权重和当前连接数:score = connections / weight,选 score 最小的节点。


9. 最快响应时间(Fastest Response)

选择近期平均响应时间最短的节点。需要负载均衡器持续采集各节点的响应时间。

适用场景:节点间网络延迟差异大(如多机房混合部署)


10. 预测(Predictive)

基于历史响应时间和当前趋势预测节点下一时刻的负载,选择预测负载最低的节点。

F5 BIG-IP 等商用产品支持此算法。


11. QoS 感知调度

根据请求的服务等级(优先级)调度,高优先级请求优先发送到性能最好的节点。多用于混合业务场景(在线请求 vs 批处理任务)。


高级策略

灰度发布(Canary Release)

通过权重或请求头将少量流量(1%~10%)路由到新版本节点,验证无误后逐步扩大。

upstream backend {
    server prod.example.com  weight=9;
    server canary.example.com weight=1;
}

版本隔离

按请求头(如 X-Version)或 Cookie 将特定用户路由到指定版本,实现 AB 测试或内测。

故障隔离(Circuit Breaker)

节点连续失败超过阈值后,临时从轮询中摘除,避免雪崩。常与健康检查配合使用。


主流框架支持对比

⚠️ Netflix Ribbon 已于 2021 年进入维护模式,Spring Cloud 2020+ 默认切换为 Spring Cloud LoadBalancer。新项目不建议继续使用 Ribbon。

算法 Nginx Dubbo Spring Cloud LoadBalancer
轮询 ✅ 默认 RoundRobinLoadBalancer
加权轮询 weight ⚠️ 需自定义
随机 RandomLoadBalancer
IP Hash ip_hash
URL Hash hash $uri
一致性 Hash consistent
最少连接 least_conn LeastActiveLoadBalance
故障重试 proxy_next_upstream RetryLoadBalancer

三大框架算法支持对比:

注:条形高度表示支持程度:满格=支持,半格=需自定义,空=不支持。

选型建议

场景 推荐算法
无状态、同质节点 轮询 / 随机
节点配置差异大 加权轮询
需要 Session 保持 IP Hash 或 一致性 Hash
缓存集群 URL Hash + 一致性 Hash
长连接、异步任务 最少连接
多机房、跨地域 最快响应时间