NGINX: 轮询调度、加权轮询调度、平滑加权轮询调度
轮询调度,NGINX 中的一种基本负载均衡策略,本篇会简要说明以下三种。
- 轮询调度
- 加权轮询调度
- 平滑加权轮询调度
调度算法
轮询调度
假如,轮询调度有三个回源节点 {a、b、c} ,三个回源节点在一次轮询过程中,都会被调用一次。

缺点:
不同回源节点的性能不一样,导致高性能的机器负载非常低,而低性能的机器负载非常高,因此需要考虑给不同的回源节点配置不同的权重,因此引出了 加权轮询调度。
加权轮询调度
假如,加权轮询调度有三个回源节点 {a:3、b:2、c:1},三个回源节点的权重分别为 3:2:1,权重越大调用的次数越多。
完成一次轮询,需要 六次 调用,回源节点调用的顺序为{a, a, a, b, b, c}。

缺点:
高权重节点在刚开始的时候会承受较大的压力,导致机器负载突然增高,而其它机器负载很低,因此整个轮询调用并不是很平滑。
平滑加权轮询调度
平滑加权轮询,轮询调用的次数分布和他们的权重一致,而且能够均匀的分布到不同的回源节点,且不会一段时间内集中到某一台权重比较高的回源节点上。
假如,平滑加权轮询有三个回源节点 {a:3、b:2、c:1},三个回源节点的权重分别为 3:2:1
完成一次轮询,需要 六次 调用,回源节点调用的顺序为 {a, b, a, c, b, a}。

平滑加权轮询调度过程
基本概念
- weight:配置文件中设置的权重值,整个过程不会改变
- current_weight:回源节点当前权重值,初始值等于0,在每轮选择中,该值最大的回源节点会被选中
- effective_weight:变化权重值,初始值等于weight,用于动态调整回源节点被选择的概率。
- total_weight:总的权重值。
计算过程
1、初始化:
a、weight 赋值为配置文件中的weight; b、current_weight赋值为0; c、effective_weight赋值为weight; d、total_weight为所有weight之和;
2、计算 current_weight
a、current_weight 加上回源节点对应的weight
3、选取回源节点
a、选取 current_weight值最大的回源节点接受本次调用 b、该回源节点的current_weight减去total_weight
4、重复步骤2和步骤3,重复的次数等于total_weight时,所有回源节点current_weight值为 0,此时结束一轮负载均衡。
a b c
0 0 0 (步骤1:初始化)
5 1 1 (步骤 2: 计算 current_weight, 步骤 3:选择回源节点。选择 a 节点,因权重最大)
-2 1 1 (步骤 3:回源节点减去总权重7)
3 2 2 (步骤 2: 计算 current_weight, 步骤 3:选择回源节点。选择 a 节点,因权重最大)
-4 2 2 (步骤 3:回源节点减去总权重7)
1 3 3 (服务器b被选中)
1 -4 3
6 -3 4 (服务器a被选中)
-1 -3 4
4 -2 5 (服务器c被选中)
4 -2 -2
9 -1 -1 (服务器a被选中)
2 -1 -1
7 0 0 (服务器a被选中)
0 0 0