一致性哈希算法——读后感

以下皆为个人理解:

一致性哈希是为了解决在分布式环境中,集群扩容(或者缩容)面临的一个问题。

问题:

如果原来集群由4个服务器组成,若使用普通hash算法,可能就是按照 key%4 来hash,如果这个需要扩容,由4个服务器扩容到6个服务,那么就不得不把所有存储的内容拿出来重新hash(Java中hashMap就是这么做的)。显然这样做的成本太大。

解决办法:

1. 如果问题中的hash算法不是 %4 ,而是%(取模)一个很大的数,那么当扩容的时候,就不需要把所有存储的内容拿出来hash,例如原来是1,2,3,4号机器,现在进行扩容成6台。

160620_EG8L_3039671.png

这样做的问题很明显,破坏了hash的均匀性。

改进一下:

如果不直接把hash后的值不直接映射到机器上,而是在中间加一个虚拟节点(联想一下c中的指针或者java中的引用,例如java中的数组,每次增加的或者删除的时候,并不是真的把object的内容放进进去,而是放入的是引用)。

162739_FDCs_3039671.png

 

这样是不是好得多了,这样在每个虚拟节点中保存一份对物理服务器的映射

 

一致性hash:

一致性hash的算法,和上面类似,只不过是查找方法的不一样,

164054_LZ59_3039671.png

一致性hash事先分配一个2^32桶,然后首尾相连,构成一个环,把key hash到这个环中,同时也把服务器hash到这个环中,那么key和服务器都在这个环中,然后找出key对应的映射服务器则是把key顺时针搜索到的第一个服务器。

如果把一个服务器在这环中存在多个节点,每个他映射的节点就是一个他的虚拟节点

164601_VrKZ_3039671.png

转载于:https://my.oschina.net/u/3039671/blog/794724

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值