Cassandra寫數(shù)據(jù)過程
Cassandra寫數(shù)據(jù)的速度非常快, 其原因就在于Cassandra是一個基于日志結構的存儲引擎, Cassandra對數(shù)據(jù)的操作全部采用append的方式. 當Cassandra的任何一個節(jié)點, 接收到寫請求時, 其寫數(shù)據(jù)的整個過程如下圖所示:

1. 將新記錄寫入CommitLog;
2. 將新紀錄寫入Memtable;
3. 在特定的時間, 將Memtable中的數(shù)據(jù)刷入到SSTables, 清空JVM Heap和CommitLog;
4. 在特定的時間, Cassandra Compaction將SSTables合并.
CommitLog
如上圖所示, 當Cassandra接收到寫請求時, 需要將數(shù)據(jù)寫入到Memtable中, 然而由于memtable是駐留在內(nèi)存中的, 為了防止節(jié)點故障后的數(shù)據(jù)丟失, Cassandra在將數(shù)據(jù)寫入到Memtable前, 會先將數(shù)據(jù)append到CommitLog中. 當節(jié)點從故障中恢復時, 會從CommitLog中讀取數(shù)據(jù).
關于CommitLog有兩個比較重要的配置項(在cassandra.yaml中):
commitlog_segment_space_in_mb
單個commitlog segment所能占用的最大空間
commitlog_total_space_in_mb
commitlog所能占用的總空間, 當commitlog占用的空間達到該值, 最舊的commitlog segment所對應的Memtable中的數(shù)據(jù)將被刷到SSTable中
當Memtable中的數(shù)據(jù)將被刷到SSTable后, 對應的commitlog segment會被標記為flushed, 并在稍后回收重用.
此外, 為了加快寫CommitLog的速度, Cassandra寫入commitlog的操作也不是每次寫請求就寫一次磁盤的, Cassandra提供了兩種寫入策略, periodic或者batch, 可配置commitlog_sync參數(shù)來實現(xiàn).
periodic
這是Cassandra的默認配置, 當寫請求出現(xiàn)時,Cassandra會先將需要寫入commitlog的數(shù)據(jù)先寫在內(nèi)存中, 每隔一段時間(commitlog_sync_period_in_ms, 默認是10000), Cassandra會將一個同步請求加入到一個隊列中, Cassandra會立即執(zhí)行該同步操作, 將數(shù)據(jù)同步到磁盤中(也就是commitlog).
batch
Cassandra會定時(commitlog_sync_batch_window_in_ms啥繁, 默認值50)將內(nèi)存中的數(shù)據(jù)批量寫入到磁盤中(也就是commitlog), 在每一次批量寫操作發(fā)出后, 并在該任務完成前, 向客戶端同步本次批量寫操作.
關于CommitLog有一個最佳實踐, 給Cassandra的commitlog和數(shù)據(jù)分配不同的磁盤(在cassandra.yaml中配置, 默認情況下commitlog和data都在目錄/var/lib/cassandra下), 減少磁頭的尋道時間.
memtable
memtable是一張駐留在內(nèi)存中的cql表:
-每一個節(jié)點上, 每一個keyspace下的cql表都對應著一個memtable
-memtable提供了較為快速的讀寫操作
-memtable所有寫數(shù)據(jù)都是append的形式
-memtable中的數(shù)據(jù)是按照token排序的, 關于這一點可用token函數(shù)來驗證, 如下圖所示.

Cssandra會在特定的時間, 將memtable中的數(shù)據(jù)刷到SSTable中, 當滿足下文中的任意條件時, 就會觸發(fā)該操作:
1. commitlog_total_space_in_mb(這一點已在前文提到過)
2. memtable_total_space_in_mb
當memtable占用的總空間超過memtable_total_space_in_mb(默認是jvm空間的1/3)時, 把最舊的commitlog segment所對應的Memtable中的數(shù)據(jù)刷到SSTable中
3. nodetool flush命令
關于Cssandra將memtable中的數(shù)據(jù)刷到SSTables,和SSTables的合并, 在一下篇繼續(xù)介紹.