Cassandra學習筆記之數據文件分佈

概述

Cassandra寫入數據流程是先將數據寫入Commitlog中,然後寫入內存Memtable中,當滿足一定條件將內存中的數據刷入磁盤SSTable。

Cassandra需要兩個目錄來分別保存Commitlog和SSTable生成的文件,目錄位置可以通過配置項修改:

data_file_directories:- /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog

Commitlog

由兩個部分組成,如下:
CommitLog-1396061983699.log
CommitLog-1396061983699.log.header
log文件中保存了每次更新操作,header文件記錄了哪些數據已經從Memtable中寫入SSTable中,head文件可以刪除垃圾日誌,節省空間。

SSTable

Memtable中記錄一個列族的更新記錄,當數據達到配置的容量上限,或者條數限制等條件時,會被寫入SSTable中。SSTable會爲每個keyspace建一個目錄,默認會有一個system目錄,供系統使用。
目錄中每一次寫入會生成3個文件
User-e-1-Data.db
User-e-1-Filter.db
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時也是比較麻煩的,所以在這裏做了一個索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章