Java 一致性 Hash 算法及测试标准差
概述
哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。
可以将hash算法分为普通hash算法和一致性hash算法(大家不要纠结这个分类,只是想说一致性hash算法在分布式中用哪种思想补充普通hash算法)
普通的hash算法在分布式应用中的不足:
比如,在分布式的存储系统中,要将数据存储到具体的节点上,如果我们采用普通的hash算法进行路由,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。
一致性hash算法提出了在动态变化的Cache环境中,哈希算法应该满足的均衡性,单调性,分散性和负载均衡
均衡性(Balance)
哈希的结果尽可能分布到所有的缓冲中,使所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
单调性(Monotonicity)
当缓冲区大小变化时,一致性哈希尽量保证已分配的内容不会被重新映射到新缓冲区。
分散性(Spread)
好的hash算法应该尽量保证相同的内容始终在同一个缓冲中,降低相同内容的分散性。
如果相同的内容被存储到不同的缓冲,这样降低了存储的效率。
负载(Load)
负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
注意:一致性hash算法,不是一定有虚拟节点,加上虚拟节点是为了保证均衡性,让所有的缓冲中的数据数尽量保持在一个水平线上。
节点代码
虚拟节点代码
一致性Hash算法代码
测试代码
测试截图
版权声明: 本文为 InfoQ 作者【A p7+】的原创文章。
原文链接:【http://xie.infoq.cn/article/e382238048a5a2764665c77b8】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论