Cassandra使用類似于LSM樹(Log-Structured Merge Tree),不像傳統(tǒng)的關系型數(shù)據(jù)庫使用B-Tree樹纫事。Cassandra避免在寫之前還要讀。在寫之前讀,尤其是在大型分布式系統(tǒng),會造成讀性能的很大延遲和其他問題具则。例如,兩個client在同一時間讀;其中一個重寫了行具帮,進行了A更新博肋。而另外一個客戶端重寫了行進行了B更新,移除了A更新蜂厅。這種競態(tài)條件會導致不明確的查詢結果-誰的更新是對的匪凡?
為了避免Cassandra中的大部分寫使用read-before-write,存儲引擎在內(nèi)存中將inserts和update分組掘猿,并且不時的病游,以追加的方式將數(shù)據(jù)順序的寫到磁盤中。一旦寫入到了磁盤稠通,數(shù)據(jù)不可更改(immutable),不能被覆寫衬衬。讀數(shù)據(jù)時需要組合immutable的順序?qū)懭氲臄?shù)據(jù),去返回正確的查詢結果改橘∽涛荆可以使用Lightweight transactions (LWT)?在寫入之前檢查數(shù)據(jù)的狀態(tài)。但不建議使用這個功能唧龄。
一個log-structured的引擎避免overwrites兼砖、使用順序I/O來更新數(shù)據(jù)對于寫入?solid-state disks (SSD) 和 hard disks (HDD)是非常有效的。
HDD機械硬盤:隨機寫比順序?qū)懮婕暗礁嗟拇疟P詢道(seek operation)操作既棺。seek的代價非常大讽挟。
SSDs固態(tài)硬盤:因為Cassandra順序?qū)懳募虼吮苊饬?a target="_blank">寫入放大(?write amplification)和磁盤故障丸冕。但對于其他數(shù)據(jù)庫耽梅,SSDs的寫入放大是一個問題。
注:
1.固態(tài)硬盤VS機械硬盤
固態(tài)硬盤和機械硬盤的區(qū)別在于傳統(tǒng)的機械硬盤使用磁介質(zhì)來保存數(shù)據(jù)胖烛,數(shù)據(jù)讀寫的時候需要轉(zhuǎn)動磁盤眼姐,因此順序?qū)懕入S機寫的效率更高诅迷。而SSD使用閃存作為存儲介質(zhì),不像機械硬盤那樣有活動的機械部件众旗。因此SSD的隨機寫和順序?qū)憛^(qū)別不大罢杉。
2.寫入放大
寫入放大是一個在閃存和SSD中會發(fā)生的,不會發(fā)生在機械硬盤上贡歧,所謂寫入放大就是寫入的物理數(shù)據(jù)量是寫入數(shù)據(jù)量的多倍滩租。這個現(xiàn)象會發(fā)生的原因就是閃存在重新寫入數(shù)據(jù)前必須先擦除