负载均衡与一致性哈希

一、负载均衡
1.应用场景:
假设有三台缓存服务器s0,s1,s2,同时有三万张图片需要缓存,最好图片可以均匀的缓存到服务器上,这样可以分担缓存的压力。
2.解决方法
对缓存下的键进行hash计算,哈希后的值是个整数,再用缓存服务器的数量对这个值进行取模计算,余数决定数据应该缓存到哪台服务器上。
hash(名称)%机器数=余数
在这里插入图片描述
3.缺陷
将缓存服务器增加至3-4台,由于服务器数量发生变化,导致不能正常访问缓存数据,而程序在无法在缓存中获得数据时,会向后端服务器请求数据,也就是大量缓存在同一时间失效,造成缓存血崩,缓存机制无法起到分担访问压力的作用,压力就转移到后端服务器,整个系统很有可能会被压垮,为了避免这些问题,就采用一致性哈希算法。
在这里插入图片描述
二、一致性hash算法
1.算法描述
假设依然有三台服务器A,B,C hash计算后对232取模,(32位系统一个指针4个字节,一个字节8位,4*8=32字节)有232个结点,从图片在hash环上的位置开始,沿顺时针查找,遇到的第一个服务器就是图片应该存放的缓存服务器,由于被缓存对象与服务器hash后的值是固定的,在服务器不变的情况下,若要访问图片,只需使用相同的算法,就可算出图片被缓存到那台服务器上,去对应的服务器上查找图片即可。
在这里插入图片描述

按照一致性哈希算法的规则,先将服务D映射到哈希环上,这样一部分图片按顺时针第一个遇到的服务器由A变成了D,也就是说,增加了一台服务器,会导致一小部分图片不可访问,但大部分图片都可以正常访问。
在这里插入图片描述
2.一致性哈希算法的优点
如果服务器数量发生改变,并不是所有的缓存都会失效,而是只有部分缓存会失效,仍然能够分担整个系统大部分的压力,而不至于所有的压力同一时间都集中到后端服务器上
3.缺陷:
哈希偏斜
三、哈希偏斜
1.描述
在实际的映射中,服务器映射到哈希环上很有可以是斜的,称为哈希偏斜,在hash环偏斜的情况下,大部分的缓存对象很有可能会缓存到一台服务器上。导致缓存分布极度不均匀,三台服务器没有被平均的使用,如果缓存数据较多的服务器失效,由于失效的缓存太多,在这种情况下,很有可能引起系统的故障,
2.解决方式:
要想均衡的将缓存分布到服务器上,要让服务器尽量的多,这样才能均匀的出现在哈希环上,解决方式是:增加虚拟节点
真实的服务器资源只要三台,但 可以根据现有的物理节点映射许多新的节点,比如:a->a1,a2……an,再将虚拟节点加入哈希环
引入虚拟节点后,虚拟节点越多,哈希环上的服务器节点就越多,缓存被均匀分布的概率就越大,这样就可以一定程度上减小哈希环偏斜带来的影响,在进行缓存读写时,可以先找到缓存对应的虚拟节点,再找到对应的真实节点,再进行缓存数据的存储和读取。
在这里插入图片描述

发布了93 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41431406/article/details/97615852