一致性哈希(consistent hashing)
首先,让我们了解一下一致性哈希解决了怎样的实际问题,
当我们有了N台服务器(cache)时,我们通常会采用如下的通用算法 将对象(object)均匀映射分配到服务器上,
hash(object)%N
试想一下,当其中的一台服务器down机了,或是添置一台服务器,那么通用的算法的映射公式将变成
hash(object)%(N+1) 或是 hash(object)%(N-1)
这就意味着几乎所有的服务器都失效了,这对于服务器而言是一场巨大的灾难,洪水般的访问将涌向后台的服务器,
而一致性哈希,可以解决以上问题。
一致性哈希是一种哈希算法,为的是在添加和删除cache时,极大的减小对已存在的映射关系的影响,尽可能的满足
单调性的要求
那么一致性哈希是如何做到的呢
如图,将object和cache一起映射到环上,沿顺时针方向就形成了如下的对应关系
object1->cacheA ,object2->cacheB ,object3->cacheB,object4->cacheB
现假设cacheA down机了 ,那么与之对应的object1只要连接到cacheB上即可,并不会影响到object2、object3
和object4
因此,当一台服务器挂掉,收到影响的对象仅是逆时针与之相连的对象,并不会影响到顺时针方向上的映射关系。
同样的,若添加服务器,影响到的也是服务器与服务器之间的一小部分的对象的连接。
如此一来就解决了,hash算法的改变从而产生的的后台服务器大规模的访问的爆发 这一问题。
当然,探讨到这可能会有细心的大佬发现,hash算法并不能保证均分连接访问的情况,
于是,一致性哈希引入了“虚拟节点“的概念,简单来说,就是物理节点在环形上的复制品,一个实际的物理节点可以
对应着若干个虚拟节点,如下图:
虚拟节点的引入使得本来连接在cacheB上的object2被映射到了A1上,因此实际连接到了物理服务器cacheA上,
均分了cacheB的压力。
总结:
1.一致性哈希解决了 通用哈希下一个节点失效导致所有节点失效的 巨大问题。尽可能减小了节点失效对已完成映射节点的影响。
2.虚拟节点的引入为的是更好的均分服务器的压力,尽可能让所有节点来承担失效节点后的重新分配问题。