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

如下皆为我的理解:java

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

问题:

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

解决办法:

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

这样作的问题很明显,破坏了hash的均匀性。分布式

改进一下:

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

 

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

 

一致性hash:

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

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

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

相关文章
相关标签/搜索