一个简单的加权负载均衡算法
加权均衡
这里给出三个服务器 (a、b、c) 权重分别是 (1、2、4)。
按照直观理解,每7次请求中对a、b、c的请求应该是1、2、4.所以算法最终的结果应该是这样的情况。
算法说明:
- 在服务器数组S中,首先计算所有服务器权重的最大值max(S),以及所有服务器权重的最大公约数gcd(S)。
- index表示本次请求到来时,选择的服务器的索引,初始值为-1;current_weight表示当前调度的权值,初始值为max(S)。
- 当请求到来时,从index+1开始轮询服务器数组S,找到其中权重大于current_weight的第一个服务器,用于处理该请求。记录其索引到结果序列中。
- 在轮询服务器数组时,如果到达了数组末尾,则重新从头开始搜索,并且减小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