http://www.7klian.com

图解一致性哈希算法,看这文就够了!

可是,在漫衍式集群系统的负载平衡实现上,这种模子有两个问题:
这个算法已经被许多开源项目利用,好比libstdc++ (4.6版)、Perl、nginx (不早于1.0.1版)、Rubinius、 libmemcached、maatkit、Hadoop等。
进入主题前,先来一场告急刺激的模仿口试吧。
MurmurHash 是一种非加密型哈希函数,合用于一般的哈希检索操纵。由 Austin Appleby 在2008年发现,并呈现了多个变种,与其它风行的哈希函数对比,对付纪律性较强的键,MurmurHash的随机漫衍特征表示更精采。
6 % 2 = 0

前面我们阐明过,普通哈希算法当需要扩容增加处事节点的时候,会导致原油哈希映射大面积失效。此刻,我们来看下一致性哈希是如何办理这个问题的。
· 直接定址法:取要害字或要害字的某个线性函数值为散列地点,这个线性函数的界说多种多样,没有尺度。
如下图所示,假设 node2 节点宕机下线,则本来存储于 node2 的数据 value2 和 value5 ,只需按顺时针偏向选择新的存储节点 node0 存放即可,不会对其他节点数据发生影响。一致性哈希能把节点宕机造成的影响节制在顺时针相邻节点之间,制止对整个集群造成影响。

4 % 2 = 0
数据倾斜

节点雪崩

道理讲完了,来看看为什么这样的设计能办理上面普通哈希的两个问题。

如图所见,在这个例子中,仅仅删除了一个处事节点,也导致了哈希值的大面积更新,哈希值的更新也是意味着节点缓存数据的迁移(缓存数据暗示心好累)。
一致性哈希这个常识点不难,可是常常会考查到,就像布隆过滤器算法一样,没听过的人以为很高端,研究一下也就那么一回事,所以常识面要宽才气吊打口试官啊同学们!

1 % 4 = 1
假设新增了 1 个处事器节点,由本来的 3 个处事节点酿成 4 个节点编号 [0 – 3],哈希映射环境如下:
萌新:…
试想一下若缓存集群内的处事节点较量少,就像我们例子中的三个节点,而哈希环的空间又有很大(一般是 0 ~ 2^32),这会导致什么问题呢?
散列函数能使对一个数据序列的会见进程越发迅速有效,是一种空间换时间的算法,通过散列函数数据元素将被更快定位。

常见的哈希算法有MD5、CRC 、MurmurHash 等算法,简朴先容一下。
线上情况处事节点固然有各类高可用性担保,但照旧是有宕机的大概,纵然没有宕机也有缩容的需求。不管是宕机和缩容都可以归结为处事节点删除的环境,下面阐明下处事节点删除对负载平衡哈希值的影响。
假设删除 1 个处事器节点,由最初的 3 个处事节点酿成 2 个,节点编号 [0 – 1],哈希映射环境如下:
· 数字阐明法:假设要害字是以r为基的数,而且哈希表中大概呈现的要害字都是事先知道的,则可取要害字的若干数位构成哈希地点。

那该如何办理上述两个棘手的问题呢?可以通过「虚拟节点」的方法办理。

为了办理普通算法的扩展性和容错性问题引入一致性哈希算法,图解和举例阐明白一致性哈希是如何提高扩展性和容错性。最后粗拙的一致性哈希算法也存在数据倾斜和节点雪崩的问题,讲授了如何操作虚拟节点优化一致性哈希算法,办理数据倾斜和雪崩问题。至此,一致性哈希你学会了吗?

一句话归纳综合一致性哈希:就是普通取模哈希算法的改善版,哈希函数计较要领稳定,只不外是通过构建环状的 Hash 空间取代普通的线性 Hash 空间。详细做法如下:
MurmurHash
1 % 2 = 1

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。