首页 服务器技术 nginx

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  
相关推荐