CAP理論
為什么需要CAP理論
開發(fā)分布式系統(tǒng)時,我們需要根據(jù)業(yè)務(wù)特點,設(shè)計合適的分區(qū)容錯一致性模型,以實現(xiàn)集群能力。這個問題的棘手點在于:當(dāng)系統(tǒng)發(fā)生分區(qū)錯誤時,應(yīng)該如何保障系統(tǒng)穩(wěn)定運行,不影響業(yè)務(wù)。而CAP理論可以解決這個問題。
CAP理論是一個很好的思考框架,它對分布式系統(tǒng)的特性做了高度抽象,將其抽象成一致性、可用性和分區(qū)容錯性,并對特性之間的沖突做了總結(jié),即CAP不可能三角。一旦掌握它,我們就能根據(jù)業(yè)務(wù)特點,自然而然地設(shè)計出合適的分區(qū)容錯一致性模型。
什么是CAP理論
概念
在一個分布式系統(tǒng)(互相連接并共享數(shù)據(jù)的節(jié)點的集合)中,當(dāng)涉及讀寫操作時,只能保證
一致性、可用性和分區(qū)容錯性中的兩個,另一個必須被犧牲。
適用場景
CAP理論探討的是
節(jié)點互聯(lián)和共享數(shù)據(jù)的分布式系統(tǒng)。如果分布式系統(tǒng)的節(jié)點沒有互聯(lián),或沒有共享數(shù)據(jù),那就不是CAP理論討論的范圍。不過,這個條件是天然滿足的。畢竟,節(jié)點互聯(lián)和共享數(shù)據(jù)的分布式系統(tǒng)才會有數(shù)據(jù)一致性問題。
CAP理論探討的是數(shù)據(jù)的讀寫操作,不是分布式系統(tǒng)的所有功能。也就是,CAP理論針對的是數(shù)據(jù),不是整個系統(tǒng)。因為一個系統(tǒng)可能有多份數(shù)據(jù)。
CAP三個指標(biāo)
CAP 理論對分布式系統(tǒng)的特性做了高度抽象,形成了三個指標(biāo):
- 一致性:對客戶端的每次讀取操作,不管訪問的是哪個節(jié)點,返回的都是同一份最新的數(shù)據(jù),否則讀取失敗。一致性強調(diào)各節(jié)點間的數(shù)據(jù)一致。也就是說,在客戶端看來,集群和單機在數(shù)據(jù)一致性上是一樣的。
- 可用性:對客戶端的任何請求,訪問非故障節(jié)點時,都能返回合理的響應(yīng)(不是錯誤或者超時),但不保證是同一份最新數(shù)據(jù)。可用性強調(diào)服務(wù)可用,但不保證數(shù)據(jù)的一致。
- 分區(qū)容錯性:當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)[1]時,系統(tǒng)可以繼續(xù)提供服務(wù)。網(wǎng)絡(luò)分區(qū)可能是因為消息丟失,高延遲,連接中斷等等。分區(qū)容錯性強調(diào)系統(tǒng)對分區(qū)故障的容錯性。
CAP不可能三角
CAP 不可能三角指,對于一個分布式系統(tǒng)來說,一致性、可用性和分區(qū)容錯性三者不可兼得,只能選擇其中兩個。
如何使用CAP理論
- 分區(qū)容錯性(P)必選。分布式系統(tǒng)一定有網(wǎng)絡(luò)交互。只要有網(wǎng)絡(luò)交互,就一定會出現(xiàn)消息丟失等網(wǎng)絡(luò)故障。這種狀況我們必須接受,還必須保證系統(tǒng)正常運行。
-
當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)時,要么選擇一致性(C),保證數(shù)據(jù)的絕對一致;要么選擇可用性(A),保證服務(wù)可用。
- 當(dāng)選擇了一致性(C)時,即采用CP模型,如果發(fā)生網(wǎng)絡(luò)分區(qū),集群拒絕客戶端的寫請求,因為服務(wù)法保證所有節(jié)點間的數(shù)據(jù)一致。
- 當(dāng)選擇了可用性(A)時,即采用AP模型,如果發(fā)生網(wǎng)絡(luò)分區(qū),集群仍然接受客戶端的讀、寫請求,但是節(jié)點返回的可能不是最新的數(shù)據(jù)。
- 不存在網(wǎng)絡(luò)分區(qū)的情況下,即系統(tǒng)正常運行的情況下,一致性(C) 和可用性( A) 要能夠同時保證。
實戰(zhàn)
如何為系統(tǒng)設(shè)計分區(qū)容錯一致性模型?
- CAP理論針對的是數(shù)據(jù),而不是系統(tǒng);一個系統(tǒng)有多種數(shù)據(jù)。所以,一個系統(tǒng)有多種分區(qū)容錯一致性模型。
- 分區(qū)容錯性(P)必選。在發(fā)生分區(qū)故障時,系統(tǒng)必須還能正常運行。
- 當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū),選擇一致性還是可用性,取決于:數(shù)據(jù)不一致對系統(tǒng)有沒有影響?我們能容忍這種影響嗎?如果可以,選擇可用性,否則一致性。
-
網(wǎng)絡(luò)分區(qū)指的是網(wǎng)絡(luò)故障將整個網(wǎng)絡(luò)分為多個子網(wǎng)絡(luò),子網(wǎng)絡(luò)間不互通,但是子網(wǎng)絡(luò)內(nèi)的節(jié)點間是互通的。 ?