一致性哈希

Hash算法是一种散列算法,总的来说,就是将不同规格的输入,经过散列算法计算后,给出相同规格的输出,理想情况下,相同的输入,输出相同,不同的输入,输出不同。Hash算法具备哈不可逆性和抗碰撞性,这也决定了它的应用领域。

Hash算法的应用有:

1、用作密码学中摘要算法,如MD4、MD5、SHA-1、SHA-2等都是典型的哈希算法,可用于文件完整性校验,数字签名。

2、检索数据

3、数据分片和分布式数据分片

其中的第三点就是我们今天要讨论的,在传统hash分片算法中,通常会和机器节点相关,一旦机器节点发生变化,数据落地的机器就会发生变化,之前落地的数据也要重新迁移,也即之前的映射关系全部都作废,这样扩容或缩容的成本很大。有了一致性哈希算法,就可以很大程度上降低这种扩容或缩容带来的映射关系改变。一致性哈希算法首次由麻省理工学院(MIT)的 David Karger 等6个人发布学术论文《Consistent hashing and random trees: distributed caching protocols for relieving hot spots on the World Wide Web(一致性哈希和随机树:用于缓解万维网上热点的分布式缓存协议)》提出,对于 K 个关键字和 n 个槽位(分布式系统中的节点)的哈希表,增减槽位后,平均只需对 K/n 个关键字重新映射。大大降低了扩容和缩容带来的映射关系变化影响。

衡量一致性哈希算法的指标有:

    平衡性(Balance)
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
    单调性(Monotonicity)
单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲区中去,而不会被映射到旧的缓冲集合中的其他缓冲区。简单的哈希算法往往不能满足单调性的要求,如最简单的线性哈希:x = (ax + b) mod (P),在上式中,P表示全部缓冲的大小。不难看出,当缓冲大小发生变化时(从P1到P2),原来所有的哈希结果均会发生变化,从而不满足单调性的要求。哈希结果的变化意味着当缓冲空间发生变化时,所有的映射关系需要在系统内全部更新。而在P2P系统内,缓冲的变化等价于Peer加入或退出系统,这一情况在P2P系统中会频繁发生,因此会带来极大计算和传输负荷。单调性就是要求哈希算法能够应对这种情况。
    分散性(Spread)
在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。
    负载(Load)
负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
    平滑性(Smoothness)
平滑性是指缓存服务器的数目平滑改变和缓存对象的平滑改变是一致的。

下面我们来说说一致性哈希的具体实现方案,一致性哈希算法要求输出值在0到2^32-1这个范围内,为了方便理解,我们将这些值想象均匀分布在一个圆环上:

服务器节点和缓存数据都作为输入经过一致性哈希算法得到输出,他们会平等的分布在这个圆上,然后我们将数据以顺时针方向方向划转,就能得出数据落地到哪个节点上了,结果如下图:

这里已经可以看出一致性哈希算法的优势了,如果节点数量发生变化,只会影响此节点到和逆时针方向第一个节点之间的数据,其他数据不会受到影响。另外,我们还要考虑节点是否分布均匀的问题,如果分布不均匀,那么节点数量变化时可能还是会应影响大量数据,所以可以引入虚拟节点,每个物理节点可以划分为多个虚拟节点,这样就能以一种简单的方式解决这个不均匀分布的问题了,结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值