分布式 系统扩容
来源:互联网 发布:剑雨江湖进阶数据宠物 编辑:程序博客网 时间: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是怎么做的(如下图:)
这个时候我们在这个环中加入一个节点md
当加入md的时候,我们就可以将,我们就可以将ma,mb,mc中的部分数据放到md中。从图中可以看出来,可能数据还不够均匀,其实这跟具体的一致性hash环有关的。而且当我们把数据切分得更细的时候,我们的数据也就更加的均匀,在增加节点的时候也就更加的方便。
对于想更加深入的了解一致性hash算法的同学,可以参考下面javaeye的一篇博客(http://www.javaeye.com/topic/684087
),上面有java版本的源码下载。
- 分布式 系统扩容
- 分布式数据库系统扩容时数据迁移问题的一点思考
- 可扩容分布式session方案
- 系统扩容心得
- 消息系统扩容处理
- Ubuntu系统扩容问题
- 系统c盘扩容
- AIX系统lv扩容
- ubuntu系统扩容
- 分布式文件存储系统fastDFS的扩容问题
- 系统重装--硬盘扩容--记录
- VirtualBox 上linux系统扩容
- 双系统下ubuntu系统扩容
- 树莓派扩容SD系统卡
- 分布式 分布式系统入门
- 扩容
- 分布式系统
- 分布式系统
- Android的MediaPlayer架构介绍
- 今天打开csdn一看,竟然一年多没有写自己的东西了
- 领导与管理之我见 文/谷雨霖
- 记录当年,展望来年
- 【技术心得】跟着二厶学编程---技巧---解决C#生成Excel慢的问题
- 分布式 系统扩容
- 为什么我们程序员难晋升
- SSH整合异常总结
- 可重入函数、信号安全、线程安全详解
- MYSQL存储引擎比较
- 可重入函数与非线程安全函数一览
- Session状态
- C语言和设计模式(中介者模式)
- 2012年开发者该做的11件事(转)