由于NoSQL的兴起,一致性哈希也到处被人提起,主要用来处理分布式存储的负载问题。
下面简单介绍一下一致性哈希。假设我们有一个0~2的圆环。所有的服务器节点分布在圆环上。如下图所示:
接下来,我们如何判断一个数据要分布到哪个节点上呢?首先,计算一个数据的hash值,然后在圆环上找到这个值的位置,接下来顺时针往后找最近的结点。把数据存储到这个结点上。也就是说,一个结点存储的数据范围就是它前面的邻居结点到它之间的这段范围。如图中的箭头所示。
dynamo中的一致性hash
由于普通的一致性hash在负载均衡上效果不是很好,Amazon的dynamo提出了一个改进版的一致性hash。
在dynamo系统中,为每一个物理结点定义了多个虚拟的结点。再把这些虚拟的结点分布到圆环上。
这样子的好处是,如果有一个物理结点挂掉,那么这个结点的负载将分到多个物理结点了。如果新加一个物理结点,那么这个物理结点可以直接减少多个物理结点的负载。
假设我们有A、B、C三台机器,然后将我们的分区定义了12个。
如上图所示,每个区间表示一个物理结点所负责的数据范围。
如果我们加入一个机器D,那么如下图所示,机器D替换掉的数据范围是原来ABC的一部分。当然,在机器D初始化的时候,我们需要先从ABC把这些数据拷贝过来。
这里没有提到dynamo中的数据复制的策略,有兴趣的可以自己看paper
参考
http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf
http://www.infoq.com/cn/articles/nosql-dynamo
http://bmlzf.intscan.org/?p=225