一致性哈希算法(consistent hashing)

[b]consistent hashing由来?[/b]

最初由Karger等人设计。在麻省理工学院用作分布式缓存,现在已经扩大到其他领域。

[b]它被设计来解决hash的什么问题?[/b]

假设有m个对象需要被映射到n个node上,简单hash就求余映射hash(object)%n->node,就大致均匀的分布到n个node上了。可是问题在于如果n发生变化(多了或者少了),就必须重新计算保存对象存放到node,这代价未免有点大。consistent hashing就是用来解决这个问题。

[b]一般hash的问题在于,映射关系计算是个死的东西。所以consistent hashing就是要把对象和这个node和映射关系搞活一点。那么具体是怎么搞活的?[/b]

假设有个ring(环),hash(object)和hash(node)都在投影到这个ring上。
映射关系变成:hash(object)->hash(node),
->(映射关系):查找用的是在ring上顺时针查找,找到最近的hash(node),建立映射关系。
图大概就是这样子的:
[img]http://dl2.iteye.com/upload/attachment/0093/3268/efdbf4ab-bdd7-3382-9fe4-f9c163585b96.jpg[/img]
如果有个node被咔嚓剪了一个或者咔嚓多了一个,想象下hash(object)像精子一样顺时针沿着ring游动去找他的小伙伴,碰到最近的hash(node)就结合了。node不是很少的话,基本上只要很少的object需要重新寻找亲密小伙伴。


[b]图看着挺好看挺均匀挺和谐的,可是如果我只有两个node,而且好死不死,hash(node)后的值在ring上又紧挨着。。咋整?
[/b]
问题问的真好 :D ,node少不要怕,在天朝,啥都不知道,造假还有不知道的吗?对,就是造假,明明只有2个node,我们就整他100~1000个(假的成本毕竟低么),如果你胆大不怕查,你也可以多造点。真的node就叫node,假的就叫virtual node(简称vnode)。然后再维护个vnode->node就可以了。

[b]vnode搞越多,越均匀,越好么?[/b]

由于查找object所在的vnode需要O(n)步(n为vnode个数),运气不好,查到最后一个才找到,那就悲催了。

[b]consistent hashing可以用来干嘛呢?[/b]

大家都知道的分布式cache中常用这个算法。
还有在分布式文件系统中,为了使文件更加均匀的分布和减少node更变带来的影响,也常常会用到。
我想在分布式任务调度系统中,用来分发任务到zookeeper的znode上。这样加个znode或者挂掉个znode,也不用怕了。似乎和consistent hashing解决的典型问题是一样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值