分布式理論:CAP 定律和 Base 理論,以及為何 CAP 不可兼得
一、CAP定律
指的是在一個(gè)分布式系統(tǒng)中、Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯(cuò)性),三者不可得兼。
- 一致性(C):代表數(shù)據(jù)在任何時(shí)刻、任何分布式節(jié)點(diǎn)中所看到的都是符合預(yù)期的(等同于所有節(jié)點(diǎn)訪問同一份最新的數(shù)據(jù)副本)
- 可用性(A):代表系統(tǒng)不間斷地提供服務(wù)的能力,在集群中一部分節(jié)點(diǎn)故障后,集群整體是否還能響應(yīng)客戶端的讀寫請(qǐng)求。(對(duì)數(shù)據(jù)更新具備高可用性)
- 分區(qū)容錯(cuò)性(P):代表分布式環(huán)境中部分節(jié)點(diǎn)因網(wǎng)絡(luò)原因而彼此失聯(lián)后,即與其他節(jié)點(diǎn)形成“網(wǎng)絡(luò)分區(qū)”時(shí),系統(tǒng)仍能正確地提供服務(wù)的能力。

二、為何CAP不可兼得
下面通過一個(gè)例子說明,一個(gè)來自最終用戶的交易請(qǐng)求,將交由賬號(hào)、商家和倉(cāng)庫(kù)服務(wù)集群中某一個(gè)節(jié)點(diǎn)來完成響應(yīng):

