跳转至

加权轮询#

摘自维基百科

“加权轮询旨在更好地处理具有不同处理能力的服务器。可以为每台服务器分配一个权重,也就是一个表示处理能力的整数值。权重高的服务器比权重小的服务器先接收新连接,权重高的服务器比权重小的服务器获得更多的连接,权重相等的服务器获得相同数量的连接。加权轮询调度的伪代码如下:

假设有一个服务器集S = {S0, S1, …, Sn-1}W(Si) 表示权重Sii 表示上次选择的服务器,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规则后,会根据服务器权重生成调度序列。网络连接根据调度顺序以轮询方式定向到不同的真实服务器。

当真实服务器的处理能力不同时,加权轮询调度比轮询更好。但是,如果请求的负载变化很大,则可能导致真实服务器之间的动态负载不均衡。简而言之,大多数需要大量响应的请求可能会被定向到同一台真实服务器上。

实际上,轮询是加权轮询调度的一个特殊实例,其中所有权重都是相等的。”