2017-10-06 92 views
1

在關於CAP定理(https://en.wikipedia.org/wiki/CAP_theorem)的維基百科文章中,它指出(大膽強調我的)「當選擇可用性一致性時,系統將返回一個錯誤或超時由於網絡分區而無法保證最新。「在CAP中可用性的一致性定理

如果是這樣,沒有選擇過可用性的一致性意味着我們失去分區容忍呢?系統可能會啓動,但如果它爲我的所有數據訪問返回錯誤,它有什麼用處?或者,「網絡分區」是否也意味着數據分區?換句話說,如果還暗示數據分區,則至少知道某些數據部分是最新的並且可以在仍然滿足一致性要求的情況下返回。

+0

「如果數據分區也暗示,至少有一部分數據是最新的,可以在滿足一致性要求的同時返回。「我認爲核心的困惑在於此。你說某些數據已知是最新的,因此可以返回....但是在任意網絡分區期間,如何知道這些數據?你可以從神的視角來看,但實際的分佈式機器不能。 – GManNickG

回答

0

假設你有2個數據中心,每個都具有一個獨立的數據庫和系統允許客戶端連接到第1或2的數據中心。兩個數據中心必須保持同步,因此它們之間存在網絡鏈接。

現在想象一下,網絡鏈路出現故障和數據庫不能互相之間的溝通了(這是一個網絡分區的意思)。 你現在作爲應用程序開發人員做什麼?

你基本上有兩個選擇:

1)使系統可用的,其通過CAP定義是指:

在系統 必須由非故障[數據庫]節點接收的每個請求導致[非錯誤]響應

請注意,在我們的示例中,兩個節點均無故障(它們已啓動並正在運行)。

換句話說,你可以允許從兩個數據中心的所有客戶端寫入和讀取數據,但寬鬆的一致性(見下文定義),因爲在1個數據庫寫入操作將不會出現在其他數據庫中可見。

2)使系統保持一致(注意它與ACID一致性無關),CAP定義表示線性化,簡而言之,這意味着如果寫入發生,它必須由整個系統看到任何節點都不能看到以前的狀態)。

在我們的情況下,它meens你需要拒絕讀取,並從數據中心的人寫,所以只有一個數據中心開始運作。這樣的系統根本不是無用的,因爲您可以將所有客戶端重新引導至運營數據庫,所以您不會丟失分區容差。

有很多周圍的CAP定理混亂,我建議你閱讀馬丁Kleppmann,幫助我瞭解了很多關於這個問題的優秀博客文章: https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html

+0

如果鏈路斷開,你如何將客戶端從dc1(比如失敗的DC)路由到dc2? – user8729669

+0

你可以做它的驅動程序級別(負責客戶端 - > DB通訊),例如,我覺得MongoDB的驅動程序做到這一點。 – matino

+0

對不起,我的意思是,如果鏈接關閉,你將如何到DC1的客戶端DC1的分貝? – user8729669