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偏斜。解决办法:增加一层虚拟节点
具体进行缓存读写时:——>先找到虚拟节点——>虚拟节点在找到真实节点——>缓存的读取和存储
数据定位算法不变,只需要增加一步:虚拟节点到实际点的映射。
所以加入虚拟节点之后,即使在服务节点很少的情况下,也能做到数据的均匀分布。