分布式理論— CAP 定理

1. 什么是 CAP 定理
2000 年的時候,Eric Brewer 教授提出了 CAP 猜想,2年后,被 Seth Gilbert 和 Nancy Lynch 從理論上證明了猜想的可能性,從此,CAP 理論正式在學術上成為了分布式計算領域的公認定理。并深深的影響了分布式計算的發(fā)展。
CAP 理論告訴我們,一個分布式系統(tǒng)不可能同時滿足一致性(C:Consistency),可用性(A: Availability)和分區(qū)容錯性(P:Partition tolerance)這三個基本需求,最多只能同時滿足其中的2個。
| 選項 | 描述 |
|---|---|
| C(Consistence) | 一致性,指數(shù)據(jù)在多個副本之間能夠保持一致的特性(嚴格的一致性)。 |
| A(Availability) | 可用性,指系統(tǒng)提供的服務必須一直處于可用的狀態(tài),每次請求都能獲取到非錯的響應——但是不保證獲取的數(shù)據(jù)為最新數(shù)據(jù)。 |
| P(Partition Tolerance) | 分區(qū)容錯性,分布式系統(tǒng)在遇到任何網(wǎng)絡分區(qū)故障的時候,仍然能夠?qū)ν馓峁M足一致性和可用性的服務,除非整個網(wǎng)絡環(huán)境都發(fā)生了故障。 |
什么是分區(qū)?
在分布式系統(tǒng)中,不同的節(jié)點分布在不同的子網(wǎng)絡中,由于一些特殊的原因,這些子節(jié)點之間出現(xiàn)了網(wǎng)絡不通的狀態(tài),但他們的內(nèi)部子網(wǎng)絡是正常的。從而導致了整個系統(tǒng)的環(huán)境被切分成了若干個孤立的區(qū)域。這就是分區(qū)。
2. 為什么只能 3 選 2
為什么只能 3 選 2?

首先問,能不能同時滿足這三個條件?
假設有一個系統(tǒng)如下:

整個系統(tǒng)由兩個節(jié)點配合組成,之間通過網(wǎng)絡通信,當節(jié)點 A 進行更新數(shù)據(jù)庫操作的時候,需要同時更新節(jié)點 B 的數(shù)據(jù)庫(這是一個原子的操作)。
上面這個系統(tǒng)怎么滿足 CAP 呢?C:當節(jié)點A更新的時候,節(jié)點B也要更新,A:必須保證兩個節(jié)點都是可用的,P:當節(jié)點 A,B 出現(xiàn)了網(wǎng)絡分區(qū),必須保證對外可用。
可見,根本完成不了,只要出現(xiàn)了網(wǎng)絡分區(qū),A 就無法滿足,因為節(jié)點 A 根本連接不上節(jié)點 B。如果強行滿足 C 原子性,就必須停止服務運行,從而放棄可用性 C。
所以,最多滿足兩個條件:
| 組 合 | 分析結果 |
|---|---|
| CA | 滿足原子和可用,放棄分區(qū)容錯。說白了,就是一個整體的應用。 |
| CP | 滿足原子和分區(qū)容錯,也就是說,要放棄可用。當系統(tǒng)被分區(qū),為了保證原子性,必須放棄可用性,讓服務停用。 |
| AP | 滿足可用性和分區(qū)容錯,當出現(xiàn)分區(qū),同時為了保證可用性,必須讓節(jié)點繼續(xù)對外服務,這樣必然導致失去原子性。 |
3. 能不能解決 3 選 2 的問題
難道真的沒有辦法解決這個問題嗎?
CAP 理論已經(jīng)提出了 13 年,也許可以做些改變。
仔細想想,分區(qū)是百分之百出現(xiàn)的嗎?如果不出現(xiàn)分區(qū),那么就能夠同時滿足 CAP。如果出現(xiàn)了分區(qū),可以根據(jù)策略進行調(diào)整。比如 C 不必使用那么強的一致性,可以先將數(shù)據(jù)存起來,稍后再更新,實現(xiàn)所謂的 “最終一致性”。
這個思路又是一個龐大的問題,同時也引出了第二個理論 Base 理論,我們將在后面的文章中詳細介紹。

騰訊課堂,在線觀看
網(wǎng)易云課堂 ,在線觀看
