天天看點

cassandra 3.x官方文檔(6)---内部原理之存儲引擎

寫在前面

cassandra3.x官方文檔的非官方翻譯。翻譯内容水準全依賴本人英文水準和對cassandra的了解。是以強烈建議閱讀英文版cassandra 3.x 官方文檔。此文檔一半是翻譯,一半是個人對cassandra的認知。盡量将我的了解通過引用的方式标注,以示差別。另外文檔翻譯是項長期并有挑戰的工作,如果你願意加入cassandra git book,可以發信給我。當然你也可以加入我們的QQ群,104822562。一起學習探讨cassandra.

資料存儲引擎

Cassandra使用類似于LSM樹(Log-Structured Merge Tree),不像傳統的關系型資料庫使用B-Tree樹。Cassandra避免在寫之前還要讀。在寫之前讀,尤其是在大型分布式系統,會造成讀性能的很大延遲和其他問題。例如,兩個client在同一時間讀;其中一個重寫了行,進行了A更新。而另外一個用戶端重寫了行進行了B更新,移除了A更新。這種競态條件會導緻不明确的查詢結果-誰的更新是對的?

為了避免Cassandra中的大部分寫使用寫之前讀,存儲引擎在記憶體中将inserts和update分組,并且不時的,以追加的方式将資料順序的寫到磁盤中。一旦寫入到了磁盤,資料不可更改,不能被覆寫。讀資料時需要組合不可更改的順序寫入的資料去發現正确的查詢結果。可以使用輕量級事務在寫入之前檢查資料的狀态。然而,這個功能建議限制使用。

一個日志結構的引擎避免覆寫、使用順序I/O來更新資料對于寫入SSD和HDD是非常有效的,随機寫磁盤涉及到更高的查詢操作相比較順序寫。查詢的代價可能非常大。因為Cassandra順序寫不可改變的檔案,是以避免了寫入放大和磁盤故障,資料庫存儲不昂貴,SSDs尤其收益更大,對于大多數資料庫,在SSDs寫入放大是一個問題。

注:

1.固态硬碟VS機械硬碟

固态硬碟和機械硬碟的差別在于傳統的機械硬碟使用磁媒體來儲存資料,資料讀寫的時候需要轉動磁盤,是以順序寫比随機寫的效率更高。而SSD使用閃存作為存儲媒體,不像機械硬碟那樣有活動的機械部件。是以SSD的随機寫和順序寫差別不大。

2.寫入放大

寫入放大是一個在閃存和SSD中會發生的,不會發生在機械硬碟上,所謂寫入放大就是寫入的實體資料量是寫入資料量的多倍。這個現象會發生的原因就是閃存在重新寫入資料前必須先擦除