跨數據中心一致性是如何實現的?

看spanner的論文,它可以支持全球上千數據中心的強一致性。並且megastore、dynamo也實現了MDCC。請問,它是如何做到的呢?比如一份數據,在全球N個數據中心都有副本,如果東半球的DC1與西半球的DC2同時更新同張表的同一行記錄,這時是如何做到跨dc一致性的?同份數據可以跨DC多點寫入嗎?


Spanner 用 Paxos 協議來保證一致性,可以看一些相關的資料


一致性這個概念有很多種定義。

順序一致性

因果一致性

最終一致性

單調讀一致性等

他的核心主要是對並發讀寫訪問的各類優化,原有單機系統就已經存在這個問題,只是這在分散式系統中因為延遲更大了,所以問題更加突出了而已。

如果全部串列執行,那麼順序一致性一定得到了保證,代價就是系統延遲高。

如果全部並行執行,那麼系統的延遲可以很低,但容易出現各類臟讀臟寫問題。

找到中間的平衡點就好,平衡一下收益(可用性,可見性)和 成本(延遲,機器配置,並發度)。

至於具體的做法,基本上就是全局一致性方案Paxos+2pc


這個一致性可以有很多理解。如果你說的是事務,那 spanner 是用 2pc 加 transaction manager 的悲觀鎖來實現你說的寫入同一行的一致性,如果你說的是分散式的數據一致性,那 spanner 用的是 paxos。在多個副本的時候,一般是只有 master 可以讀寫, spanner 也是多個 paxos group 的實現,具體可以看看相關的論文。


1、論文里寫了一種true time的機制,基於這種機制實現了跨區的分散式事務來保證一致性

2、使用了paxos來保證了非跨區的一致性


個人觀點:

1.跨DC的意思並不是說,你架構就直接在全球多個DC直接上支持Paxos的東東;實際情況可能會更細的劃分多層的 Paxos ;

2.在考慮一致性問題的時候,肯定要考慮用戶的主要分布位置,換句話說,在做跨DC的分散式時,最初就會假定各個DC的地位是不同的;

3.用戶位置分布+流量的引導+分散式多副本,在最大程度上解決延遲和一致性之間的矛盾;


個人感覺,跨數據中心一致性的關鍵在於實現一層穩定、可靠的分散式消息中間層,例如Yahoo PNUTS 依賴的YMB,Facebook wormhole,bookkeeper/hedwig/distributed log,netflix dynomite ,微博的WMB。


看你的取捨了,要強一致性,還是要最終一致性!

一般這種跨區的服務,在業務上也會做跨區引導的,可以想成cdn的智能dns 部分。


推薦閱讀:

對資料庫和分散式很感興趣,學習路線是什麼?

TAG:資料庫 | Cassandra | 分散式資料庫 | GoogleSpanner | TiDB |