CAP 定理背後的原因是什麼?
http://en.wikipedia.org/wiki/CAP_theorem
http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf
我認為這不是很簡單,為什麼只有兩個
- 一致性
- 可用性
- 分區容錯
可以適用於任何給定的分佈式數據庫系統。這個猜想被證明了,但有沒有更簡單的方法來解釋為什麼這可能成立?
我不是在尋找證明,只是一種理解為什麼這個定理可能有意義的好方法。原因是什麼?
好的,讓我們假設您有一個分佈式數據庫。假設您在俄勒岡州有一個節點,在加利福尼亞州有一個節點。CAP 理論說在設置這種類型的數據庫時會遇到問題。
例如,如果您從一個數據庫中查詢數據,則它需要與另一個數據庫中的數據相同。這確保了您在一個數據庫中的任何值都保證在另一個數據庫中( CAP 理論的一致性)。這樣做可以讓您更新一個數據庫中的數據並從另一個數據庫中查詢,得到相同的結果。
當我們更新俄勒岡節點的數據時,數據會被發送到加利福尼亞節點,這樣數據庫就保持一致了。為了真正保持一致性,我們必須確保兩個數據庫都獲得更新,然後才能真正保存數據(使用分佈式事務的兩階段送出)。換句話說,如果加利福尼亞的數據庫由於某種原因(例如硬碟故障)無法保存數據,那麼俄勒岡的數據庫將不會保存數據並且會導致事務失敗。
當我們想要具有高可用性時,就會出現上述分佈式事務的問題。在上面的這種情況下,嘗試使兩個數據庫同步的過程是一個非常非常緩慢的過程。(想像一下,我們必須將數據從俄勒岡州發送到加利福尼亞州,確保它到達那裡,確保兩個數據庫都鎖定了數據,等等。)當我們想要一個即使在高需求時期。(這是 CAP 定理的可用性。)
通常,我們為了確保高可用性所做的是使用複製而不是分佈式事務。因此,我們不保證加利福尼亞可以接受數據,而是繼續將其儲存在俄勒岡節點中,然後在我們處理數據時將數據發送到加利福尼亞。這保證了我們始終可以儲存數據,無論加利福尼亞是否準備好儲存數據。
這提高了可用性,但以一致性為代價。看,如果有人更新了俄勒岡州的數據,然後有人(同時)讀取了加利福尼亞州的數據,他們並沒有得到新的數據——數據庫不再一致。事實上,直到俄勒岡州將數據發送到加利福尼亞州,它們才會保持一致!
所以,這就是可用性與一致性的權衡。
分區容限是 CAP 理論的第三個方面。在這種情況下,分區是指數據庫(或其他分佈式系統)可以分成單獨的部分並且仍然可以正常執行的想法。
問題變成了,當兩個數據庫都正常執行,但從俄勒岡州到加利福尼亞州的連結被切斷時會發生什麼?
如果我們更新俄勒岡州的數據庫,我們需要以一種或另一種方式(分佈式事務或複制)將數據獲取到加利福尼亞。但是,如果兩者之間的連結被切斷,那麼系統就會被分割,並且數據庫不再連結在一起。
發生這種情況時,您的選擇是以可用性為代價停止允許更新(以保持一致性)或以一致性為代價允許更新(以保持可用性)。
如您所見,分區容差在一致性和可用性之間產生了直接的權衡。
顯然不止這些,但這些只是分佈式系統的這三個主要方面如何相互支持和相互對抗的幾個例子。 Julian Browne對 CAP 理論的解釋是了解更多資訊的好地方。