Tunable Consistency不能讓Cassandra成爲CP系統

Cassandra有一個非常重要的特性,叫做Tunable Consistency。當RW>N時保證副本保持strong consistency,當RW=< N時系統的所有副本保持最終一致性。(關於這個特性可以參看< Cassandra的副本策略>這個文章)

在Cassandra的文檔中,有這樣的一段話:

You can tune Cassandra’s consistency level per-operation, or set it globally for a cluster or datacenter. You can vary the consistency for individual read or write operations so that the data returned is more or less consistent, as required by the client application. This allows you to make Cassandra act more like a CP (consistent and partition tolerant) or AP (highly available and partition tolerant) system according to the CAP theorem, depending on the application requirements.

這段話描述了通過調整consistency level可以讓cassandra系統更像(act more like)一個CP或者一個AP系統。從表面上看,這個段文字,和我最開始說的結論”當RW>N時保證副本保持strong consistency,當RW=< N時系統是最終一致性”是相同的。其實不然。調整consistency level不能讓cassandra更像CP和AP。也就是說”副本保持strong consistency”不等於CP,”所有副本保持最終一致性”不等於AP。

要說明這個問題,就要從CAP定理說起。
CAP定理說分佈式系統不能同時滿足以下3個屬性:
- Consistency: 這裏是指linearizability Consistency。
- Availability:是指每個請求被髮送到一個沒有宕掉的機器上,都能被成功的完成。
- Partition tolerance:是指網絡分區是可以發生的,系統可以容忍網絡分區。

(關於CAP定理是什麼可以參看<從Paxos不違反CAP來解釋什麼是CAP定理>)

CAP定理中Consistency實際上是指Linearizability,也可以叫做Linearizability Consistency。那麼什麼是Linearizability Consistency那?Linearizability Consistency也叫原子一致性,系統具有線性一致性後,當client將數據是原子寫入的系統中的,只要一個value被寫入,那麼後續的client做read操作時,一定能夠讀到這個新值。這裏要注意的是,這裏的Linearizability Consistency講的是客戶端視角。而Cassandra的consistency level影響的是服務端的副本的一致性,是一個服務端視角。

(關於什麼Linearizability,以及Linearizability的作用請參考<線性一致性(Linearizability)是併發控制的基礎>這篇文章)

服務端的副本一致性與客戶端的linearizability Consistency,是有關聯的,但不是相同的特性。那麼我們通過consistency level把副本的一致性調整爲強一致性,在客戶端視角上系統是否會變成Linearizability Consistency那?答案是不是的。

要解釋爲什麼當RW>N時,Cassandra不是Linearizability Consistency,我們首先要說明,每個寫入操作,都會分配一個非全局的本地的時間戳給這個寫入操作。當2個client同時寫入一個cell時,是通過Last Write Win來解決寫入衝突的,也就是時間戳大的寫入操作會覆蓋時間戳小的寫入操作。由於時間不是完全同步的,RW>N只能保證,一個值成功寫入後在沒有後續寫入的情況下能夠讀取出來。但是由於時間不完全不同,所以在RW>N的情況下仍然能夠出現,後發起的請求(帶着更早的時間戳)被先發起的請求(帶着更新的時間戳)所覆蓋。這就不能保證Linearizability Consistency裏面要求的,後發起的寫入請求,一定能被後續的讀請求所讀到。

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