在這套系統(tǒng)中,每一個(gè)單獨(dú)的服務(wù)節(jié)點(diǎn)都有自己的數(shù)據(jù)庫(kù)(這里是為了便于說明問題的假設(shè),在實(shí)際生產(chǎn)系統(tǒng)中,一般應(yīng)避免將用戶余額這樣的數(shù)據(jù)設(shè)計(jì)成存儲(chǔ)在多個(gè)可寫的數(shù)據(jù)庫(kù)中),假設(shè)某次交易請(qǐng)求分別由“賬號(hào)節(jié)點(diǎn) 1”、“商家節(jié)點(diǎn) 2”、“倉(cāng)庫(kù)節(jié)點(diǎn) N”聯(lián)合進(jìn)行響應(yīng)。當(dāng)用戶購(gòu)買一件價(jià)值 100 元的商品后,賬號(hào)節(jié)點(diǎn) 1 首先應(yīng)給該用戶賬號(hào)扣減 100 元貨款,它在自己數(shù)據(jù)庫(kù)扣減 100 元很容易,但它還要把這次交易變動(dòng)告知本集群的節(jié)點(diǎn) 2 到節(jié)點(diǎn) N,并要確保能正確變更商家和倉(cāng)庫(kù)集群其他賬號(hào)節(jié)點(diǎn)中的關(guān)聯(lián)數(shù)據(jù),此時(shí)將面臨以下可能的情況。
- 如果該變動(dòng)信息沒有及時(shí)同步給其他賬號(hào)節(jié)點(diǎn),將導(dǎo)致有可能發(fā)生用戶購(gòu)買另一商品時(shí),被分配給到另一個(gè)節(jié)點(diǎn)處理,由于看到賬號(hào)上有不正確的余額而錯(cuò)誤地發(fā)生了原本無法進(jìn)行的交易, 此為一致性問題。
- 如果由于要把該變動(dòng)信息同步給其他賬號(hào)節(jié)點(diǎn),必須暫時(shí)停止對(duì)該用戶的交易服務(wù),直至數(shù)據(jù)同步一致后再重新恢復(fù),將可能導(dǎo)致用戶在下一次購(gòu)買商品時(shí),因系統(tǒng)暫時(shí)無法提供服務(wù)而被拒絕交易, 此為可用性問題。
- 如果由于賬號(hào)服務(wù)集群中某一部分節(jié)點(diǎn),因出現(xiàn)網(wǎng)絡(luò)問題,無法正常與另一部分節(jié)點(diǎn)交換賬號(hào)變動(dòng)信息,此時(shí)服務(wù)集群中無論哪一部分節(jié)點(diǎn)對(duì)外提供的服務(wù)都可能是不正確的,整個(gè)集群能否承受由于部分節(jié)點(diǎn)之間的連接中斷而仍然能夠正確地提供服務(wù), 此為分區(qū)容忍性。
以上還僅僅涉及了賬號(hào)服務(wù)集群自身的 CAP 問題,對(duì)于整個(gè) Fenix's Bookstore 站點(diǎn)來說,它更是面臨著來自于賬號(hào)、商家和倉(cāng)庫(kù)服務(wù)集群帶來的 CAP 問題,譬如,用戶賬號(hào)扣款后,由于未及時(shí)通知倉(cāng)庫(kù)服務(wù)中的全部節(jié)點(diǎn),導(dǎo)致另一次交易中看到倉(cāng)庫(kù)里有不正確的庫(kù)存數(shù)據(jù)而發(fā)生超售。又譬如因涉及倉(cāng)庫(kù)中某個(gè)商品的交易正在進(jìn)行,為了同步用戶、商家和倉(cāng)庫(kù)的交易變動(dòng),而暫時(shí)鎖定該商品的交易服務(wù),導(dǎo)致了的可用性問題,等等。
三、舍棄C/A/P分別會(huì)有何影響
(1) 如果放棄分區(qū)容忍性(CA without P),意味著我們將假設(shè)節(jié)點(diǎn)之間通信永遠(yuǎn)是可靠的。永遠(yuǎn)可靠的通信在分布式系統(tǒng)中必定不成立的,這不是你想不想的問題,而是只要用到網(wǎng)絡(luò)來共享數(shù)據(jù),分區(qū)現(xiàn)象就會(huì)始終存在。在現(xiàn)實(shí)中,最容易找到放棄分區(qū)容忍性的例子便是傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)集群,這樣的集群雖然依然采用由網(wǎng)絡(luò)連接的多個(gè)節(jié)點(diǎn)來協(xié)同工作,但數(shù)據(jù)卻不是通過網(wǎng)絡(luò)來實(shí)現(xiàn)共享的。以 Oracle 的 RAC 集群為例,它的每一個(gè)節(jié)點(diǎn)均有自己獨(dú)立的 SGA、重做日志、回滾日志等部件,但各個(gè)節(jié)點(diǎn)是通過共享存儲(chǔ)中的同一份數(shù)據(jù)文件和控制文件來獲取數(shù)據(jù)的,通過共享磁盤的方式來避免出現(xiàn)網(wǎng)絡(luò)分區(qū)。因而 Oracle RAC 雖然也是由多個(gè)實(shí)例組成的數(shù)據(jù)庫(kù),但它并不能稱作是分布式數(shù)據(jù)庫(kù)。
(2) 如果放棄可用性(CP without A),意味著我們將假設(shè)一旦網(wǎng)絡(luò)發(fā)生分區(qū),節(jié)點(diǎn)之間的信息同步時(shí)間可以無限制地延長(zhǎng),此時(shí),問題相當(dāng)于退化到前面“全局事務(wù)”中討論的一個(gè)系統(tǒng)使用多個(gè)數(shù)據(jù)源的場(chǎng)景之中,我們可以通過 2PC/3PC 等手段,同時(shí)獲得分區(qū)容忍性和一致性。在現(xiàn)實(shí)中,選擇放棄可用性的 CP 系統(tǒng)情況一般用于對(duì)數(shù)據(jù)質(zhì)量要求很高的場(chǎng)合中,除了 DTP 模型的分布式數(shù)據(jù)庫(kù)事務(wù)外,著名的 HBase 也是屬于 CP 系統(tǒng),以 HBase 集群為例,假如某個(gè) RegionServer 宕機(jī)了,這個(gè) RegionServer 持有的所有鍵值范圍都將離線,直到數(shù)據(jù)恢復(fù)過程完成為止,這個(gè)過程要消耗的時(shí)間是無法預(yù)先估計(jì)的。
(3) 如果放棄一致性(AP without C),意味著我們將假設(shè)一旦發(fā)生分區(qū),節(jié)點(diǎn)之間所提供的數(shù)據(jù)可能不一致。選擇放棄一致性的 AP 系統(tǒng)目前是設(shè)計(jì)分布式系統(tǒng)的主流選擇,因?yàn)?P 是分布式網(wǎng)絡(luò)的天然屬性,你再不想要也無法丟棄;而 A 通常是建設(shè)分布式的目的,如果可用性隨著節(jié)點(diǎn)數(shù)量增加反而降低的話,很多分布式系統(tǒng)可能就失去了存在的價(jià)值,除非銀行、證券這些涉及金錢交易的服務(wù),寧可中斷也不能出錯(cuò),否則多數(shù)系統(tǒng)是不能容忍節(jié)點(diǎn)越多可用性反而越低的。目前大多數(shù) NoSQL 庫(kù)和支持分布式的緩存框架都是 AP 系統(tǒng),以 Redis 集群為例,如果某個(gè) Redis 節(jié)點(diǎn)出現(xiàn)網(wǎng)絡(luò)分區(qū),那仍不妨礙各個(gè)節(jié)點(diǎn)以自己本地存儲(chǔ)的數(shù)據(jù)對(duì)外提供緩存服務(wù),但這時(shí)有可能出現(xiàn)請(qǐng)求分配到不同節(jié)點(diǎn)時(shí)返回給客戶端的是不一致的數(shù)據(jù)
四、BASE理論
BASE是Basically Available(基本可用)、Soft state(軟狀態(tài))和 Eventually consistent(最終一致性)三個(gè)短語的縮寫。
從上面我們知道了,CAP是不可能全滿足的,所以BASE理論是對(duì)CAP中一致性和可用性權(quán)衡的結(jié)果,其來源于對(duì)大規(guī)?;ヂ?lián)網(wǎng)系統(tǒng)分布式實(shí)踐的總結(jié), 是基于CAP定理逐步演化而來的。BASE理論的核心思想是:即使無法做到強(qiáng)一致性,但每個(gè)應(yīng)用都可以根據(jù)自身業(yè)務(wù)特點(diǎn),采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性。
- Basically Available(基本可用):基本可用是指分布式系統(tǒng)在出現(xiàn)不可預(yù)知故障的時(shí)候,允許損失部分可用性—-注意,這絕不等價(jià)于系統(tǒng)不可用。比如:(1)響應(yīng)時(shí)間上的損失。正常情況下,一個(gè)在線搜索引擎需要在0.5秒之內(nèi)返回給用戶相應(yīng)的查詢結(jié)果,但由于出現(xiàn)故障,查詢結(jié)果的響應(yīng)時(shí)間增加了1~2秒 (2)系統(tǒng)功能上的損失:正常情況下,在一個(gè)電子商務(wù)網(wǎng)站上進(jìn)行購(gòu)物的時(shí)候,消費(fèi)者幾乎能夠順利完成每一筆訂單,但是在一些節(jié)日大促購(gòu)物高峰的時(shí)候,由于消費(fèi)者的購(gòu)物行為激增,為了保護(hù)購(gòu)物系統(tǒng)的穩(wěn)定性,部分消費(fèi)者可能會(huì)被引導(dǎo)到一個(gè)降級(jí)頁(yè)面
- Soft state(軟狀態(tài)):軟狀態(tài)指允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并認(rèn)為該中間狀態(tài)的存在不會(huì)影響系統(tǒng)的整體可用性,即允許系統(tǒng)在不同節(jié)點(diǎn)的數(shù)據(jù)副本之間進(jìn)行數(shù)據(jù)同步的過程存在延時(shí)
- Eventually consistent(最終一致性):最終一致性強(qiáng)調(diào)的是所有的數(shù)據(jù)副本,在經(jīng)過一段時(shí)間的同步之后,最終都能夠達(dá)到一個(gè)一致的狀態(tài)。因此,最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達(dá)到一致,而不需要實(shí)時(shí)保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致性。

























