加权轮询(wrr)是nginx默认负载均衡算法,通过动态更新current_weight实现按权重平滑分配请求;每轮将各server的current_weight加其weight,选最大者,再减total_weight,确保长期分布严格符合权重比。

加权轮询(Weighted Round Robin,WRR)是 Nginx 默认的 upstream 负载均衡算法,它在基础轮询基础上引入权重概念,让后端服务器按能力差异分担不同比例的请求。
核心原理:动态权重与当前权重衰减
Nginx 不是简单地按 weight 值循环累加,而是采用“当前权重(current_weight)”+“最大权重归零重置”的机制:
- 每台服务器初始 current_weight = weight(配置中指定的整数,如
weight=3) - 每次选 server 前,所有 server 的 current_weight 都加上其原始 weight
- 从中选出 current_weight 最大的那台作为本次调度目标
- 选中后,该 server 的 current_weight 减去所有 server 的 weight 总和(total_weight),其余不变
- 当一轮中某 server 的 current_weight 变为负数或过小,它会在后续轮次中被自然“跳过”,直到再次累积足够
这个设计保证了长期请求分布严格趋近于各 server 的 weight 占比,同时避免了固定周期内请求扎堆(比如连续发 3 个给 weight=3 的机器),实现更平滑的流量分配。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
举个实际例子
假设有三台后端:
server 10.0.1.10:8080 weight=3;server 10.0.1.11:8080 weight=1;server 10.0.1.12:8080 weight=2;
total_weight = 6。前 6 次调度的 current_weight 演变如下(简化展示):
| 10.0.1.10 (w=3) | 10.0.1.11 (w=1) | 10.0.1.12 (w=2) | 选中 | |
|---|---|---|---|---|
| 初始 | 3 | 1 | 2 | 10.0.1.10 |
| +weight 后 | 3+3=6 | 1+1=2 | 2+2=4 | |
| 选中后更新 | 6−6=0 | 2 | 4 | |
| 下轮 +weight | 0+3=3 | 2+1=3 | 4+2=6 | 10.0.1.12 |
| 再下轮 +weight | 3+3=6 | 3+1=4 | 6−6=0+2=2 | 10.0.1.10 |
可见:6 次请求中大致出现 3 次、1 次、2 次的分布,符合权重比 3:1:2。
和普通轮询、IP哈希的区别在哪
- 普通轮询(round_robin):不看 weight,只按 server 列表顺序轮流,所有节点等概率;Nginx 中未显式设 weight 时默认启用此模式(但底层仍走 WRR,weight 全为 1)
- IP 哈希(ip_hash):根据客户端 IP 做 hash,固定映射到某台后端,用于会话保持;不支持 weight 配置,且可能因 IP 分布不均导致负载倾斜
- 加权最少连接(least_conn):选当前活跃连接数最少的 server,适合长连接场景;weight 仅影响“相等连接数时的优先级”,不是主要调度依据
配置注意事项
- weight 必须是正整数,默认为 1;值越大,理论上承担请求越多
- weight 不影响健康检查逻辑,但会影响故障转移后的权重恢复行为
- 配合
max_fails和fail_timeout使用时,临时下线不会清空 current_weight,恢复后能快速承接流量 - 若需更精细控制(如按响应时间动态调权),需结合第三方模块(如 nginx-upstream-dynamic-servers)或改用 OpenResty










