Cassandra1.1.0中Compaction部分源代码解析——准备篇
来源:互联网 发布:笔记本电脑怎么用淘宝 编辑:程序博客网 时间:2024/05/16 12:04
Cassandra目前已经发布了1.1.0,更新速度也还算可以,但是Cassandra屡屡被抛弃的事实,让我们不仅对它的前景表示担忧,好了不说废话了进入正题。写这部分动机一是对自己这段时间工作的总结,另外一个就是Cassandra使用者较少,很多的资料都是0.7以前的,希望这部分的内容能给大家带来帮助,当然更渴望大神给予指点。Ok,let’s go!
compaction是神马,为神马进行compaction
compaction翻译我有点乏力,姑且就叫做合并吧。其实意思就是将几个数据块合并成一个数据块,去掉不同数据块中重复的部分。compaction是在当前NoSQL的系统中都存在的一种机制,因为NoSQL系统都是没有更新和删除的操作,所有的这些操作都定位为写操作,因此数据中就会存在新、老和待删除的数据,因此Compaction的存在就合情合理了。
Cassandra中的compaction机制
Cassandra目前有两种类型的Compaction机制SizeTieredCompactionStrategy和LeveledCompactionStrategy,Cassandra1.0之前的使用的都是SizeTieredCompactionStrategy,1.0之后推出了LeveledCompactionStrategy,这是模仿LevelDB的一种实现。目前默认还是使用SizeTieredCompactionStrategy。
这两种Compaction机制的原理有不少的博文都讲过,我就不多说废话,简单的介绍一下。
1.1.0中SizeTieredCompactionStrategy具体实现方式是,将所有cfs的sstable按大小进行分组,将大小相似的sstable归为一组,这样就形成n个组(n>=1),再从这n个组中获取平均大小最小的一个组形成一个task进行compaction的操作。每组的大小必须在(4,32]的范围内,数量过多的组将进行截断。
LeveledCompactionStrategy具体的实现方式是,从最高的level上开始扫描是否需要进行compaction,如果有将该层的sstable形成一个task。优先对高层sstable优先进行compaction的好处是,能有效减少底层到高层compaction时合并的sstable的数目。有个特殊的地方是,level0层向level1层compaction的时候一个task最多包含32个sstable。
启动Compaction机制的入口
写这部分的目的,可能是个人习惯原因,总是有这样一种感觉,不知道事情怎么发生的就看着不踏实。
启动Compaction是在ColumnFamilyStore中,因为每一个cfs对应一种compaction机制。具体代码如下:
this.compactionStrategy = metadata.createCompactionStrategyInstance(this);try {//默认使用SizeTieredCompactionStrategy Constructor<? extends AbstractCompactionStrategy> constructor = compactionStrategyClass.getConstructor(new Class[] { ColumnFamilyStore.class, Map.class // options });//调用相关CompactionStrategy的构造函数进行初始化 return constructor.newInstance(cfs, compactionStrategyOptions); }
能够提交compaction任务(也就是能够调用submitBackground函数)的地方
一共有3个这样的地方:
(1) submitBackground自身,这是一个递归函数在执行一个task结束后会调用自己,这样做能够保证已经加入的sstable最终都能被合理的compaction。
(2) ColumnFamilyStore的addSSTable()函数中。
(3) ColumnFamilyStore中的replaceFlushed()函数,这个就是Memtable从内存刷出到磁盘过程中需要调用的一个函数,很明显当有新的sstable加入时,需要启动compaction的过程。
准备介绍完毕,后边开始源代码的解析。
- Cassandra1.1.0中Compaction部分源代码解析——准备篇
- cassandra1.1.0中Compaction部分源代码解析——LeveledCompactionStrategy
- 第四部分 为Cassandra1.0.x准备java运行环境
- Cassandra1.1.0中SizeTieredCompactionStrategy和LeveledCompactionStrategy的理解
- HBase Compaction解析
- hbase中compaction流程
- disksim raid 部分源代码解析
- HBase Minor&Major Compaction 解析
- 【转载】hbase中compaction流程
- 第二部分 关于Cassandra1.0.x节点间通讯《草稿》
- 第三部分 关于Cassandra1.0.x的数据分区
- 第五部分 安装Cassandra1.0.x的单实例模式
- leveldb代码阅读(14)——Level和Compaction
- Java源代码解析—Object
- Android系统源代码编译—[3]准备构建
- 准备篇--任务准备中
- Hbase中compaction的触发条件
- PHP—准备篇
- SQL Server: Why Scope_Identity() vs @@identity
- LDD3源码分析之ioctl操作
- C++语言复习六
- 如果可以后悔,世界会变成什么样
- toggle style menu contribution ,which is not persisted
- Cassandra1.1.0中Compaction部分源代码解析——准备篇
- 两阶段提交-2PC
- Fedora MP3播放
- POJ 1161并查集
- 从手机产品登录页面设计想到的
- 在VC下如何使用头文件unistd.h
- python-求在pi的方法 来自python cookbook上 just for fun
- C++模版编程——单链表的实现
- prototype.js 1.4版开发者手册(强烈推荐)