一致性哈希算法——读后感
以下皆为个人理解:
一致性哈希是为了解决在分布式环境中,集群扩容(或者缩容)面临的一个问题。
问题:
如果原来集群由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的内容放进进去,而是放入的是引用)。
这样是不是好得多了,这样在每个虚拟节点中保存一份对物理服务器的映射
一致性hash:
一致性hash的算法,和上面类似,只不过是查找方法的不一样,
一致性hash事先分配一个2^32桶,然后首尾相连,构成一个环,把key hash到这个环中,同时也把服务器hash到这个环中,那么key和服务器都在这个环中,然后找出key对应的映射服务器则是把key顺时针搜索到的第一个服务器。
如果把一个服务器在这环中存在多个节点,每个他映射的节点就是一个他的虚拟节点
转载于:https://my.oschina.net/u/3039671/blog/794724