一个简单的加权负载均衡算法

加权均衡

这里给出三个服务器 (a、b、c) 权重分别是 (1、2、4)。
按照直观理解,每7次请求中对a、b、c的请求应该是1、2、4.所以算法最终的结果应该是这样的情况。

算法说明:

  1. 在服务器数组S中,首先计算所有服务器权重的最大值max(S),以及所有服务器权重的最大公约数gcd(S)。
  2. index表示本次请求到来时,选择的服务器的索引,初始值为-1;current_weight表示当前调度的权值,初始值为max(S)。
  3. 当请求到来时,从index+1开始轮询服务器数组S,找到其中权重大于current_weight的第一个服务器,用于处理该请求。记录其索引到结果序列中。
  4. 在轮询服务器数组时,如果到达了数组末尾,则重新从头开始搜索,并且减小current_weight的值:current_weight -= gcd(S)。如果current_weight等于0,则将其重置为max(S)。

执行过程是这样的:

loop a b c choose
1 次 1 2 4 c
2 次 2 4 1 b
3 次 3 -1 5 c
4 次 4 1 2 a
5 次 -2 3 6 c
6 次 -1 5 3 b
7 次 0 0 7 c

so 这7次选择为 {c, b, c, a, c, b, c} 刚好符合期望。

简易代码如下:

#!/usr/bin/env python
# -*- utf-8 -*-

__server_val = {"a": 1, "b": 2, "c": 4}
server_dic = {"a": 1, "b": 2, "c": 4}


def select():
    return max(server_dic, key=lambda x: server_dic[x])


def update(val):
    for k, v in server_dic.items():
        if v == val:
            v -= 7
        server_dic[k] = v + __server_val[k]


idx = 0
while idx < 7:
    key = select()
    print("loop index: %d, info: a->%d, b->%d, c->%d, choose: %s"
          % (idx, server_dic["a"], server_dic["b"], server_dic["c"], key))
    update(server_dic[key])
    idx += 1

posted @ 2018-09-12 17:34  sinpo828  阅读(448)  评论(0编辑  收藏  举报