一致性哈希原理与实现
来源:互联网 发布:c语言输出整数 编辑:程序博客网 时间:2024/06/10 06:46
写在前面
一致性哈希算法在实现集群软负载均衡时候可以使用。实现上感觉有点类似zookeeper关于共享锁和主从选择的算法。都是通过有序且唯一的节点来实现的。而虚拟化一致性哈希则采用了web架构中经常使用的“虚拟化”思路来实现。总的来说,一致性哈希非常迎合大型网站技术架构中“去状态同构 + 虚拟化”的思想。
一致性哈希
如果一致性哈希中机器节点和环上的节点是1对1的关系,则同构集群的伸缩性将收到很大影响,即以后加机器的时候,所影响的环区间都很有限。如下图所示:
新增机器对应的hash节点为图上黄点,可以看出新增机器时,其影响的范围只有hash环中的黄色区域。这显然无法达到我们谈论伸缩性中的通过增加机器来达到性能线性增长的目的。那怎么办呢?
虚拟化一致性哈希
答案就是,将哈希的过程虚拟化。主要有两种办法可以实现对该算法的虚拟化:
- 一个机器节点映射出一组哈希值。
如下图所示,这样每一个机器节点映射出来的一组哈希值,可以比较大程度的将机器应用到更多的请求中去。同时由于哈希出来的虚拟节点比较多,也比较大程度避免了某个机器宕机之后,压力过多压到相邻的机器节点上,从而导致雪崩的情况出现。
- 一个hash节点对应一个机器槽。
如下图所示,每一个hash节点都映射了一个机器槽,这样新增机器的时候,只需要将机器安插如对应的槽位中即可。如此也可实现集群的伸缩性。也可同样避免上述雪崩情况的出现。
前者是让hash节点与机器节点呈n对1的关系,而后者则相反。两者都能最大程度避免上述问题出现。说到哈希,多少都有碰撞概率,我们可以选择采用murmurhash算法来取代传统的MD5,从而最大程度降低碰撞概率。
延伸材料
具体的原理以及实现的相关资料可以参考相关资料:
一致性哈希原理
一致性哈希的JAVA实现(hash采用了murmurhash算法)
- 一致性哈希原理与实现
- 一致性哈希算法的原理与实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- PullToRrefresh自定义下拉刷新动画
- 【大型网站技术架构笔记】(四)伸缩性、可扩展性与安全
- Python字符串的encode与decode研究心得乱码问题解决方法
- Floyd算法求最短路问题
- 分布式锁的三种实现方式
- 一致性哈希原理与实现
- kidd风的IOS日志之触摸事件,手势识别,摇晃事件的详解
- spring-data-redis中的坑和误区
- DEA(数据包络分析)程序模板
- 为你的Android应用定制属于你的BaseActivity http://blog.csdn.net/jiahui524
- JVM学习笔记
- 将二叉树拆成链表 Flatten Binary Tree to Linked List
- 挨踢职场求生法则-----我在IT职场打滚超过15年了,从小小的程序员做到常务副总
- 判断int类型是否为空