一致性hash(Consistent Hashing)

来源:互联网 发布:美颜摄像头软件下载 编辑:程序博客网 时间:2024/06/05 20:00

1、出现背景
有这样一种场景:有N台cache服务器,现在要将对象(object)均匀的分布在这些服务器上,该如何实现?通常,我们会采用hash(object)%N这样普通的hash算法来实现。咋一看,这样做并没有什么问题,但是,当服务器数量发生变化时,这种hash算法就显得不适用了。为什么,因为当N发生变化,则所有对象的映射关系都会发生变化,这也就意味着几乎所有的cache都失效了。
2、一致性hash的原理
为了解决上述存在的问题,一致性hash出现了。
在讲述一致性hash原理之前,首先要有衡量hash算法好坏的一些指标。这里主要说明一下单调性和平衡性。
单调性:单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。显然上述常规的hash算法不满足单调性。
平衡性:平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。
下面讲述一致性hash的实现:
(1)通常我们将value映射到一个32位的key值上,即0~2^32 - 1的地址空间,我们将该空间想象成一个首尾相连的环。如下图所示:
这里写图片描述
(2)通过hash算法将对象与cache都映射到环上(一般使用cache的IP地址作为hash输入),他们的分布如下图所示:
这里写图片描述
接下来就是如何将object映射到cache上了,一致性hash是这样规定的:在该环中,从对象的key值顺时针出发,遇到的第一个cache服务器就是该object的存储位置。所以,上图中object1存储在cacheA中,object2存储在cacheB中,object3、object4存储在cacheC中。
(3)当减少一个cahce服务器时,假设上图的cacheA宕机了,则object1顺时针走遇到的第一个服务器时cacheB,则object1会存储到cacheB中。当增加一个服务器时,如下图所示:
这里写图片描述
则object3会存储在新增的cahceD服务器中。
从上面可以看出,当增加或是减少cache服务器时,仅有少量的对象映射关系会发生变动,同时也满足单调性。
(4)平衡性
当cache服务器数量很少时,可能会出现数据集中在某一个服务器上,而其他的服务器则几乎没有数据存储,为了解决该问题,提出了虚拟节点的概念:虚拟节点时cache服务器的复制节点, 一个实际节点对应若干个虚拟节点。虚拟节点解决了什么问题呢?看下面的图解:
这里写图片描述
上图只有两个cache节点,显然cacheA存储了大量的数据,而cacheB只存储了少量的数据。为了解决这种不平衡性,我们引入两个虚拟节点cacheA1和cacheB1,如下图所示(理想情况):
这里写图片描述
这样,对象与节点间的映射关系就变成了:对象——>虚拟节点——>实际节点。
参考博文:http://blog.csdn.net/sparkliang/article/details/5279393

0 0
原创粉丝点击