2000年7月,加州大學伯克利分校的Eric Brewer教授在ACM PODC會議上提出CAP猜測。2年後麻省理工學院的Seth Gilbert和NancyLynch從理論上證實了CAP,以後CAP理論正式成爲分佈式計算領域的公認定理。node
CAP是一個已經通過證明的理論:一個分佈式系統最多隻能同時知足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項。mysql
CAP理論是由下面三個概念組成的,且在分佈式系統中三者不能兼得,只能同時知足兩種條件。sql
一致性(C)數據庫
All nodes see the same data at the same time網絡
全部數據庫集羣節點在同一時間點看到的數據徹底一致,即全部節點能實時保持數據同步。併發
咱們知道ACID中事務的一致性是指事務的執行不能破壞數據庫數據的完整性和一致性,一個事務在執行先後,數據庫都必須處於一致性狀態。也就是說,事務的執行結果必須是使數據庫從一個一致性狀態轉變到另外一個一致性狀態。異步
和ACID中的一致性不一樣,分佈式環境中的一致性是指數據在多個副本之間是否可以保持一致的特性。分佈式
分佈式系統中,數據通常會存在不一樣節點的副本中,若是對第一個節點的數據成功進行了更新操做,而第二個節點上的數據卻沒有獲得相應更新,這時候讀取第二個節點的數據依然是更新前的數據,即髒數據,這就是分佈式系統數據不一致的狀況。
在分佈式系統中,若是可以作到針對一個數據項的更新操做執行成功後,全部的用戶都能讀取到最新的值,那麼這樣的系統就被認爲具備強一致性(或嚴格的一致性)。網站
可用性(A)搜索引擎
Reads and writes always succeed
讀寫操做永遠是成功的。即服務一直是可用的,即便集羣一部分節點故障,集羣總體還能正常響應客戶端的讀寫請求。
可用性是指系統提供的服務必須一直處於可用的狀態,對於用戶的每個操做請求老是可以在有限的時間內返回結果,若是超過了這個時間範圍,那麼系統就被認爲是不可用的。
「有限的時間內」是在系統的運行指標,不一樣系統會有差異。例如搜索引擎一般在0.5秒內須要給出用戶檢索結果。
「返回結果」是可用性的另外一個重要指標,它要求系統完成對用戶請求的處理後,返回一個正常的響應結果,要明確的反映出對請求處理的成功或失敗。若是返回的結果是系統錯誤,好比"OutOfMemory"等報錯信息,則認爲此時系統是不可用的。
分區容錯性(P)
The system continues to operate despite arbitrary message loss or failure of part of the system
儘管系統中有任意的信息丟失或故障,系統仍在繼續運行。以實際效果而言,分區至關於對通訊的時限要求。系統若是不能在時限內達成數據一致性,就意味着發生了分區的狀況,必須就當前操做在C和A之間作出選擇。
一個分佈式系統中,節點組成的網絡原本應該是連通的。然而可能由於某些故障,使得有些節點之間不連通了,整個網絡就分紅了幾塊區域,而數據就散佈在了這些不連通的區域中,這就叫分區。
當你一個數據項只在一個節點中保存,那麼分區出現後,和這個節點不連通的部分就訪問不到這個數據了。這時分區就是沒法容忍的。
提升分區容忍性的辦法就是一個數據項複製到多個節點上,那麼出現分區以後,這一數據項仍然能在其餘區中讀取,容忍性就提升了。然而,把數據複製到多個節點,就會帶來一致性的問題,就是多個節點上面的數據多是不一致的。要保證一致,每次寫操做就都要等待所有節點寫成功,而這等待又會帶來可用性的問題。
總的來講就是,數據存在的節點越多,分區容忍性越高,但要複製更新的數據就越多,一致性就越難保證。爲了保證一致性,更新全部節點數據所須要的時間就越長,可用性就會下降。
一、保留CA,放棄P
若是想避免分區容錯性問題的發生,一種作法是將全部的數據(與事務相關的)都放在一臺機器上。雖然沒法100%保證系統不會出錯,但不會碰到由分區帶來的負面效果。固然這個選擇會嚴重的影響系統的擴展性。
做爲一個分佈式系統,放棄P,即至關於放棄了分佈式,一旦併發性很高,單機服務根本不能承受壓力。
像不少銀行服務,確確實實就是捨棄了P,只用單臺小型機+ORACLE保證服務可用性。
二、保留CP,放棄A
相對於放棄「分區容錯性「來講,其反面就是放棄可用性。一旦遇到分區容錯故障,那麼受到影響的服務須要等待必定的時間,所以在等待期間系統沒法對外提供服務。
做爲分佈式系統,有分區服務發生問題頗有可能,若是由於某些服務不能用,致使整個服務都不能用,這個根本不是好的分佈式系統。
三、保留AP,捨棄C
這裏所說的放棄一致性,並非徹底放棄數據一致性,而是放棄數據的強一致性。即放棄了同一時刻的數據一致性,而保留數據的最終一致性。
以網絡購物爲例,對只剩下一件庫存的商品,若是同時接受到了兩份訂單,那麼較晚的訂單將被告知商品告罄。
一般狀況下,不少分佈式服務系統都是採用該方案,保證可用性性,分佈式服務,由於某些分區服務發生問題,先容忍,最終經過一些折中的方法達到最終數據一致性。
CAP面臨的問題:
對於多數大型互聯網應用的場景,主機衆多、部署分散,並且如今的集羣規模愈來愈大,因此節點故障、網絡故障是常態,並且要保證服務可用性達到N個9,即保證P和A,捨棄C。
BASE理論是對CAP理論的延伸,思想是即便沒法作到強一致性(CAP的一致性就是強一致性),但能夠採用適當的採起弱一致性,即最終一致性。
BASE是指基本可用(Basically Available)、軟狀態( Soft State)、最終一致性( Eventual Consistency)。
基本可用是指分佈式系統在出現故障的時候,容許損失部分可用性(例如響應時間、功能上的可用性),容許損失部分可用性。須要注意的是,基本可用毫不等價於系統不可用。
響應時間上的損失:正常狀況下搜索引擎須要在0.5秒以內返回給用戶相應的查詢結果,但因爲出現故障(好比系統部分機房發生斷電或斷網故障),查詢結果的響應時間增長到了1~2秒。
功能上的損失:購物網站在購物高峯(如雙十一)時,爲了保護系統的穩定性,部分消費者可能會被引導到一個降級頁面。
軟狀態是指容許系統存在中間狀態,而該中間狀態不會影響系統總體可用性。分佈式存儲中通常一份數據會有多個副本,容許不一樣副本同步的延時就是軟狀態的體現。mysql replication的異步複製也是一種體現。
最終一致性是指系統中的全部數據副本通過必定時間後,最終可以達到一致的狀態。弱一致性和強一致性相反,最終一致性是弱一致性的一種特殊狀況。