加权轮询#
摘自维基百科 ⧉:
“加权轮询旨在更好地处理具有不同处理能力的服务器。可以为每台服务器分配一个权重,也就是一个表示处理能力的整数值。权重高的服务器比权重小的服务器先接收新连接,权重高的服务器比权重小的服务器获得更多的连接,权重相等的服务器获得相同数量的连接。加权轮询调度的伪代码如下:
假设有一个服务器集S = {S0, S1, …, Sn-1}; W(Si) 表示权重Si; i 表示上次选择的服务器,i会初始化为-1; cw 是调度中的当前权重,cw会初始化为零; max(S) 是S中所有服务器的最大权重; gcd(S) 是S中所有服务器权重的最大公约数;
while (true) {
i = (i + 1) mod n;
if (i == 0) {
cw = cw - gcd(S);
if (cw <= 0) {
cw = max(S);
if (cw == 0)
return NULL;
}
}
if (W(Si) >= cw)
return Si;
}
例如,真实服务器A、B和C的权重分别为4、3、2,一个调度周期(mod sum(Wi))内的调度序列为AABABCABC。
在加权轮询调度的优化实现中,修改IPVS规则后,会根据服务器权重生成调度序列。网络连接根据调度顺序以轮询方式定向到不同的真实服务器。
当真实服务器的处理能力不同时,加权轮询调度比轮询更好。但是,如果请求的负载变化很大,则可能导致真实服务器之间的动态负载不均衡。简而言之,大多数需要大量响应的请求可能会被定向到同一台真实服务器上。
实际上,轮询是加权轮询调度的一个特殊实例,其中所有权重都是相等的。”