Cassandra Commitlog

转载 2016年05月30日 23:37:10

大致介绍了一下Cassandra的存储机制,通过将最新的写操作放在内存中的Memtable,然后定期刷新到磁盘持久化为 SSTable,Cassandra将随机写操作转换成了顺序写操作,这可以提升IO性能。

最新写入的脏数据是在内存Memtable表中,因此必须有机制来确保异常情况下,能够将内存中的数据恢复出来。和关系型数据库系统一 样,Cassandra也是采用的先写日志再写数据的方式,其日志称之为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/ArchitectureCommitLog


概述

Cassandra写入数据流程是先将数据写入Commitlog中,然后写入内存Memtable中,当满足一定条件将内存中的数据刷入磁盘SSTable。

Cassandra需要两个目录来分别保存Commitlog和SSTable生成的文件,目录位置可以通过配置项修改:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. data_file_directories:- /var/lib/cassandra/data  
  2. commitlog_directory: /var/lib/cassandra/commitlog  

Commitlog

由两个部分组成,如下:
[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. CommitLog-1396061983699.log  
  2. CommitLog-1396061983699.log.header  
log文件中保存了每次更新操作,header文件记录了哪些数据已经从Memtable中写入SSTable中,head文件可以删除垃圾日志,节省空间。

SSTable

Memtable中记录一个列族的更新记录,当数据达到配置的容量上限,或者条数限制等条件时,会被写入SSTable中。SSTable会为每个keyspace建一个目录,默认会有一个system目录,供系统使用。
目录中每一次写入会生成3个文件
[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. User-e-1-Data.db  
  2. User-e-1-Filter.db  
  3. User-e-1-Index.db  
其中,User表示ColumnFamily, e为版本标识,1代表这是User的第一个文件,每次刷入会增长。

Filter文件

filter文件中存放着一个布隆过滤器,可以快递判断一个key是否在data文件中。布隆过滤器是一种不确定性算法:如果通过布隆过滤器判断出这个key不在SSTable中,就一定不在;如果判断出在SSTable中,不一定在。通过布隆过滤器可以减少访问index文件的次数。

Index文件

Index文件保存data文件中每个key对应的位置:
 
index文件中的key是有序的,防止index文件非常大,查找一个key花费较大开销,cassandra做了一个内存缓存,记录部分key在index文件中的位置:

这个间距是可以调节的,要判断一个key在data中的位置先查询内存缓存,得到这个key在index文件中的位置,然后再定位到data文件位置。

Data文件

data文件中存储的是真正的数据,其格式如下:


data文件不仅存储了key对应的值,还对每个key保存了一份索引columnIdx。columnIdx也包含布隆过滤器和索引两部分。cassandra中的行有宽行和窄行之分,宽行可能有上万个column,要更新某一个column时也是比较麻烦的,所以在这里做了一个索引。

cassandra运维总结(不定期更新)

针对cql 而不是cli cassandra使用的版本  apache-cassandra-2.1.14 1 登录cql:  cqlsh -u username -p password  ...
  • u013202518
  • u013202518
  • 2016年07月31日 11:10
  • 979

分布式数据库的取舍——Cassandra的选择及其后果

分布式数据库的取舍——Cassandra的选择及其后果 作者: yangzhe1991 分类: 我是搞技术的 发布时间: 2015-10-07 20:02 ė 62条评论 想写的C...
  • jiafu1115
  • jiafu1115
  • 2017年01月13日 14:59
  • 555

Cassandra 集群部署

部署的服务器: 192.168.131.172 192.168.131.173 192.168.131.174 步骤:1 配置java运行环境 首先检查服务器上是否安装java运行环境,...
  • y_h_t
  • y_h_t
  • 2013年09月22日 15:38
  • 2838

走进cassandra之七:最终一致性

关于这个最终一致性,我们还是举打仗的那个例子。 一个师,下辖三个团,一个独立营。 大家知道,在战斗的时候,突发事件很多,时间也很紧迫。 来自师部的作战命令,可能没有办法及时到达各个营。 尤其是...
  • qinzhihu
  • qinzhihu
  • 2013年04月16日 11:08
  • 6329

我们为什么选择了Cassandra而没有用Hbase

前不久,我们决定用一款分布式的Nosql来存储一些频繁访问的用户数据,数据量较大。速度最快的是Redis,然而Redis由于集群的部署需要做额外的工作来保证数据的持久化,而单机数据量又不够大,所以我们...
  • bigmazhiyu
  • bigmazhiyu
  • 2015年07月29日 15:47
  • 4057

Cassandra 3.0数据修复机制

参考 https://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsRepairNodesTOC.html前提: 每个数据副...
  • qiaojialin
  • qiaojialin
  • 2017年04月07日 20:58
  • 1008

cassandra源代码总结

1. Org.apache.cassandra.dht包    a.接口RingPosition         public Token getToken();      public ...
  • u010912405
  • u010912405
  • 2014年11月01日 15:25
  • 933

cassandra学习笔记

cassandra学习一、简介http://cassandra.apache.org/doc/latest/ https://www.tutorialspoint.com/cassandra/cas...
  • zhengyong15984285623
  • zhengyong15984285623
  • 2016年12月12日 23:48
  • 1511

cassandra新增、更新、删除数据。

package client; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import jav...
  • wsxiaoqiaoliushui
  • wsxiaoqiaoliushui
  • 2014年02月24日 17:54
  • 3235

分布式消息队列RocketMQ与Kafka架构上的巨大差异之2 -- CommitLog与ConsumeQueue

在前面Rocket与Kafka的对比之“拨乱反正”续篇中,我们已经提到了RocketMQ和Kafka在架构上面的一个巨大差异:Kafka是每个partition对应一个文件,而RocketMQ是把所有...
  • chunlongyu
  • chunlongyu
  • 2017年01月16日 19:01
  • 2282
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Cassandra Commitlog
举报原因:
原因补充:

(最多只允许输入30个字)