分布式系统---一致性hash算法

一、一致性hash算法在分布式系统中广泛应用广泛,像redis、memcached等分布式系统采用的都是一致性hash算法。

一致性hash算法的基本思想是将对象和和cache都映射到同一个hash数值空间(0~2^32-1)中,并且使用相同的hash算法。

接下来我们就来看一下它的实现。

二、

(1)首先,我们先理解一下环形hash空间。

通常hash算法都是将value映射在一个32位的key值中,我们把这个数轴卷起来,变成圆环,它的取值范围是0~2^32-1,这就时环形hash空间。


(2)接下来我们把对象映射到这个环形hash空间上。

比如我们取4个对象,Object1~Object4,通过hash函数计算出这些对象的hash值,比如key1=hash(Object1)等等,这些key值就落在了环形hash空间上:


(3)第三步,我们把cache映射到环形hash空间上

取3个cache,cacheA,cacheB,cacheC分别通过hash算法(和对对象做的hash算法是一样的算法)得到key值。keyA=hash(cacheA)等等:


对于cache的hash计算,一般取IP、机器名、端口等等。

(4)对象映射到cache:对象对应的key值按顺时针方向,找到第一个cache对应的key值,就存在上面。


(5)移除cache

接下来看一下一致性算法的精髓所在:当节点发生变动时,如何处理?

如果此时cacheB被删除,它只影响了key4,也就是影响了其与逆时针相邻cache之间的key。

而key4会用算法顺时针找到cacheC,存储在cacheC上,读取也在cacheC。


(6)增加cache

现在增加一个cacheD,它对应的keyD映射在key2、key3之间,那么对象的存储地址变为:


(7)hash倾斜性

上面所举的例子似乎太理想了:所有的cache分布都很均匀。而真正的实现中可能遇到这种情况:


这就是由于hash倾斜性导致的。

那么当对象key映射的时候会出现这种情况:



(8)虚拟节点

为了解决hash倾斜性,一致性hash算法引入了虚拟节点的概念。

比如下面举例,v1~v6都是虚拟节点,v1/v2通过hash算法映射到真实的node1节点,v3/v4映射到node2,v5/v6映射到node3。


首先Object通过hash算法映射到虚拟节点上,然后虚拟节点rehash到实际节点上。

如下,keyA对应的虚拟节点是keyA',keyB对应的虚拟节点是keyB',keyC对应的虚拟节点是keyC':


那么映射就变成如下,key2映射到keyC'上,keyC'映射到keyC上:


这就解决了hash倾斜性问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值