普通轮询
n:请求的编号 x:服务器数量 i:请求的服务器编号 i = n % x
加权轮询
最大公约数算法(Weighted Round-Robin, WRR)
随着每一轮遍历,降低“门槛”(Current Weight),只有权重大于等于当前门槛的服务器才能被选中,最大公约数是为了简化权重
权重 2:4:8 --> 1:2:4没区别
核心思路:
- 找出所有权重的最大公约数(GCD)。
- 将每个权重除以 GCD,得到“简化权重”。
- 每一轮调度中,每个服务器最多被选中与其简化权重相等的次数。
- 使用一个“当前权重计数器”(current_weight)从最大简化权重开始递减,每次选择权重 ≥ current_weight 的服务器。
- 当 current_weight 减到 0 时,重置为最大简化权重,继续下一轮。
缺点:
固定权重的分配完后才能轮到其他权重的
eg:
A:4
B:2
C:6
最大公约数 GCD(4,2,6) = 2
简化权重 = 2:1:3
最大简化权重 max_weight = max([2, 1, 3]) = 3
开始计算
初始化 current_weight = max_weight = 3
第一轮
门槛 current_weight = 3
2 - 1 - 3(符合)
设置 current_weight--
结果 6
第二轮
门槛 current_weight = 2
2(符合) - 1 - 3(符合)
设置 current_weight--
结果 4 6
第三轮
门槛 current_weight = 1
2(符合) - 1(符合) - 3(符合)
设置 current_weight--
结果 4 2 6
因此,最终结果是 6-4-6-4-2-6的顺序
第四轮(重置,循环)
门槛 current_weight = 0,重置成3
2 - 1 - 3(符合)
结果 6
可以看出来,最终6-4-6-4-2-6这种分布并不均匀,如果权重是4-2-1更明显,权重大的优先分配以后才轮到低权重的
平滑加权轮询算法(Smooth Weighted Round-Robin, SWRR)
核心思路:
每个服务器有两个权重值:weight:原始权重(不变),current_weight:当前权重cw(动态变化)
每次选择 cw 最大的服务器
计算累计当前 cw 为 tw
选中后:将该服务器的 cw 减去 tw
判断是否所有 cw 都是0,是则退出循环
否则每个服务器的 cw 都加上各自的 weight