CAP原則又稱CAP定理,指的是在一個分佈式系統中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),三者不可得兼。html
CAP原則是NOSQL數據庫的基石。Consistency(一致性)。 Availability(可用性)。Partition tolerance(分區容錯性)。web
- 一致性(C):在分佈式系統中的全部數據備份,在同一時刻是否一樣的值。(等同於全部節點訪問同一份最新的數據副本)
- 可用性(A):在集羣中一部分節點故障後,集羣總體是否還能響應客戶端的讀寫請求。(對數據更新具有高可用性)
- 分區容忍性(P):以實際效果而言,分區至關於對通訊的時限要求。系統若是不能在時限內達成數據一致性,就意味着發生了分區的狀況,必須就當前操做在C和A之間作出選擇。
一致性與可用性的決擇
-
數據庫事務一致性需求
不少web實時系統並不要求嚴格的數據庫事務,對讀一致性的要求很低,有些場合對寫一致性要求並不高。容許實現最終一致性。 -
數據庫的寫實時性和讀實時性需求
對關係數據庫來講,插入一條數據以後馬上查詢,是確定能夠讀出來這條數據的,可是對於不少web應用來講,並不要求這麼高的實時性,比方說發一條消息之 後,過幾秒乃至十幾秒以後,個人訂閱者纔看到這條動態是徹底能夠接受的。 -
對複雜的SQL查詢,特別是多表關聯查詢的需求
任何大數據量的web系統,都很是忌諱多個大表的關聯查詢,以及複雜的數據分析類型的報表查詢,特別是SNS類型的網站,從需求以及產品設計角 度,就避免了這種狀況的產生。每每更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能被極大的弱化了。
BASE理論
BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的簡寫,BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分佈式實踐的結論,是基於CAP定理逐步演化而來的,其核心思想是即便沒法作到強一致性(Strong consistency),但每一個應用均可以根據自身的業務特色,採用適當的方式來使系統達到最終一致性(Eventual consistency)。接下來咱們着重對BASE中的三要素進行詳細講解。算法
基本可用
基本可用是指分佈式系統在出現不可預知故障的時候,容許損失部分可用性——但請注意,這毫不等價於系統不可用,如下兩個就是「基本可用」的典型例子。數據庫
- 響應時間上的損失:正常狀況下,一個在線搜索引擎須要0.5秒內返回給用戶相應的查詢結果,但因爲出現異常(好比系統部分機房發生斷電或斷網故障),查詢結果的響應時間增長到了1~2秒。
- 功能上的損失:正常狀況下,在一個電子商務網站上進行購物,消費者幾乎可以順利地完成每一筆訂單,可是在一些節日大促購物高峯的時候,因爲消費者的購物行爲激增,爲了保護購物系統的穩定性,部分消費者可能會被引導到一個降級頁面。
弱狀態也稱爲軟狀態,和硬狀態相對,是指容許系統中的數據存在中間狀態,並認爲該中間狀態的存在不會影響系統的總體可用性,即容許系統在不一樣節點的數據副本之間進行數據聽不的過程存在延時。安全
最終一致性
最終一致性強調的是系統中全部的數據副本,在通過一段時間的同步後,最終可以達到一個一致的狀態。所以,最終一致性的本質是須要系統保證最終數據可以達到一致,而不須要實時保證系統數據的強一致性網絡
亞馬遜首席技術官Werner Vogels在於2008年發表的一篇文章中對最終一致性進行了很是詳細的介紹。他認爲最終一致性時一種特殊的弱一致性:系統可以保證在沒有其餘新的更新操做的狀況下,數據最終必定可以達到一致的狀態,所以全部客戶端對系統的數據訪問都可以胡渠道最新的值。同時,在沒有發生故障的前提下,數據達到一致狀態的時間延遲,取決於網絡延遲,系統負載和數據複製方案設計等因素。架構
在實際工程實踐中,最終一致性存在如下五類主要變種。異步
因果一致性:分佈式
因果一致性是指,若是進程A在更新完某個數據項後通知了進程B,那麼進程B以後對該數據項的訪問都應該可以獲取到進程A更新後的最新值,而且若是進程B要對該數據項進行更新操做的話,務必基於進程A更新後的最新值,即不能發生丟失更新狀況。與此同時,與進程A無因果關係的進程C的數據訪問則沒有這樣的限制。工具
讀己之所寫:
讀己之所寫是指,進程A更新一個數據項以後,它本身老是可以訪問到更新過的最新值,而不會看到舊值。也就是說,對於單個數據獲取者而言,其讀取到的數據必定不會比本身上次寫入的值舊。所以,讀己之所寫也能夠看做是一種特殊的因果一致性。
會話一致性:
會話一致性將對系統數據的訪問過程框定在了一個會話當中:系統能保證在同一個有效的會話中實現「讀己之所寫」的一致性,也就是說,執行更新操做以後,客戶端可以在同一個會話中始終讀取到該數據項的最新值。
單調讀一致性:
單調讀一致性是指若是一個進程從系統中讀取出一個數據項的某個值後,那麼系統對於該進程後續的任何數據訪問都不該該返回更舊的值。
單調寫一致性:
單調寫一致性是指,一個系統須要可以保證來自同一個進程的寫操做被順序地執行。
以上就是最終一致性的五類常見的變種,在時間系統實踐中,能夠將其中的若干個變種互相結合起來,以構建一個具備最終一致性的分佈式系統。事實上,能夠將其中的若干個變種相互結合起來,以構建一個具備最終一致性特性的分佈式系統。事實上,最終一致性並非只有那些大型分佈式系統才設計的特性,許多現代的關係型數據庫都採用了最終一致性模型。在現代關係型數據庫中,大多都會採用同步和異步方式來實現主備數據複製技術。在同步方式中,數據的複製國恥鞥一般是更新事務的一部分,所以在事務完成後,主備數據庫的數據就會達到一致。而在異步方式中,備庫的更新每每存在延時,這取決於事務日誌在主備數據庫之間傳輸的時間長短,若是傳輸時間過長或者甚至在日誌傳輸過程當中出現異常致使沒法及時將事務應用到備庫上,那麼狠顯然,從備庫中讀取的的數據將是舊的,所以就出現了不一致的狀況。固然,不管是採用屢次重試仍是認爲數據訂正,關係型數據庫仍是能搞保證最終數據達到一致——這就是系統提供最終一致性保證的經典案例。
總的來講,BASE理論面向的是大型高可用可擴展的分佈式系統,和傳統事務的ACID特性使相反的,它徹底不一樣於ACID的強一致性模型,而是提出經過犧牲強一致性來得到可用性,並容許數據在一段時間內是不一致的,但最終達到一致狀態。但同時,在實際的分佈式場景中,不一樣業務單元和組件對數據一致性的要求是不一樣的,所以在具體的分佈式系統架構設計過程當中,ACID特性與BASE理論每每又會結合在一塊兒使用。
小結:
計算機系統從集中式向分佈式的變革隨着包括分佈式網絡、分佈式事務和分佈式數據一致性等在內的一系列問題與挑戰,同時也催生了一大批諸如ACID、CAP和BASE等經典理論的快速發展。
與NoSQL的關係
傳統的SQL數據庫的事務一般都是支持ACID的強事務機制。A表明原子性,即在事務中執行多個操做是原子性的,要麼事務中的操做所有執行,要麼一個都不執行;C表明一致性,即保證進行事務的過程當中整個數據加的狀態是一致的,不會出現數據花掉的狀況;I表明隔離性,即兩個事務不會相互影響,覆蓋彼此數據等;D表示持久化,即事務一量完成,那麼數據應該是被寫到安全的,持久化存儲的設備上(好比磁盤)。
NoSQL系統僅提供對行級別的原子性保證,也就是說同時對同一個Key下的數據進行的兩個操做,在實際執行的時候是會串行的執行,保證了每個Key-Value對不會被破壞。
CAP的是什麼關係
It states, that though its desirable to have Consistency, High-Availability and Partition-tolerance in every system, unfortunately no system can achieve all three at the same time.
在分佈式系統的設計中,沒有一種設計能夠同時知足一致性,可用性,分區容錯性 3個特性
注意:不要將弱一致性,最終一致性放到CAP理論裏混爲一談(混淆概念的坑真多)
弱一致性,最終一致性 你能夠認爲和CAP的C一點關係也沒有,由於CAP的C是更新操做完成後,任何節點看到的數據徹底一致, 弱一致性。最終一致性自己和CAP的C一致性是違背的,因此你能夠看到那些謊稱本身系統同時具有CAP 3個特性是多麼的好笑,可能國內更多的場景是:一個開放人員一旦走上講臺演講,就立馬轉變爲了營銷人員,連最基本的理念也不要了。
這裏有一篇標題很大的文章 cap-twelve-years-later-how-the-rules-have-changed ,實際上本文的changed更多的是在思考方式上,而自己CAP理論是沒有changed的
爲何會是這樣
咱們來看一個簡單的問題, 一個DB服務 搭建在兩個機房(北京,廣州),兩個DB實例同時提供寫入和讀取
1. 假設DB的更新操做是同時寫北京和廣州的DB都成功才返回成功
在沒有出現網絡故障的時候,知足CA原則,C 即個人任何一個寫入,更新操做成功並返回客戶端完成後,分佈式的全部節點在同一時間的數據徹底一致, A 即個人讀寫操做都可以成功,可是當出現網絡故障時,我不能同時保證CA,即P條件沒法知足
2. 假設DB的更新操做是隻寫本地機房成功就返回,經過binlog/oplog回放方式同步至側邊機房
這種操做保證了在出現網絡故障時,雙邊機房都是能夠提供服務的,且讀寫操做都能成功,意味着他知足了AP ,可是它不知足C,由於更新操做返回成功後,雙邊機房的DB看到的數據會存在短暫不一致,且在網絡故障時,不一致的時間差會很大(僅能保證最終一致性)
3. 假設DB的更新操做是同時寫北京和廣州的DB都成功才返回成功且網絡故障時提供降級服務
降級服務,如中止寫入,只提供讀取功能,這樣能保證數據是一致的,且網絡故障時能提供服務,知足CP原則,可是他沒法知足可用性原則
選擇權衡
經過上面的例子,咱們得知,咱們永遠沒法同時獲得CAP這3個特性,那麼咱們怎麼來權衡選擇呢?
選擇的關鍵點取決於業務場景
對於大多數互聯網應用來講(如網易門戶),由於機器數量龐大,部署節點分散,網絡故障是常態,可用性是必須須要保證的,因此只有設置一致性來保證服務的AP,一般常見的高可用服務吹噓5個9 6個9服務SLA穩定性就本都是放棄C選擇AP
對於須要確保強一致性的場景,如銀行,一般會權衡CA和CP模型,CA模型網絡故障時徹底不可用,CP模型具有部分可用性,實際的選擇須要經過業務場景來權衡(並非全部狀況CP都好於CA,只能查看信息不能更新信息有時候從產品層面還不如直接拒絕服務)
延伸
BASE(Basically Available, Soft State, Eventual Consistency 基本可用、軟狀態、最終一致性) 對CAP AP理論的延伸, Redis等衆多系統構建與這個理論之上
ACID 傳統數據庫經常使用的設計理念, ACID和BASE表明了兩種截然相反的設計哲學,分處一致性-可用性分佈圖譜的兩極。