版权声明: 本文由 一只博客 发表于 bloghome博客html
关于一致性哈希算法,网上有不少博文都有讲解。推荐2个。ide
http://blog.codinglabs.org/articles/consistent-hashing.htmlspa
http://blog.csdn.net/cywosp/article/details/23397179.net
总结一下:orm
网上博文的例子都将hash值的结果定义在0 - 232-1,实际上也是非必要的,你能够设定的比这个范围小,或者比这个范围大,都是能够的,重要的是它是一个环。htm
2.一致性哈希并不保证节点被映射的均衡性,假设哈希值是均衡的,那么节点要被均衡的映射,就必须让各个节点之间的距离相等,也就是说各个节点平分环的周长。blog
3.当存在故障节点后,一致性哈希并不保证故障节点上的值能经过算法恢复(除非已实现主备机制)ip
4.当故障节点被移除,故障节点的下一个节点的压力会增长(若是各个节点的压力是均衡的,那么压力增长1倍)。ci
5.当插入新节点,一致性哈希算法并不能避免从新hash步骤,可是不须要把全部的数据都从新hash一遍,只须要hash一部分。这种方式将hash的范围减到最小,仅仅是将新节点的前一个节点的一部分数据,归还给新节点。
6,当哈希算法的值不均衡时,环上的各个节点的压力也是不均衡的。能够采用添加虚拟节点的方式,使平衡。能够在热点节点的后面,插入多个虚拟节点,一旦映射落到虚拟节点上,再经过其余的hash算法,映射到压力较低的节点。采用的算法能够是简单粗暴,好比举个栗子:
以下图,在没有虚拟节点的时候,假设因为hash算法的不均衡性,落在节点4和节点5的hash值特别多,势必形成节点5的压力比较大,而此时若是节点6和节点2的压力有比较小,那么在节点4和节点5之间插入2个虚拟节点(节点a和节点b),根据一致性哈希的算法,节点a和节点5之间的hash值落到节点5上,节点a和节点b的hash值落在节点a上,节点b和节点4之间的hash落在节点b上。可是节点a和节点b是虚拟节点,所以能够强制的让节点a映射到节点6,节点b强制映射到节点2,这样,节点5的压力会减轻,从而使得全部节点负载相对均衡。
以上是一些总结,若有不对,欢迎指出纠正。