一致性哈希原理与实现

来源:互联网 发布:c语言输出整数 编辑:程序博客网 时间:2024/06/10 06:46

写在前面

一致性哈希算法在实现集群软负载均衡时候可以使用。实现上感觉有点类似zookeeper关于共享锁和主从选择的算法。都是通过有序且唯一的节点来实现的。而虚拟化一致性哈希则采用了web架构中经常使用的“虚拟化”思路来实现。总的来说,一致性哈希非常迎合大型网站技术架构中“去状态同构 + 虚拟化”的思想。

一致性哈希

如果一致性哈希中机器节点和环上的节点是1对1的关系,则同构集群的伸缩性将收到很大影响,即以后加机器的时候,所影响的环区间都很有限。如下图所示:

这里写图片描述

新增机器对应的hash节点为图上黄点,可以看出新增机器时,其影响的范围只有hash环中的黄色区域。这显然无法达到我们谈论伸缩性中的通过增加机器来达到性能线性增长的目的。那怎么办呢?

虚拟化一致性哈希

答案就是,将哈希的过程虚拟化。主要有两种办法可以实现对该算法的虚拟化:

  1. 一个机器节点映射出一组哈希值。

如下图所示,这样每一个机器节点映射出来的一组哈希值,可以比较大程度的将机器应用到更多的请求中去。同时由于哈希出来的虚拟节点比较多,也比较大程度避免了某个机器宕机之后,压力过多压到相邻的机器节点上,从而导致雪崩的情况出现。

这里写图片描述

  1. 一个hash节点对应一个机器槽。

如下图所示,每一个hash节点都映射了一个机器槽,这样新增机器的时候,只需要将机器安插如对应的槽位中即可。如此也可实现集群的伸缩性。也可同样避免上述雪崩情况的出现。

这里写图片描述

前者是让hash节点与机器节点呈n对1的关系,而后者则相反。两者都能最大程度避免上述问题出现。说到哈希,多少都有碰撞概率,我们可以选择采用murmurhash算法来取代传统的MD5,从而最大程度降低碰撞概率。

延伸材料

具体的原理以及实现的相关资料可以参考相关资料:
一致性哈希原理
一致性哈希的JAVA实现(hash采用了murmurhash算法)

0 0
原创粉丝点击