一、CAP 理論概述
CAP 理論由 Eric Brewer 于 2000 年提出,并在 2002 年被正式證明。它描述了分布式系統在 一致性(Consistency)、可用性(Availability)、分區容忍性(Partition Tolerance) 三個特性之間的取舍。
CAP 三個核心概念:
- C(Consistency,一致性)
所有節點在同一時間的數據視圖一致。
表現:客戶端無論連接哪個節點,都能讀取到最新數據。 - A(Availability,可用性)
每個請求都能在有限時間內得到響應(成功或失敗)。
表現:即使部分節點宕機,系統也能正常對外提供服務。 - P(Partition Tolerance,分區容忍性)
系統能夠容忍網絡分區(節點間通信中斷)并繼續提供服務。
表現:即使集群被分隔成多個子集群,系統仍能運行。
二、為什么不能同時滿足 CAP 三者?
原因:
分布式系統不可避免會出現 網絡分區(P),如果系統要求 可用性(A),必須繼續響應請求;如果要求 一致性(C),必須等待所有節點同步完成再返回結果。這兩者在網絡分區時是沖突的。
直觀示例:
- 如果要保證 一致性(C):
網絡分區后,某個節點接到寫請求,必須等待另一個分區的節點確認,導致無法響應,降低可用性。 - 如果要保證 可用性(A):
網絡分區后,節點仍然獨立處理請求,但不同分區的數據可能不一致。
三、CAP 三者的關系
CAP 理論核心結論:
在分布式系統中,網絡分區(P)必然會發生,因此只能在 一致性(C)和可用性(A)之間取舍。
對應組合:
- CP 系統(Consistency + Partition Tolerance)
特點:犧牲可用性,保證一致性。
示例:ZooKeeper、HBase。 - AP 系統(Availability + Partition Tolerance)
特點:犧牲強一致性,保證可用性,采用最終一致性。
示例:Cassandra、Eureka。 - CA 系統(Consistency + Availability)
特點:不考慮網絡分區(單機數據庫)。
示例:MySQL 單機模式。
四、分布式場景下的 CAP 取舍
系統類型 | 選擇 | 典型案例 |
---|---|---|
單機數據庫 | CA | MySQL 單機 |
分布式協調服務 | CP | Zookeeper、etcd |
分布式緩存系統 | AP | Redis Cluster、Cassandra |
五、CAP 理論在常見系統中的應用
1. MySQL 主從復制
-
目標:數據一致性高(主從同步),但延遲可能影響可用性。
-
方案:
- 強一致性(CP):主從同步采用 同步復制,但可用性下降。
- 高可用(AP):主從同步采用 異步復制,提升可用性,但可能出現短暫不一致。
2. Redis Cluster
-
目標:高可用性。
-
Redis 選擇 AP:
- 分區時,仍然接受請求,保證可用性。
- 通過 異步復制 + 最終一致性 解決數據一致性問題。
3. ZooKeeper
-
目標:強一致性。
-
ZooKeeper 選擇 CP:
- 網絡分區時,為保持一致性,部分節點拒絕服務,降低可用性。
六、CAP 與 BASE 理論
CAP 是基礎理論,而實際工程中,很多系統選擇 AP + 最終一致性,這就是 BASE 理論:
- Basically Available(基本可用)
- Soft State(軟狀態)
- Eventually Consistent(最終一致性)
七、圖解 CAP
CAP 三角關系+-----------+| C || || |+----+----+ || | |A P
- CA:單機系統。
- CP:一致性 + 分區容忍 → 犧牲可用性。
- AP:可用性 + 分區容忍 → 犧牲強一致性。
八、面試高頻問答
Q1:CAP 理論中,為什么不能同時滿足三者?
- 網絡分區(P)在分布式系統中必然發生。
- 分區發生時,保證 一致性(C) 需要同步確認,降低可用性。
- 保證 可用性(A) 則必須放棄強一致性。
Q2:MySQL 屬于 CAP 哪種?
-
單機:CA。
-
主從復制:
- 同步復制:CP。
- 異步復制:AP。
Q3:Redis 屬于 CAP 哪種?
- Redis Cluster:AP(高可用 + 最終一致性)。
Q4:ZooKeeper 屬于哪種?
- CP(犧牲可用性,保證一致性)。
Q5:CAP 理論與 BASE 理論區別?
- CAP:理論模型,三者不可兼得。
- BASE:工程實踐,強調最終一致性。
九、總結表
特性 | 含義 | 典型場景 |
---|---|---|
C | 所有節點數據一致 | 事務數據庫 |
A | 每次請求都能得到響應 | 分布式緩存 |
P | 系統能容忍分區故障并繼續提供服務 | 所有分布式系統必須具備的能力 |