数据服务器如何组织:设计时候保证高频中低频都有数量。否则就是忙的忙死闲的闲死
逻辑层服务器:增加和减少机器的时候代价很小
数据层服务器:增加和减少机器的时候代价是全量的
取模服务器个数的问题--缓存雪崩
取模 也可以 实现数据底层均匀分布,hash(图片名称)% N
当服务器数量发生改变时,所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端服务器请求数据,同理,假设3台缓存中突然有一台缓存服务器出现了故障,无法进行缓存,那么我们则需要将故障机器移除,但是如果移除了一台缓存服务器,那么缓存服务器数量从3台变为2台,如果想要访问一张图片,这张图片的缓存位置必定会发生改变,以前缓存的图片也会失去缓存的作用与意义,由于大量缓存在同一时间失效,造成了缓存的雪崩,此时前端缓存已经无法起到承担部分压力的作用,后端服务器将会承受巨大的压力,整个系统很有可能被压垮,所以,我们应该想办法不让这种情况发生,但是由于上述HASH算法本身的缘故,使用取模法进行缓存时,这种情况是无法避免的,为了解决这些问题,一致性哈希算法诞生了。
简单的对服务器数量进行取模,当缓存服务器数量发生变化时,会引起缓存的雪崩,可能会引起整体系统压力过大而崩溃(大量缓存同一时间失效)。
当缓存服务器数量发生变化时,几乎所有缓存的位置都会发生改变,怎样才能尽量减少受影响的缓存呢?
取模2^32组成环--缓存部分失效
取模法是对服务器的数量进行取模,而一致性哈希算法是对232取模。想象成一个圆,就像钟表一样,钟表的圆可以理解成由60个点组成的圆,而此处我们把这个圆想象成由232个点组成的圆。
圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到232-1,也就是说0点左侧的第一个点代表232-1。我们把这个由2的32次方个点组成的圆环称为hash环。
hash(服务器的IP地址) % 2^32,算出的结果一定是一个0到2^32-1之间的一个整数,我们就用算出的这个整数,代表服务器A
**hash(图片名称) % 2^32,****算出的结果是一个整数, **从所在位置开始,沿顺时针方向遇到的第一个服务器就是A服务器,所以,将会被缓存到服务器A上
B故障时候:原来在C的还在C不会数据迁移,原来在B的数据会迁移到C,新来的原本应该到B的也会去C,原来在A的还是在A不会数据迁移,影响的只有原来在B的数据要迁移到顺时针下一个节点上面去。
所以只有部分缓存会失效
hash环的偏斜
所有的服务器集中在某一段,所有的文件都会放在第一台,第一台失效的时候还是会雪崩。
由于我们只有3台服务器,当我们把服务器映射到hash环上的时候,很有可能出现hash环偏斜的情况
虚拟节点--解决偏斜
没有多余的真正的物理服务器节点,我们就只能将现有的物理节点通过虚拟的方法复制出来,这些由实际节点虚拟复制而来的节点被称为”虚拟节点”。
“虚拟节点”是”实际节点”(实际的物理服务器)在hash环上的复制品,一个实际节点可以对应多个虚拟节点。
虚拟节点越多,hash环上的节点就越多,缓存被均匀分布的概率就越大。
虚拟节点技术:按照比例来抢。
https://segmentfault.com/a/1190000021199728
https://www.zsythink.net/archives/1182