分布式 系统扩容

来源:互联网 发布:剑雨江湖进阶数据宠物 编辑:程序博客网 时间:2024/05/28 23:11

http://blog.csdn.net/scutshuxue/article/details/6040869



记得在以前找工作的时候笔试时就遇到过类似这种问题,那个时候只知道普通hash取模,没做好这道题目,现在工作了之后,接触过一些类似的东西,对这个问题有点思路了,在这里抛砖引玉,写出来跟大家交流一下,写得不好欢迎拍砖。

假设:我们现在集群中有三台机器,标记为ma,mb,mc,假设现在每个机器的数据都是比较平均的。

一般做数据分布的时候一般用的都是hash算法,将主键(或者说是分布键)算出hash值,普通的就通过取模,分布到每一台机子上。现在我们又新增了一台机器md,我们现在为了数据平均,我们需要将ma,mb,mc的数据迁移到md上,但是如果是简单的取模操作的话,这个时候就需要把所有的数据重分布。ma,mb,mc上的全部数据都需要重新算hash值后取模放到相应的地方去。

这种做法无疑代价是很大的,我们能不能用只迁移一部分的数据呢?答案是肯定的。

1.普通的hash

现在ma,mb,mc各有1/3的数据。迁移后四台机器 (ma,mb,mc,md)应当平均具有1/4的数据。数据迁移量最小的方法就是分别迁移前三台机器的1/12,这样迁移的最优的。如果才能达到做到呢?其实很简单,我们之前做取模的时候,用一个较大的数就可以了。比方说1024,这样我们可以用一个配置表标记数据是如何分布的。

Count:(341,341,342)。

Machine:(ma,mb,mc)。

表示数模值为1-341的数据是在ma上,342-682的数据是在mb上。

如果我们增加了一台机器md。则配置修改为:

Count:   (256, 85,256, 85,256, 86)

Machine:(ma,md,mb,md,mc,md)

这样,我们只需要将ma中,257-341的数据迁移到md中,mb,mc的做法一样。为了能够快速取得这些数据,我们可以将hash值当成一个column存入数据库中。

2.一致性hash

一致性hash的出现也是为了解决这种问题的。

对于一致性hash不了解的可以参考网上的一篇博客:http://www.cnblogs.com/liunx/archive/2010/03/24/1693925.html。

在这片博客中用的一致性hash比较简单,分得太少了,其实他在做数据迁移的时候,其实也只是将一个节点拆分为两个,这样的话数据还是很不均匀的。为了在数据迁移的时候让数据更加的均匀,一般我们一致性hash是怎么做的(如下图:)

 hash0

这个时候我们在这个环中加入一个节点md

hash1

当加入md的时候,我们就可以将,我们就可以将ma,mb,mc中的部分数据放到md中。从图中可以看出来,可能数据还不够均匀,其实这跟具体的一致性hash环有关的。而且当我们把数据切分得更细的时候,我们的数据也就更加的均匀,在增加节点的时候也就更加的方便。

对于想更加深入的了解一致性hash算法的同学,可以参考下面javaeye的一篇博客(http://www.javaeye.com/topic/684087

),上面有java版本的源码下载。

原创粉丝点击