閱讀831 返回首頁    go 阿裏雲 go 技術社區[雲棲]


淘寶海量數據庫之二:一致性選擇

眾所周知,一致性是數據最關鍵的屬性之一。2000年,Eric Brewer教授在ACM分布式計算年會上指出了著名的CAP理論:

Brewer, E. A. 2000. Towards robust distributed systems. In Proceedings of the 19th Annual ACM Symposium on Principles of Distributed Computing (July 16-19, Portland, Oregon)

即分布式係統不可能滿足一致性(C: Consistency),可用性(A: Availability)和分區容錯性(P: Tolerance of network Partition)這三個需求。

 

大約兩年後,Seth Gilbert 和 Nancy lynch兩人證明了CAP理論的正確性:

Gilbert , S., Lynch, N. 2002. Brewer's conjecture and the feasibility of consistent, available, partition-tolerant Web services. ACM SIGACT News 33(2)

 

幾種常見的一致性類型有:

  • 強一致性:係統中的某個數據被成功更新(事務成功返回)後,後續任何對該數據的讀取操作都得到更新後的值。這是傳統關係數據庫提供的一致性模型,也是關係數據庫深受人們喜愛的原因之一。
  • 弱一致性:係統中的某個數據被更新後,後續對該數據的讀取操作得到的不一定是更新後的值,這種情況下通常有個“不一致性時間窗口”(inconsistency window)存在:即數據更新完成後在經過這個“不一致性時間窗口”,後續讀取操作就能夠得到更新後的值。
  • 最終一致性:屬於弱一致性的一種,即某個數據被更新後,如果該數據後續沒有被再次更新,那麼最終所有的讀取操作都會返回更新後的值。

關於最終一致性,Werner Vogels提出了NWR模型(Eventually Consistent - Revisited, By Werner Vogels on December 23, 2008 12:15 AM,   https://www.allthingsdistributed.com/2008/12/eventually_consistent.html):

  • N:數據複製的份數(the number of nodes that store replicas of the data)
  • W:數據更新完成前需要到達的節點數(the number of replicas that need to acknowledge the receipt of the update before the update completes)
  • R:為了讀取正確數據需要讀取的節點數(the number of replicas that are contacted when a data object is accessed through a read operation)

Werner Vogels還寫到,如果W+R > N,那麼讀寫節點有重疊,讀總是能夠得到最新的數據,這就是強一致性。在傳統的一主一備同步複製的關係數據庫中,N=2,W=2,R=1;在非同步複製模型中,W變成1,此時W+R=N,一致性也就無法保證。

 

不過,NWR模型隻代表了一類情形,例如,在傳統的一主一備的非同步複製的關係數據庫中,盡管N=2,W=1,R=1,如果隻有主庫提供服務,則一致性仍然是保證的,不過主機異常時,服務的恢複不是實時的,因此CAP理論依然適用。

 

在調研中,我們發現一些項目正在或傾向於弱一致性或最終一致性,咋看這似乎表明這些工程師偏愛弱一致性或最終一致性。然而,在經過仔細溝通和深入分析後,我們發現,這些項目采用弱一致性或最終一致性,其實是在高數據量(十幾億條記錄、數TB數據)和高訪問量(數千TPS、數萬QPS)需求壓力之下的無奈選擇。如果兩個係統都能滿足上述高數據量和高訪問量需求且成本差異不是很大,那麼在強一致性和若一致性(或最終一致性)兩者中他們會毫不猶豫地選擇前者。

 

顯而易見,作為整個係統中最為基礎的部件,如果數據庫的數據是弱一致,那麼上層應用就不得不承受這種弱一致導致的種種後果,從上層應用的角度看,這並不是十分友善的行為。由於上述原因,我們決心在我們的海量數據庫中實現與傳統關係數據庫相同的強一致性,因為我們相信這種強一致性不僅會簡化數據庫的管理,減輕數據庫管理的工作量,尤其重要的是,上層應用不再需要關注數據的不一致性,應用程序也會因此而簡化,並且易於開發和維護。

最後更新:2017-04-03 07:57:05

  上一篇:go 深入理解Linux內存映射機製
  下一篇:go 項目經理修煉之道(2) -- 必須讀的書 .