前言:
此刻各位老铁们对“一致性哈希 实现”大致比较着重,朋友们都想要了解一些“一致性哈希 实现”的相关文章。那么小编也在网络上网罗了一些有关“一致性哈希 实现””的相关资讯,希望看官们能喜欢,小伙伴们快快来了解一下吧!以实际案例来说,一致性哈希就是以服务器的IP或主机名和要保存到这些服务器上的数据的键名为关键字,通过哈希函数,将这些服务器和数据顺时针映射到一个虚拟的圆环上,以达到无论是增加服务器,还是减少服务器,原来已经保存到服务器上的数据,大部分都不会失效的目的。
举个例子,如上图,假设我们有A、B、C、D四个节点和数据对象,通过哈希函数计算后,它们在圆环上的位置像这样:
根据一致性哈希算法,我们可以知道,数据对象A将会被定为到节点A上,数据对象B将会被定为到节点B上,数据对象C将会被定为到节点C上,数据对象D将会被定为到节点D上。
现假设节点C不幸宕机,我们可以看到,此时数据对象A、B、D都不会受到影响,只有数据对象C会被重新定位到节点D上。
一般的,在一致性哈希算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器之间数据,而其它数据不会受到影响。
那如果现在在系统中增加一台服务器,结果又会是怎么样?
此时我们从图中可以看到数据对象 A、B、D都不会受到影响,只有数据对象C需要重定位到新的节点X上 。
一般的,在一致性哈希算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器之间数据,而其它数据也不会受到影响。
所以,如此看来,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。
不过,需要注意的是在一致性哈希算法中,服务节点不能太少,因为如果太少,可能会导致节点分布不均匀而造成数据倾斜。
比如,系统中只有两台服务器A和B,如下图所示:
此时必然造成大量数据集中到A上,而只有极少量会定位到B上。
为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。
具体做法,可以在服务器ip或主机名的后面增加编号来实现。比如,前面的情况,我们可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,形成六个虚拟节点:
由于数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如,定位到“Node A#1”、“Node A#2”、“Node A#3”三个虚拟节点的数据均定位到Node A上。
这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。
标签: #一致性哈希 实现