负载均衡算法总结

1.随机负载均衡

思路:

(1)用集合list或者set保存全部的资源。

(2)产生一个随机数。

(3)随机数在0-(list.size()-1) 返回之中

(4)返回list.get(随机数)

2.轮询负载均衡

思路:

(1)用集合list或者set保存全部的资源。

(2)初始化一个计数器num=0。

(3)得到本次的资源list.get((num+1) % (list.size()))

(4)更新计数器 num = num+1:

3.加权轮询负载均衡

为每个资源分配不同的权重例如A-3 B-2 C-1

请求次数 请求前 选中资源 请求后
1 {A-3 B-2 C-1} A {A-0 B-4 C-2}
2 {A-0 B-4 C 2} B {A-3 B-0 C-3}
3 {A-3 B-0 C-3} C {A-6 B-2 C- -2}
4 {A-6 B-2 C- -2} A {A-0 B-4 C- -1}

思路如下:

数据结构:

type WeightNode struct{
    addr    string
    weight      int //权重值
    currentWeight   int //节点当前权重值
    effectiveWeight int //有效权重
}

权重计算思路

1.选中最大的currentWeight节点为选中节点
2.所有节点权重重新计算:currentWeight = currentWeight + effectiveWeight
3.本次最大的节点权重:currentWeight = currentWeight - totalWeight

4.一致性HASH

评论一致性hash指标:

  • 单调性: hash值唯一。 增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它数据也不会受到影响 。

  • 平衡性:负载均衡。 客户端hash后的请求应该能够分散到不同的服务器上去。

  • 分散性: 相同内容被存储到不同缓冲中去,降低了系统存储的效率 。 好的哈希算法应该能够尽量避免不一致的情况发生,也就是尽量降低分散性。

使用Hash算法让固定的一部分请求落到同一台服务器上 。 而一致性的Hash算法是对2的32方取模 。 一致性Hash算法将整个Hash空间组织成一个虚拟的圆环,Hash函数的值空间为0 ~ 2^32 - 1(一个32位无符号整型)

数据和服务器都采用相同的hash算法计算出hash值,并且确定在hash环上的位置,数据hash位置沿着环顺时针查找,遇到的第一个服务器,那么就是缓存目标服务器。

一致性hash算法可能出现数据倾斜,引入虚拟节点来解决这个问题。对每个服务器多计算hash值,映射到环上的每个位置都表示该服务器,这样即使服务器数量少,也可以做到数据的均匀分布。

你可能感兴趣的:(数据结构)