当前位置 博文首页 > 韩超的博客 (hanchao5272):四张图理解一致性哈希算法(Consisten
哈希算法:将任意长度的输入通过散列算法转换成固定长度的输出。
哈希算法是一种映射算法,将任意个数的输入映射为固定个数的哈希值。
分布式缓存
现有用户数据3000万,为提高访问速度,将用户基本信息保存在缓存中,其中:
key % 3
的哈希算法分配图片的存储位置。其他应用:
正常情况下,上述哈希算法是没有问题的。
但是,因为一些原因,需要增减服务器,这是必然导致哈希算法的变化,例如变为 key % 5
。
当哈希算法的模数发送变化时,原有的映射值几乎全部失效,需要重新映射几乎全部数据,这个工作量十分巨大。
缺陷总结:当增加或移除节点时,普通哈希算法几乎需要重新映射全部关键字。
一致性哈希算法能够在一定程度上解决上述缺陷。
一致性哈希
是一种特殊的哈希算法。
在使用一致哈希算法后,节点的改变平均只需要对K/N 个关键字重新映射,其中K是关键字的数量,N是节点数量。
下面分表讲述一致性哈希的几个关键问题:算法步骤、节点增减、哈希偏斜、虚拟节点。
哈希算法也是一种取模
算法,只是,模数固定为2^32
,也就是说哈希值范围:0
~ (2^31 - 1)
,如下图所示:
一致性哈希环:
一致性哈希环
,由2^32
个节点构成。。2^31-1
节点。一致性哈希算法:
ip % (2^32)
哈希,结果如图中绿色的点所示。key % (2^32)
哈希,结果如同种紫色的点所示。那么,一致性哈希算法,如何在一定程度上解决节点增减引起的问题呢?如下图所示:
节点增加:
节点D
至节点B
之间的key重新映射
至节点D
即可,图中只有1个key受此影响。节点减少:
节点A
至节点C
之间的key重新映射
至节点BB
即可,图中只有3个key受此影响。总结:(理想情况下)
新增节点内
至新增节点的上个节点
之间的key重新映射至新增节点
即可,共计(K/N)/2个key。移除节点
至移除节点的上个节点
之间的key重新映射至移除节点的下个节点
即可,共计(K/N)个key。讨论哈希问题,必然需要讨论哈希偏斜问题。下图就是一致性哈希偏斜的例子:
如图中所示:
那么,一致性哈希如何解决哈希偏斜问题,这就需要进入虚拟节点
的概念了。
下图就是增加了虚拟节点的一致性哈希环:
如图所示:
ip+number % (2^32)
。总结: