Cassandra write path(1)

Cassandra寫數據過程

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

enter image description here
enter image description here
1. 將新記錄寫入CommitLog;
2. 將新紀錄寫入Memtable;
3. 在特定的時間, 將Memtable中的數據刷入到SSTables, 清空JVM Heap和CommitLog;
4. 在特定的時間, Cassandra Compaction將SSTables合并.

CommitLog

如上圖所示, 當Cassandra接收到寫請求時, 需要將數據寫入到Memtable中, 然而由于memtable是駐留在內存中的, 為了防止節點故障后的數據丟失, Cassandra在將數據寫入到Memtable前, 會先將數據append到CommitLog中. 當節點從故障中恢復時, 會從CommitLog中讀取數據.
關于CommitLog有兩個比較重要的配置項(在cassandra.yaml中):

commitlog_segment_space_in_mb
    單個commitlog segment所能占用的最大空間
commitlog_total_space_in_mb
    commitlog所能占用的總空間, 當commitlog占用的空間達到該值, 最舊的commitlog segment所對應的Memtable中的數據將被刷到SSTable中

當Memtable中的數據將被刷到SSTable后, 對應的commitlog segment會被標記為flushed, 并在稍后回收重用.

此外, 為了加快寫CommitLog的速度, Cassandra寫入commitlog的操作也不是每次寫請求就寫一次磁盤的, Cassandra提供了兩種寫入策略, periodic或者batch, 可配置commitlog_sync參數來實現.

periodic
    這是Cassandra的默認配置, 當寫請求出現時,Cassandra會先將需要寫入commitlog的數據先寫在內存中, 每隔一段時間(commitlog_sync_period_in_ms, 默認是10000), Cassandra會將一個同步請求加入到一個隊列中, Cassandra會立即執行該同步操作, 將數據同步到磁盤中(也就是commitlog).
batch
    Cassandra會定時(commitlog_sync_batch_window_in_ms, 默認值50)將內存中的數據批量寫入到磁盤中(也就是commitlog), 在每一次批量寫操作發出后, 并在該任務完成前, 向客戶端同步本次批量寫操作.
    

關于CommitLog有一個最佳實踐, 給Cassandra的commitlog和數據分配不同的磁盤(在cassandra.yaml中配置, 默認情況下commitlog和data都在目錄/var/lib/cassandra下), 減少磁頭的尋道時間.

memtable

memtable是一張駐留在內存中的cql表:

-每一個節點上, 每一個keyspace下的cql表都對應著一個memtable
-memtable提供了較為快速的讀寫操作
-memtable所有寫數據都是append的形式
-memtable中的數據是按照token排序的, 關于這一點可用token函數來驗證, 如下圖所示.
enter image description here
enter image description here

Cssandra會在特定的時間, 將memtable中的數據刷到SSTable中, 當滿足下文中的任意條件時, 就會觸發該操作:

1. commitlog_total_space_in_mb(這一點已在前文提到過)
2. memtable_total_space_in_mb
    當memtable占用的總空間超過memtable_total_space_in_mb(默認是jvm空間的1/3)時, 把最舊的commitlog segment所對應的Memtable中的數據刷到SSTable中
3. nodetool flush命令

關于Cssandra將memtable中的數據刷到SSTables,和SSTables的合并, 在一下篇繼續介紹.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1基本安裝1.1在基于RHEL的系統中安裝Cassandra1.1.1必要條件? YUM包管理器? Root或...
    戰神湯姆閱讀 1,067評論 0 4
  • Apache Cassandra 是一個開源的、分布式、去中心化、彈性可擴展、高可用性、容錯、一致性可調、面向行的...
    梁睿坤閱讀 14,098評論 2 25
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 概述 一提到數據存儲馬上我們就會想到數據庫, 一想數據庫就會想到 Oracle, MySQL等關系數據庫。 其實今...
    老瓦在霸都閱讀 2,313評論 0 3
  • 多少歲月曾無情,易把流年拋 輕弄眉,低頷首 容顏已舊 夜雨時節,雨打芭蕉聲聲急 催人憶曾經 執書還看,亦無心思
    銀色的夢閱讀 227評論 0 1