Cassandra教程(三):Cassandra架構(下)

上篇介紹了Cassandra的架構、數據distribution 與 replication,本文主要介紹Cassandra的內部工作機制,包括存儲引擎、Cassandra讀寫、數據一致性等。

1. 存儲引擎

在分佈式系統中,有些系統寫數據採用read-and-write 的方式(如Elasticsearch),Cassandra爲了避免read-and-write 帶來的性能問題,沒有采用read-and-write的方式,存儲引擎將寫操作保存於內存,每過一段時間,將內存中的數據以追加的方式,寫入磁盤,磁盤中的數據都是不可更改、不可重寫的。當讀數據時,需要將讀取的數據組合起來以得到正確的數據。

在內部實現上,Cassandra 採用了類似 Log-Structured merge tree 的存儲結構存儲數據,採用順序IO,這樣的話,即使採用HDD也能有不錯的性能。

2. 數據讀寫

write

如下圖所示,node接收write請求,將數據寫入memtable,同時記錄到commit log。commit log 記錄node接收到的每一次write請求,這樣,即使發生斷電等故障,也不會丟失數據。

memtable是一個cache,按順序存儲write的數據,當memtable 的內容大小達到配置的閾值或者commit log的存儲空間大於閾值,memtable裏的數據被flush到磁盤,保存爲SSTables。當memtable中的數據flush到磁盤後,commit log被刪除。

在內部實現上,memtable 和 SSTable按table進行劃分,不同的table可以共享一個commit log。SSTable本質上是磁盤文件,不可更改,因此,一個partition 包含了多個SSTables。

best practice: 重啓node前先使用nodetool flush memtable,這樣可以減少commit log重放。

compaction

Cassandra不會採用類似insert/update的方式更新已有數據,而是創建帶有時間戳版本信息的新的數據,同時,Cassandra也不刪除數據,而是將數據標記爲tombstones。這樣,隨着時間過去,每行數據可能包括不同時間戳版本的多個列集合,讀取數據時,可能需要讀取越來越多的列才能組成完整的一行數據。爲了避免這種情況,Cassandra週期性的合併SSTables並刪除舊數據,這個過程稱作compaction。compaction 讀取每行數據所有版本的數據然後用最新的數據組成完整的一行,新數據寫入新的SSTable,舊版本數據隨後被刪除。compaction 提高了Cassandra的read 性能。

另外,在compaction過程中,新舊數據可能同時存在,所以,磁盤使用率上會存在突增;同時,由於數據按照partition key 按序存儲,所以,compaction過程中,不使用隨機IO。

update

Cassandra 將每個新行視爲upsert,如果已經存在該primary key,則視作是對原有數據的update,

delete

Cassandra 刪除數據時使用tombstone,tombstone是一個標記,標記column被刪除了,在compaction階段,標記刪除的columns被物理刪除。在讀取階段,標記爲tombstone的數據被忽略。

read

讀取數據時,Cassandra可能需要聯合memtable和多個SSTables才能拼裝出完整的數據。

3. 數據一致性

根據 CAP 理論,Cassandra 是一個AP系統,提供最終一致性。同時,Cassandra可以靈活配置,使系統更趨向一個CP系統。

3.1 Two consistency features

3.1.1 Tunable consistency

高一致性意味着高延遲,低一致性意味着低延遲,需要根據自己的需求,自己調節。而且,Cassandra 不僅支持集羣級別的一致性設置,還支持請求級別的一致性設置,用戶可以針對請求設置一致性。

一致性等級決定了處理讀/寫請求返回成功的數據副本數,Cassandra賦予用戶充分的自主選擇權,通常情況下,設置讀/寫的的一致性等級爲"QUORUM",其中,quorum = (sum_of_replication_factors / 2) + 1,sum_of_replication_factors表示所有datacenter中replication factor求和。

3.1.2 Linearizable consistency

存在一些場景,一些操作需要順序執行且不能被中斷,Cassandra通過lightweight transactions 來支持這種場景。

3.2 一致性計算

強一致性: R + W > N

最終一致性:R + W <= N

其中,R代表read操作的一致性,W表示write操作的一致性,N表示副本數。

總結

本文介紹了Cassandra的內部實現,下一篇開始介紹CQL。

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