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