有圖有真相。
先上個圖。
這個圖總的意思就是說,
數據先寫入內存中的Memtable,Memtable達到條件後刷新到磁盤,保存爲SSTable,同一個CF的多個SSTable能夠合併(Compaction)以優化讀操做node
commit log -> memtable -> sstable -> compaction.
看起來彷佛有些麻煩,存個數據要這麼多彎彎繞,可是記得,兄弟們,如今是應付海量數據,同時有不少節點,因此必需要走這麼多彎路。算法
memtable是啥呢,所謂mem, mem,就是memory,內存,放在內存的table。
數據放內存有啥好處呢?
一個字: 快。
由於離CPU最近的,就是內存.優化
找數據的時候,先去內存裏找,找不到再去硬盤找。
從硬盤上找東西的時候,要注意一點,由於硬盤比較矯情。
很容易發生i/o block。編碼
爲了應付這個矯情,cassandra找了Bloom兄弟來幫忙。
有個算法叫 Bloom Filter,
能夠經過布隆過濾算法(Bloom Filter)減小對不可能包含查詢key的SSTable的讀取。server
說了半天,啥是SSTable呢?
你們夥能夠去本身硬盤上看一看:
排序
SSTable包含對應的三種文件
Datafile
按照Key排序順序保存的數據文件
文件名稱格式以下:ColumnFamilyName-序號-Data.db
Indexfile
保存每一個Key在Datafile中的位置偏移
文件名稱格式以下: ColumnFamilyName-序號-Filter.db
Filterfile
保存BloomFilter的Key查找樹
文件名稱格式以下: ColumnFamilyName-序號-index.db內存
你們夥實際看下,估計能有個感觀印象了。it
sstable多了也佔空間,麻煩,可使勁壓一壓,壓扁了,就不佔那麼大地兒了。
壓扁的過程,在cassandra裏面,叫compaction.io
一個CF可能有不少SSTable,系統會將多個SSTable合併排序後保存爲一個新的SSTable,稱之爲Compaction。
一次compaction最多請求合併32個SSTable,最少4個。超過32個則按時間排序分批進行(這兩個閾值能夠設置)。
若是空間不足,則嘗試去掉最大的SSTable再合併,若是連合並兩個最小的SSTable的空間都不足,則告警。
Major Comaction:合併CF的全部SSTable爲一個新的SSTable,同時執行垃圾數據(已標記刪除的數據tombstone)清理。
Minor Compaction:只合並大小差很少的SSTable,超過4個須要合併的SSTable就會自動觸發。
可經過nodetool compact命令手動觸發。
數據目錄最好保持50%以上的可用空間。table
就好像雷鋒作了好事,要寫在日記本上同樣,咱凡事都有個log文件。
cassandra也有一個,叫 commitlog.
Commitlog是server級別的,不是Column Family級別的,每個節點上的Commitlog都是統一管理。 每一個Commitlog文件的大小是固定的,稱之爲一個CommitlogSegment,目前版本(0.7.0)中,這個大小是128MB,硬編碼在代碼中。 當一個Commitlog文件寫滿之後,會新建一個的文件。 SSTable持久後不可變動,故Commitlog只用於Memtable的恢復,至關於Oracle的Instance Recovery。Cassandra不須要作Media Recover 當節點異常重啓後,將根據SSTable和Commitlog進行實例恢復,在內存中從新恢復出宕機前的Memtable。 當一個Commitlog文件對應的全部CF的Memtable都刷新到磁盤後,該Commitlog就再也不須要,系統會自動清除