1. 什么是CAP
是一種定理,多用於描述分布式架構,CAP這三個字母對應三種理念,且這三種理念只能兩兩組合,不能CAP三種理念同時共存(為什么?下面說)。
- C:Consisteny(一致性)
- A:Availability(可用性)
- P:Partition Tolerance(分區容錯性)
2. 細說CAP
- C:Consisteny(一致性),比如數據庫是主從模式,一個寫庫請求進來了,master庫完成了寫入操作,但是再slave同步數據之前,另一個用戶查了這條數據,結果沒查到,但是也沒報錯,這就不是強一致性。雖然最終會同步成功,但這是最終一致性的體現。強一致性的體現在於我不管你因為什么沒同步成功(可能網絡延遲或其他等),只要沒同步成功,我這個slave就不能對外提供服務。必須主從數據一致才可以提供服務。(很少有做到這點的)
- A:Availability(可用性),還是上面的例子,就是保證了可用性。因為雖然主從沒同步完成,但是我從庫照樣能提供服務而且及時響應結果。也就是說可用性保證服務可用,而不在乎數據是否一致。明顯和C是沖突的,那CA怎么還能組合到一起?后面說。
- P:Partition Tolerance(分區容錯性),集群部署了三台服務。掛了一台,其他兩台還能繼續對外提供服務,這時候我就認為他是沒問題的,也就是我能容忍你掛了一台,只要還有服務能對外提供請求即可。所以一般分區容忍性是必須的,一般都需要從C和A之間做選擇。
3. CAP組合
- CP
即一致性和分區容忍性。
把節點A和節點B理解成mysq主從的話,那么就是A和B之間不能互相通訊,網絡出問題了,當有客戶端向A寫入msg1的時候,會直接失敗,因為C要保證A和B兩個節點之間的數據強一致性。
假如有另一個客戶端向B節點進行讀取msg2消息的時候,B返回是成功的,因為msg2節點是A和B之間網絡通順時存在的老數據,數據是一致的。這就是雖然你A不可用,但是我B還能提供服務,這就保證了分區容忍性。
- AP
即可用性和分區容忍性。
節點A和B之間不能互相通訊,當有客戶端向A節點寫入msg1的時候,節點A允許 寫入,請求操作成功,但此時由於A和B不能通信,所以導致B節點的msg1的數據是舊的,或者根本不存在。但是另一個客戶端向B節點讀取msg1的時候是可以成功的,要么讀到的是舊數據要么讀取不到。但是服務是可用的,只是數據可能有問題。這就保證了可用性,舍棄了強一致性。
- CA
CA的話我只能想到單機上是可以保證的,一台機器數據肯定一致,服務肯定可用。不可用的時候服務也不能用,也能保證一致性。單台機器也沒有分區容錯性的概念。所以完美CA。
4. Base理論
Base理論是對CAP理論的延申,核心思想就說既然無法做到強一致性(CAP中的C),但是可以采取合適的方式達到最終一致性。
Base的全稱是:Basically Available(基本可用)、Soft State(軟狀態)、Eventual Consistency(最終一致性)。
- Basically Available(基本可用)
指分布式系統再出現故障的時候,允許損失部分可用性,即保證核心可用。比如電商大促時,為了應對訪問量激增,部分用戶可能會被引導到降級頁面,服務層也可能只提供降級服務,這就是損失部分可用性的體現。
- Soft State(軟狀態)
指系統允許存在中間狀態,而這個中間狀態不會影響系統整體可用性。比如分布式存儲中一般一份數據至少會有三個副本,允許不同節點間副本同步的延遲就是軟狀態的體現。
- Eventual Consistency(最終一致性)
指系統中的所有數據副本經過一定時間后最終能夠達到一致的狀態。也是弱一致性的體現。