一致性哈希

因为NoSQL的兴起,一致性哈希也处处被人提起,主要用来处理分布式存储的负载问题。sql

下面简单介绍一下一致性哈希。假设咱们有一个0~232的圆环。全部的服务器节点分布在圆环上。以下图所示:服务器

接下来,咱们如何判断一个数据要分布到哪一个节点上呢?首先,计算一个数据的hash值,而后在圆环上找到这个值的位置,接下来顺时针日后找最近的结点。把数据存储到这个结点上。也就是说,一个结点存储的数据范围就是它前面的邻居结点到它之间的这段范围。如图中的箭头所示。负载均衡

dynamo中的一致性hash

因为普通的一致性hash在负载均衡上效果不是很好,Amazon的dynamo提出了一个改进版的一致性hash。nosql

在dynamo系统中,为每个物理结点定义了多个虚拟的结点。再把这些虚拟的结点分布到圆环上。分布式

这样子的好处是,若是有一个物理结点挂掉,那么这个结点的负载将分到多个物理结点了。若是新加一个物理结点,那么这个物理结点能够直接减小多个物理结点的负载。spa

假设咱们有A、B、C三台机器,而后将咱们的分区定义了12个。get

如上图所示,每一个区间表示一个物理结点所负责的数据范围。hash

若是咱们加入一个机器D,那么以下图所示,机器D替换掉的数据范围是原来ABC的一部分。固然,在机器D初始化的时候,咱们须要先从ABC把这些数据拷贝过来。pdf

这里没有提到dynamo中的数据复制的策略,有兴趣的能够本身看paperfile

参考

http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf

http://www.infoq.com/cn/articles/nosql-dynamo

http://bmlzf.intscan.org/?p=225

相关文章
相关标签/搜索