对于一致性Hash算法,我们先来了解一下Hash算法以及其使用的场景(分布式缓存场景),即目前我们服务器都是分布式部署的,假设现在有上万张的图片需要存储到我们的分布式缓存服务器中,此时我们希望这些图片尽可能均匀地分布在每一个服务器上,此时我们首先想到的是Hash算法。
我们假如此时存在三台服务器A,B,C,我们对于需要存储的图片key进行hash算法求出对应的hash值,然后使用hash % 服务器数量(此时为3) 求出余数,即为我们需要存储的服务器的id:
但是如果增加服务器的数量,由于此时服务器的增加,使得n发生变化,那么之前计算的结果,此时就会发生变化!!!导致不能访问到原来正确定位的数据,就会向数据库(后端服务器上)请求数据,从而发生缓存雪崩,后端服务器崩溃等问题。。。
解决方案:一致性算法
我们设置存在2的32次方的个点组成的hash圆环,此时我们我们将我们的服务A,B,C使用相同的hash算法,计算出对应的哈希值:hash(A),hash(B),hash©,此时将计算得到的hash值对我们的2^32进行取模计算,得到其在hash圆环上的对应的位置:
此时我们要存储的图片按照相同的hash算法计算出对应的hash值,然后也对2^32进行取模,找到圆环上对应存储的位置,接着按照顺时针查找,存储到遇到的第一个缓存服务器上,如图所示:
此时如果添加缓存服务器的个数,假设我们添加服务器D,计算其对应圆环的位置,假设如下图所示:
此时只存在一小部分的数据失效(图片访问到D缓存服务器上),需要重新从数据库中获取,大多数的缓存数据还是和增加缓存服务器之前保持一致性!!!