概述
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目錄,供系統使用。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文件
Data文件
data文件中存儲的是真正的數據,其格式如下:
data文件不僅存儲了key對應的值,還對每個key保存了一份索引columnIdx。columnIdx也包含布隆過濾器和索引兩部分。cassandra中的行有寬行和窄行之分,寬行可能有上萬個column,要更新某一個column時也是比較麻煩的,所以在這裏做了一個索引。