加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Cassandra源码学习:数据文件分布

发布时间:2020-12-13 13:46:48 所属栏目:百科 来源:网络整理
导读:概述 Cassandra写入数据流程是先将数据写入Commitlog中,然后写入内存Memtable中,当满足一定条件将内存中的数据刷入磁盘SSTable。 Cassandra需要两个目录来分别保存Commitlog和SSTable生成的文件,目录位置可以通过配置项修改: [html] view plain copy pri


概述

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

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

[html] view plain copy print ?
  1. data_file_directories:-/var/lib/cassandra/data
  2. commitlog_directory:/var/lib/cassandra/commitlog

Commitlog

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

SSTable

Memtable中记录一个列族的更新记录,当数据达到配置的容量上限,或者条数限制等条件时,会被写入SSTable中。SSTable会为每个keyspace建一个目录,默认会有一个system目录,供系统使用。
目录中每一次写入会生成3个文件
    User-e-1-Data.db
  1. User-e-1-Filter.db
  2. 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时也是比较麻烦的,所以在这里做了一个索引。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读