负载均衡之平滑的加权轮询算法

由于,实习期间开发项目时用到了这个算法,当时就研究了一段时间,现在趁此机会把我理解的总结一下。
背景:
  在某些特殊的权重下,加权轮询调度会生成不均匀的实例序列,这种不平滑的负载可能会使某些实例出现瞬时高负载的现象,导致系统存在宕机的风险。为了解决这个调度缺陷,就提出了 平滑加权轮询 调度算法。
这里举个例子:
为了说明平滑加权轮询调度的平滑性,使用以下 3 个特殊的权重实例来演示调度过程。

服务实例                           权重值
192.168.10.1:2202                    5
192.168.10.2:2202                    1
192.168.10.3:2202                    1
我们已经知道通过 加权轮询 算法调度后,会生成如下不均匀的调度序列。

请求                    选中的实例
1                    192.168.10.1:2202
2                    192.168.10.1:2202
3                    192.168.10.1:2202
4                    192.168.10.1:2202
5                    192.168.10.1:2202
6                    192.168.10.2:2202
7                    192.168.10.3:2202
接下来,我们就使用平滑加权轮询算法调度上述实例,看看生成的实例序列如何?

算法描述
假设有 N 台实例 S = {S1, S2, …, Sn},配置权重 W = {W1, W2, …, Wn},有效权重 CW = {CW1, CW2, …, CWn}。每个实例 i 除了存在一个配置权重 Wi 外,还存在一个当前有效权重 CWi,且 CWi 初始化为 Wi;指示变量 currentPos 表示当前选择的实例 ID,初始化为 -1;所有实例的配置权重和为 weightSum;

那么,调度算法可以描述为:
1、初始每个实例 i 的 当前有效权重 CWi 为 配置权重 Wi,并求得配置权重和 weightSum;
2、选出 当前有效权重 最大 的实例,将 当前有效权重 CWi 减去所有实例的 权重和 weightSum,且变量 currentPos 指向此位置;
3、将每个实例 i 的 当前有效权重 CWi 都加上 配置权重 Wi(注意在这里是(5,1,1));
4、取到变量 currentPos 指向的实例;
5、每次调度重复上述步骤 2、3、4;

上述 3 个服务,配置权重和 weightSum 为 7,其调度过程如下:
在这里插入图片描述
害怕你们看不懂我前边的叙述,简单的对这张图进行一下讲解,首先,我们设置的初始权重是5,1,1,依照平滑的加权轮询调度算法取权重中最大的5减去和weigSum = 7,其它权重不变,这时变成-2,1,1.得到选中后的当前权重。剩下每次都这样。下一个选中前的当前权重为上一个选中后的当前权重对应加上5,1,1(就是配置的权重)。
至于那个实例currentPos初始值为-1,加1为0代表调用一次就是192.168.10.1的调动,那么再加1为1就是192.168.10.2,再加1就是2,192.168.10.3的了。每次调动的实例选的是选中前当前权重的最大值对应的实例,比如请求1调用的就是192.168.10.1实例,再比如请求2也是192.168.10.1,请求3就变成权重中第一个最大的192.168.10.2.
  可以看出上述调度序列分散是非常均匀的,且第 8 次调度时当前有效权重值又回到 {0, 0, 0},实例的状态同初始状态一致,所以后续可以一直重复调度操作。
  感觉已经讲得非常清楚了,如果还有疑问给我留言吧。

发布了125 篇原创文章 · 获赞 155 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/m0_38101105/article/details/104332821