Cassandra存储机制
来源:互联网 发布:access2007数据库下载 编辑:程序博客网 时间:2024/06/10 10:51
在2009年兴起的NoSQL运动中,Cassandra是其中重要的一个分布式key-value数据库产品,由Facebook在2008年开源,目前是Apache的顶级项目。最近twitter的一篇声明,表示将从MySQL迁移到Cassandra,更让其声名大振。Cassandra是结合了Google Bigtable的数据模型和Amazon Dynamo高可用框架的一个产品。其数据模型可以参考张瑞的blog。
1 Memtable/SSTable
因为SSTable数据不可更新,可能导致同一个Column Family的数据存储在多个SSTable中,这时查询数据时,需要去合并读取Column Family所有的SSTable和Memtable,这样到一个Column Family的数量很大的时候,可能导致查询效率严重下降。因此需要有一种机制能快速定位查询的Key落在哪些SSTable中,而不需要去读取合并所有的SSTable。Cassandra采用的是Bloom Filter算法,通过多个hash函数将key映射到一个位图中,来快速判断这个key属于哪个SSTable。关于Bloom Filter,有兴趣的可以去看看参考文章4,5和6。
为了避免大量SSTable带来的性能影响,Cassandra也提供一种定期将多个SSTable合并成一个新的SSTable的机制,因为每个SSTable中的key都是已经排序好的,因此只需要做一次合并排序就可以完成该任务,代价还是可以接受的。所以在Cassandra的数据存储目录中,可以看到三种类型的文件,格式类似于:
Column Family Name-序号-Data.db
Column Family Name-序号-Filter.db
Column Family Name-序号-index.db
其中Data.db文件是SSTable数据文件,SSTable是Sorted Strings Table的缩写,按照key排序后存储key/value键值字符串。index.db是索引文件,保存的是每个key在数据文件中的偏移位置,而Filter.db则是Bloom Filter算法生产的映射文件。
2 Commitlog
和Memtable/SSTable不一样的是,Commitlog是server级别的,不是Column Family级别的 。 每个Commitlog文件的大小是固定的,称之为一个Commitlog Segment,目前版本(0.5.1)中,这个大小是128MB,这是硬编码在代码(src/java/org/apache/cassandra /db/Commitlog.java)中的。当一个Commitlog文件写满以后,会新建一个的文件。当旧的Commitlog文件不再需要时,会自 动清除。
每个Commitlog文件(Segment)都有一个固定大小(大小根据Column Family的数目而定)的CommitlogHeader 结 构,其中有两个重要的数组,每一个Column Family在这两个数组中都存在一个对应的元素。其中一个是位图数组(BitSet dirty ),如果Column Family对应的Memtable中有脏数据,则置为1,否则为0,这在恢复的时候可以指出哪些Column Family是需要利用Commitlog进行恢复的。另外一个是整数数组(int[] lastFlushedAt ), 保存的是Column Family在上一次Flush时日志的偏移位置,恢复时则可以从这个位置读取Commitlog记录。通过这两个数组结构,Cassandra可以在异 常重启服务的时候根据持久化的SSTable和Commitlog重构内存中Memtable的内容,也就是类似Oracle等关系型数据库的实例恢复。
当Memtable flush到磁盘的SStable时,会将所有Commitlog文件的dirty数组对应的位清零,而在Commitlog达到大小限制创建新的文件 时,dirty数组会从上一个文件中继承过来。如果一个Commitlog文件的dirty数组全部被清零,则表示这个Commitlog在恢复的时候不 再需要,可以被清除。因此,在恢复的时候,所有的磁盘上存在的Commitlog文件都是需要的。
参考文章:
[1].http://wiki.apache.org/cassandra/ArchitectureOverview
[2].http://wiki.apache.org/cassandra/MemtableSSTable
[3].http://wiki.apache.org/cassandra/ArchitectureSSTable
[4].http://blog.csdn.net/jiaomeng/archive/2007/01/27/1495500.aspx
[5].http://www.hellodba.net/2009/04/bloom_filter.html
[6].http://www.googlechinablog.com/2007/07/bloom-filter.html
[7].http://labs.google.com/papers/bigtable.html
- Cassandra的存储机制
- Cassandra存储机制
- Cassandra存储机制
- Cassandra存储机制
- Cassandra存储机制
- memtable Cassandra存储机制
- 走进cassandra之五: 存储机制
- 走进cassandra之五:存储机制
- Cassandra维护最终一致性 和存储机制 分区策略
- Cassandra内部机制 - 技巧
- cassandra内部存储架构
- cassandra 存储原理
- 【Cassandra】数据存储原理
- Cassandra内部机制 : 读操作
- Cassandra简介及其压缩机制
- Cassandra 3.0数据修复机制
- cassandra的存储/更新/检索
- Cassandra 的数据存储结构
- 王爽《汇编语言》第2版学习心得与习题详解(第一章)
- sed 命令针对某一行进行替换操作
- 复习C++ 走一遍基础 留下笔记----{五}
- Spring框架学习笔记(4)--三种bean的实例化方法
- vmkctl.HostCtlException Unable to load module /usr/lib/vmware/vkmod/vmfs3: Failure
- Cassandra存储机制
- 有趣的问题
- 03-03 创建和编辑AutoCAD实体(三) 使用选择集(2)
- 牡丹江之行
- 韩遭史上最大规模黑客攻击 3500万客户信息泄露
- Day0
- memcached +php环境配置和分析
- QuickPart部署安装
- Shell 小技巧 获取文件后缀名的方式