CAP原則又稱CAP定理,指的是在一個分布式系統中,一致性(Consistency)、可用性(Availability)、分區容忍性(Partition tolerance)。CAP 原則指的是,這三個要素最多只能同時實現兩點,不可能三者兼顧。
- C表示一致性(Consistency),分布式中所有節點訪問數據時,要求數據始終都是最新的。
- A表示可用性(Availability),分布式中任意節點出現故障時,要求系統可正常使用。
- P表示分區容忍性(Partition tolerance),分區相當于對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味著發生了分區的情況,必須就當前操作在C和A之間做出選擇。(分區狀態可以理解為部分機器不連通了,比如機器掛了,繁忙失去響應,單機房故障等)
Consistency
數據一致性,及系統只讀到最新寫入的數據,如:單點串行化的方式,就能達到一致性效果。
單機架構保持一致性:
分布式架構數據同步失敗,無法保持數據一致性:
舉個栗子:你去租房的時候都會去找地產中介(某鏈),你找到了A小區的門店發現沒有需要的房源,然后去B小區的門店發現有個房源很適合你,這就可以理解為兩個門店信息不一致,及不滿足一致性要求,但實際上你會遇到這種情況,你去A小區門店詢問的時候,有你需要的房源,然后他們會去B小區的門店拿鑰匙,這是因為房東把房源交給了B小區門店,然后A小區的門店同樣同步的B門店的房源,這樣就滿足一致性的要求。
Availability
如果每運行100個時間單位,有1個時間單位不可用,則說系統的可用性是99%。
如上圖服務A可能由于網絡原因導致不可用,但是B、C還是可以繼續服務的,但是在反向代理那個位置發生了故障那系統都不可用了,它不是高可用的。
舉個栗子:還是以租房為例,你去租房的時候發現A小區的門店今天關門了,然后直接去了B小區的門店發現他們正常工作的,這就滿足了可用性的要求,如果去B小區或其他門店都沒有正常工作,那這家地產商可能倒閉了,沒法對客戶提供可用性的服務了。
Partition tolerance
分布式系統,大多都是很大個節點,第個節點節點之前都不是完全獨立的,需要相互通信,當發生節點無法連通時,系統如何進行容錯處理,是需要考慮的。
舉個栗子:C小區新增加了一個門店,裝修啥的都弄好了,就是沒拉網線,沒有連通性,等于就是個孤立的門店,店員只能大眼瞪小眼,沒得事做。那你去A門店找房源,那里的人可能都不知道有C小區這個門店,所以A直接帶你去了C小區看房子了。
總結
一致性,可用性,分區容忍性三者只能取其二,常見的最佳工程架構實踐是什么呢? 最常見的實踐是這樣的:
- 連通性異常的處理必須保證,滿足P
- 一致性C與可用性A一般二選一
- 選擇一致性C,舉例:傳統單庫水平切分,就是這類選型的典型
- 選擇可用性A,舉例:雙主庫同步高可用,就是這類選型的典型