Nginx负载均衡算法

目前只有思路,过两天上代码。。。。。。

加权轮询

服务器    权重

A     5

B     3

C     2

1)总的权重是10,先随机出一个数字(肯定是10以内的数字)

2)然后遍历权重的数组[5,3,2]一个一个的去比较

核心代码

         遍历ip 拿到权重weight

    if(offset<weight) return ip else offset=offset-weight

数形结合

权重坐标:

0————5——8—10

      A  B C

如果offset小于5就直接返回IP A

如果offset大于5 比如是7 就 用7减去当前的5得到offset=2

此时权重坐标是:

0——3—5

   B C

然后下次遍历2落在B的位置 直接返回IP B 

这种算法的好处和List相比 如果有个权重100 List需要放100个对象,而这种算法比较省空间

平衡加权轮询

服务器    权重

A     5

B     1

C     1

如果请求

AAAAABC对ABC三个服务器不够平衡

AABABAC 我们想要请求这个结果  Nginx 平衡加权轮询算法

这时我们需要增加一个动态权重变量 currentWeight

返回结果AABACAA 达到了平均加权轮询的目的,这个算法的过程写在图上面了,过两天上代码

一致性哈希

普通Hash算法

 假设我们有三台服务器 S1 S2 S3。我们有三万张图片据需要缓存到服务器上,这些数据最好均匀的分配到服务器上。

  1)hash(图片名称)%机器数=余数。 如果有三台服务器 取模的结果就是0 1 2 与服务器编号对应

  2)对同一条数据做相同的hash计算时得到的数据时不变的,访问图片的时候 对图片进行hash计算 就可以知道图片缓存在哪台服务器上

通过这种算法 就可以将三万张图片缓存在三台服务器上,而且下次访问图片时 就能直接计算出图片缓存在哪台服务器上,这种算法就是哈希算法

哈希算法缺陷:

  服务器从3台变成4台  hash(图片名称)%机器数(由3变成4) 得到的余数会发生变化,这里由于缓存服务器数量发生变化,导致不能正常访问缓存数据,大量缓存同一时间失效,导致缓存雪崩

改进:一致性Hash算法

  一致性Hash算法由一个哈希环组成 环上又2的32次方个点

  1)Hash(A)%2的32次方=结果,结果的值在0到2的32次方之间,可以把服务器A B C映射到哈希环上。

  2)用同样的方法 可以把要缓存的对象映射到哈希环上 Hash(图片名称)%2的32次方

  3)确定图片需要缓存在哪一台服务器上:图片位置 瞬时间旋转,遇到第一个服务器的位置,就是图片锁存放的缓存服务器

假设增加了一台服务器D 会有部分图片沿顺时针遇到的第一台缓存服务器就由服务器A变成了服务器D

这样 每增加一台服务器会有一小部分图片缓存失效,无法访问 大部分图片依然可以正常访问 避免了缓存雪崩

(如果ABC不是均匀的分散在Hash环上,距离很近)导致缓存分部极度不均匀 这就是Hash偏斜。解决办法:增加一层虚拟节点

  

 

具体进行缓存读写时:——>先找到虚拟节点——>虚拟节点在找到真实节点——>缓存的读取和存储

数据定位算法不变,只需要增加一步:虚拟节点到实际点的映射。

所以加入虚拟节点之后,即使在服务节点很少的情况下,也能做到数据的均匀分布。

 

posted @ 2020-08-25 01:16  palapala  阅读(166)  评论(0编辑  收藏  举报