一致性哈希(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.虚拟节点的引入为的是更好的均分服务器的压力,尽可能让所有节点来承担失效节点后的重新分配问题。



相关文章:

  • 2021-07-28
猜你喜欢
  • 2021-05-20
  • 2021-06-19
  • 2021-05-29
  • 2021-12-22
  • 2022-02-07
  • 2021-09-22
  • 2023-03-06
相关资源
相似解决方案