普通哈希取模法
假设三万张图片,要均匀存在三个缓存服务器上
我们首先想到的是用哈希算法来使这些图片均匀分布在三个缓存服务器上
用取模算法(模3算法),求得三种结果分别为0, 1, 2
此时却是可以满足均匀分布
但是,一旦要新加入新的服务器,此时取模算法面临失效的情况
即以前已经存在缓存服务器上那些图片用新的模4算法,计算的哈希值与以前不同使得出现大面积图片未命中的情况(缓存雪崩)
改进哈希算法
为了解决上面面临的问题,我们需要模统一一个数,这样无论多少服务器加进来,图片经过取模运算取得的值都不会变,过程如下
每次插入新的图片时,经过取模运算计算出一个确定的环上位置,然后顺时针向前找距离最近的缓存服务器即为要插入的服务器,过程如下
当要加入新的服务器时,我们无需像前面那样大量调整图片存储位置,而只需将一部分不满足的图片放入新的服务器即可,如下所示,我们只需调整CD之间的原本在A服务器中调整到D服务器中
哈希偏斜
这种方案存在一个问题是,三个服务器经过哈希计算可能无法均匀分配在哈希环上,这就会导致其中几个服务器的缓存压力过大,无法实现负载均衡
虚拟节点
我们可以将ABC三个服务器设置为每个1W数量的虚拟节点,这样三万个虚拟节点经过哈希运算以后可以近似认为均匀分布在了的哈希环上
然后再按照前面那种方法找落在的地方顺时针下一个虚拟节点所属的服务器即为要插入的服务器