一致性哈希算法

什么是一致性哈希算法

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。

一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。

一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:

  • 平衡性(Balance)
  • 单调性(Monotonicity)
  • 分散性(Spread)
  • 负载(Load)

实现机制

一致哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中K是关键字的数量, n是槽位数量。

然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。

一致性哈希是将整个哈希值空间组织成一个虚拟的圆环,如假设哈希函数H的值空间为0-2^32-1(哈希值是32位无符号整形),整个哈希空间环如下:
一致性哈希算法_第1张图片
整个圆形按顺时针方向组织,0和2^32-1在零点中方向重合。把服务器按照IP或主机名作为关键字进行哈希,这样就能确定其在哈希环的位置。
一致性哈希算法_第2张图片
我们就可以使用哈希函数H计算值为key的数据在哈希环的具体位置h,根据h确定在环中的具体位置,从此位置沿顺时针滚动,遇到的第一台服务器就是其定位到的服务器。

例如我们有1、2、3、4四个数据对象,经过哈希计算后,落到环空间上的位置,再顺时针滚动即可定位到服务器位置

一致性哈希算法_第3张图片

容错和扩展

一致性哈希算法对于节点的增减都只需重定位换空间的一小部分即可,具有较好的容错性和可扩展性

容错性

如果某个节点宕机了,比如A节点宕机了,那么,数据1对应的节点保存到B中
所以,某个节点宕机后,干扰的只有前面的数据(原数据被保存到顺时针的下一个服务器),而不会干扰到其他的数据。
一致性哈希算法_第4张图片

扩展性

假如增加一台服务器D,原本数据2是保存到B中,但由于增加了D节点,数据2被保存到D中。干扰的也只有B而已,其他数据不会受到影响。

一致性哈希算法_第5张图片

虚拟节点

上面讲述的是节点较多和节点分布较为均衡的情况,如果节点较少就会出现节点分布不均衡造成数据倾斜问题。
一致性哈希算法_第6张图片
这样大多数数据都会落到节点A上面,造成倾斜问题

为了解决这种数据存储不平衡的问题,一致性哈希算法引入了虚拟节点机制,即对每个节点计算多个哈希值,每个计算结果位置都放置在对应节点中,这些节点称为虚拟节点。

具体做法可以在服务器IP或主机名的后面增加编号来实现,例如上面的情况,可以为每个服务节点增加4个虚拟节点,于是可以分为

  • C#D,映射到D节点的虚拟节点
  • B#A,映射到A节点的虚拟节点
  • E#D,映射到D节点的虚拟节点
  • F#A,映射到A节点的虚拟节点

这样就可以保证各个节点的数据比较均匀了,例如,数据7保存到虚拟节点C#D,实际上数据保存到D中。这样,就能解决服务节点少时数据不平均的问题。
一致性哈希算法_第7张图片
在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

你可能感兴趣的:(分布式微服务,哈希算法,分布式,一致性哈希)