分布式理論(一) CAP理論
一.CAP理論前言
CAP原則又稱為CAP理論,主要思想是在任何一個分布式系統中都無法同時滿足CAP。
C(Consistency):表示一致性,所有的節點同一時間看到的是相同的數據。
A(Avaliablity):表示可用性,不管是否成功,確保一個請求都能接收到響應。
P(Partion Tolerance):分區容錯性,系統任意分區后,在網絡故障時,仍能操作。
如上所述,正如Gilbert認為,一致性其實就是關系型數據庫所講的ACID,一個用戶請求要么是成功,要么是失敗的,不能有處於一個中間狀態;一旦一個事務完成,將來所有事務都必須基於這個完成后的狀態;未完成的事務不會互相影響;一旦一個事務完成,就是持戒的。可用性其實就是對於一個系統而言,所有的請求都應該“成功”並且收到“響應”。分區容錯性其實就是指分布式系統的容錯性,一個節點出現了故障,不影響整個集群的正常使用。
二.CAP理論介紹
如圖,在一個網絡中,N1和N2即分布式系統中的兩個節點,他們都共享數據塊V,其中有一個值是為V0。
l 在滿足一致性的時候,A中的V0應該和B中的V0保持一致的,即V0=V0
l 在滿足可用性的時候,無論請求訪問A或者是B都應該得到響應。
l 在滿足分區可用性的時候,A和B隨便一個出現宕機或者網絡不通的情況下,都不應該影響整個系統的可用性。
上述描述如果A程序更新V0值為V1,然后在更新B上的副本為V1,當一個請求訪問B時,得到的結果是V1。如下圖所示:
但是分布式系統中,有些時候這些並不能按照你想的這樣進行,在分布式系統中通常情況下網絡是分區的,如果出現了網絡延遲,導致N1上更新的消息無法到達N2上,即N2上的數據副本依然是V0,當一個請求訪問B時,獲取到的結果是V0,而訪問A時,獲取到的結果是V1,這就導致了在用戶看來是同一個請求,得到的結果是不一樣的。如下圖
在這個時候,方案的設計者就應該在這里做出兩種選擇:
(1)犧牲數據一致性,保證可用性。響應舊的數據V0給用戶。
(2)犧牲可用性,保證數據一致性。阻塞等待,直到網絡連接恢復,數據更新操作M完成之后,再給用戶響應最新的數據V1
三.CAP之間取舍
接下來我們就談一談CAP,這三者之間是如何取舍的:
(1)CA without P
如果不要求P(不允許分區),則C(強一致性)和A(可用性)是可以保證的。但其實分區不是你想不想的問題,而是始終會存在,因此CA的系統更多的是允許分區后各子系統依然保持CA。
常見模型例子:
單站點數據庫;集群數據庫等,網上找的還有:LDAP協議,xFS文件系統
實現方式:
兩階段提交;緩存驗證協議
(2) CP without A
如果不要求A(可用),相當於每個請求都需要在節點之間強一致,而P(分區)會導致同步時間無限延長,如此CP也是可以保證的。很多傳統的數據庫分布式事務都屬於這種模式,以及Zookeeper等中間件
常見模型例子:
分布式數據庫;分布式鎖;大部分的協議;Zookeeper
實現方式:
悲觀鎖;少數分區不可用
(3) AP wihtout C
要高可用並允許分區,則需放棄一致性。一旦分區發生,節點之間可能會失去聯系,為了高可用,每個節點只能用本地數據提供服務,而這樣會導致全局數據的不一致性。現在眾多的NoSQL都屬於。
常見模型例子:
Web緩存;DNS;NoSQL;
實現方式:
到期或者租賃;解決沖突;樂觀鎖
CAP的意義:
在系統架構時,應該根據具體的業務場景來權衡CAP,就拿大多數的門戶網站來說,因為機器數量龐大,部署節點分散,網絡故障時常態,可用性是必須要保證的,所以在設計的時候就會考慮舍棄一些一致性而選擇AP模型。但是對於數據一致性較高的銀行系統來說,可以用於系統臨時不可用,但是數據必須要保持一致來說,選擇CP模型無可厚非。