开始
很多场景下都用hash来解决问题,避免了重复的检索.但是会出现一个问题,当服务器数量出现变动时(+&-),所有的位置都会发生改变.例如:redis的缓存等,这样会造成一段时间所有数据都失效,缓存雪崩随之发生.
过程
一致性Hash算法也是使用取模的方法,但不是对服务器的数量进行取模,而一致性Hash算法是对2^32取模.简单说,就是一致性hash算法将整个哈希值空间组织成一个虚拟的圆环,画图说话:
整个空间按照顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到232-1,也就是说0点左侧的第一个点代表232-1, 0和232-1在零点中方向重合,我们把这个由232个点组成的圆环称为Hash环
下一步将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置,这里假设将上文中四台服务器使用IP地址哈希后在环空间的位置如下:
接下来使用如下算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针寻找,第一台遇到的服务器就是其应该定位到的服务器!
例如我们有Object A,Object B,Object C,Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:
根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上.