您好,登錄后才能下訂單哦!
今天給大家介紹一下如何進行CAP理論的分析。文章的內(nèi)容小編覺得不錯,現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。
CAP 理論是分布式系統(tǒng)設計中的一個重要理論,雖然它為系統(tǒng)設計提供了非常有用的依據(jù),但是也帶來了很多誤解。本文將從 CAP 誕生的背景說起,然后對理論進行解釋,最后對 CAP 在當前背景下的一些新理解進行分析,澄清一些對 CAP 的誤解。
CAP 理論的是在“數(shù)據(jù)一致性 VS 可用性”的爭論中產(chǎn)生。CAP 的作者 Brewer 在 90 年代的時候就開始研究基于集群的跨區(qū)域系統(tǒng)(實質(zhì)上是早期的云計算),對于這類系統(tǒng)而言,系統(tǒng)可用性是首要目標,因此他們采用了緩存或者事后更新的方式來優(yōu)化系統(tǒng)的可用性。盡管這些方法提升了系統(tǒng)的可用性,但是犧牲了系統(tǒng)數(shù)據(jù)一致性。
Brewer 在 90 年代提出了 BASE 理論(基本可用、軟狀態(tài)、最終一致性),這在當時還不怎么被接受。因為大家還是比較看重 ACID 的優(yōu)點,不愿意放棄強一致性。因此,Brewer 提出了 CAP 理論,目的就是為了開闊分布式系統(tǒng)的設計空間,通過“三選二”的公式,解放思想,不要只抓著一致性不放。
理解了 CAP 誕生的背景,我們才能更加深入的理解 CAP 理論,以及它帶來的啟示?!叭x二”的觀點雖然幫助大家開拓了設計思路,但是也帶來了很多誤解。下面我們會逐一分析,首先來看一下 CAP 理論的解釋。
CAP 定理是分布式系統(tǒng)設計中最基礎,也是最為關鍵的理論。它指出,分布式數(shù)據(jù)存儲不可能同時滿足以下三個條件。
一致性(Consistency):每次讀取要么獲得最近寫入的數(shù)據(jù),要么獲得一個錯誤。
可用性(Availability):每次請求都能獲得一個(非錯誤)響應,但不保證返回的是最新寫入的數(shù)據(jù)。
分區(qū)容忍(Partition tolerance):盡管任意數(shù)量的消息被節(jié)點間的網(wǎng)絡丟失(或延遲),系統(tǒng)仍繼續(xù)運行。
CAP 定理表明,在存在網(wǎng)絡分區(qū)的情況下,一致性和可用性必須二選一。當網(wǎng)絡發(fā)生分區(qū)(不同節(jié)點之間的網(wǎng)絡發(fā)生故障或者延遲較大)時,要么失去一致性(允許不同分區(qū)的數(shù)據(jù)寫入),要么失去可用性(識別到網(wǎng)絡分區(qū)時停止服務)。而在沒有發(fā)生網(wǎng)絡故障時,即分布式系統(tǒng)正常運行時,一致性和可用性是可以同時被滿足的。這里需要注意的是,CAP 定理中的一致性與 ACID 數(shù)據(jù)庫事務中的一致性截然不同。ACID 的 C 指的是事務不能破壞任何數(shù)據(jù)庫規(guī)則,如鍵的唯一性。與之相比,CAP 的 C 僅指單一副本這個意義上的一致性,因此只是 ACID 一致性約束的一個嚴格的子集。
CAP 理論看起來難理解,其實只要抓住一個核心點就能推導出來,不用死記硬背。在出現(xiàn)網(wǎng)絡分區(qū)的時候,
如果系統(tǒng)不允許寫入,那么意味著降低了系統(tǒng)的可用性,但不同分區(qū)的數(shù)據(jù)能夠保持一致,即選擇了一致性。
如果系統(tǒng)允許寫入,那么意味著不同分區(qū)之間的數(shù)據(jù)產(chǎn)生不一致,系統(tǒng)可用性得到保障,即選擇可用性。
CAP 經(jīng)常被誤解,很大程度上是因為在討論 CAP 的時候可用性和一致性的作用范圍往往都是含糊不清的。如果不先定義好可用性、一致性、分區(qū)容忍在具體場景下的概念,CAP 實際上反而會束縛系統(tǒng)設計的思路。首先,由于分區(qū)很少發(fā)生,那么在系統(tǒng)不存在分區(qū)的情況下沒什么理由犧牲 C 或 A。其次,C 與 A 之間的取舍可以在同一系統(tǒng)內(nèi)以非常細小的粒度反復發(fā)生,而每一次的決策可能因為具體的操作,乃至因為牽涉到特定的數(shù)據(jù)或用戶而有所不同。最后,這三種性質(zhì)都可以在程度上都可以進行度量,并不是非黑即白的有或無。可用性顯然是在 0% 到 100% 之間連續(xù)變化的,一致性分很多級別,連分區(qū)也可以細分為不同含義,如系統(tǒng)內(nèi)的不同部分對于是否存在分區(qū)可以有不一樣的認知。
在現(xiàn)實世界中,正常情況下分布式系統(tǒng)各個節(jié)點之間的通信是可靠的,不會出現(xiàn)消息丟失或者延遲很高的情況,但是網(wǎng)絡是不可靠的,總會偶爾出現(xiàn)消息丟失或者消息延遲很高的情況,這個時候不同區(qū)域的節(jié)點之間在一段時間內(nèi)就會出現(xiàn)無法通信的情況,也就是發(fā)生了分區(qū)。
分區(qū)容忍就是指分布式系統(tǒng)在出現(xiàn)網(wǎng)絡分區(qū)的時候,仍然能繼續(xù)運行,對外提供服務。注意,這里所說的仍然能夠?qū)ν馓峁┓崭捎眯缘囊蟛灰粯?,可用性要求的是對于任意請求都能得到響應,意味著即使出現(xiàn)網(wǎng)絡分區(qū)所有節(jié)點都能夠提供服務。而分區(qū)容忍的重點在于出現(xiàn)網(wǎng)絡分區(qū)之后,系統(tǒng)仍然是可用的(包括部分可用)。
舉個例子:使用 Paxos 進行數(shù)據(jù)復制的系統(tǒng)就是典型的 CP 系統(tǒng),即使出現(xiàn)網(wǎng)絡分區(qū),主分區(qū)也能夠提供服務,所以它是分區(qū)容忍的。再舉個反例:使用 2PC 進行數(shù)據(jù)復制的系統(tǒng)沒有分區(qū)容忍的特性,當出現(xiàn)網(wǎng)絡分區(qū)時,整個系統(tǒng)都會阻塞。
可用性其實很直觀:每次請求都能獲得一個(非錯誤)響應,但不保證返回的是最新寫入的數(shù)據(jù)。換一個說法就是對于分布式系統(tǒng)中的每個節(jié)點,都能夠?qū)ν獠空埱笞龀鲰憫?,但不要求一致性?/strong>
經(jīng)常讓我們疑惑的問題是衡量系統(tǒng)可用性的標準是什么?其實關鍵點在于可用性的范圍,脫離了具體場景下的可用性范圍是沒有意義的。討論可用性是要有具體場景來劃分邊界的,簡單的認為某個算法是滿足可用性要求其實并不嚴謹,因為在工程實現(xiàn)中會有很多的技巧去彌補修正。
舉個例子:谷歌文檔就是非常典型的 AP 系統(tǒng),它在網(wǎng)絡斷了的情況下也能夠使用。訣竅在于它在發(fā)現(xiàn)網(wǎng)絡斷了之后會進入離線模式,允許用戶繼續(xù)進行編輯,然后在網(wǎng)絡恢復之后再對修改的內(nèi)容進行合并處理??梢园l(fā)現(xiàn)對于谷歌文檔來說,用戶的瀏覽器也是它系統(tǒng)的一個節(jié)點,當出現(xiàn)網(wǎng)絡分區(qū)時,它仍然能夠為用戶提供服務,但是代價是放棄了一致性,因為用戶做的修改只有本地知道,服務端是不清楚的。所以在這個例子里面,可用性的范圍是包括了用戶瀏覽器在內(nèi)的,不是我們常規(guī)理解的分布式系統(tǒng)的節(jié)點一定就是服務端的機器。
值得注意的是在現(xiàn)實世界中,我們一般不會去追求完美的可用性,所以一般的說法是高可用,即盡可能保證更多的節(jié)點服務可用。這也是為什么 Paxos 這類的一致性算法越來越流行的原因之一。
討論一致性的時候必須要明確一致性的范圍,即在一定的邊界內(nèi)狀態(tài)是一致的,超出邊界之外的一致性是無從談起的。比如 Paxos 在發(fā)生網(wǎng)絡分區(qū)的時候,在一個主分區(qū)內(nèi)可以保證完備的一致性和可用性,而在分區(qū)外服務是不可用的。值得注意的是,當系統(tǒng)在分區(qū)的時候選擇了一致性,也就是 CP,并不意味著完全失去了可用性,這取決于一致性算法的實現(xiàn)。比如標準的兩階段提交發(fā)生分區(qū)的時候是完全不可用的,而 Paxos 則保證了主分區(qū)的一致性和可用性。
經(jīng)過上面的討論可以發(fā)現(xiàn),可用性的范圍要求比一致性的范圍要求要更嚴格,CAP 理論中的可用性要求的是整個系統(tǒng)的可用性,即使出現(xiàn)部分節(jié)點不可用也算是違反了可用性約束。而一致性的要求則沒有那么高,發(fā)生網(wǎng)絡分區(qū)的時候只要保證主分區(qū)數(shù)據(jù)一致性,也認為系統(tǒng)是符合一致性約束的。為什么這么說呢?因為當出現(xiàn)網(wǎng)絡分區(qū)的時候,客戶端只要通過訪問主分區(qū)就能得到最新的值(訪問超過半數(shù)以上節(jié)點,如果值都相同說明訪問的數(shù)據(jù)是最新的),此時系統(tǒng)是滿足 CAP 理論中一致性的要求的。
網(wǎng)絡分區(qū)是分布式系統(tǒng)中必然發(fā)生的事情,經(jīng)典的 CAP 理論是忽略網(wǎng)絡延遲的,但是在現(xiàn)實世界中,網(wǎng)絡延遲跟分區(qū)密切相關。也就是說當系統(tǒng)在有限的時間內(nèi)無法通信達成一致(網(wǎng)絡延遲很高),就意味著發(fā)生了分區(qū)。此時就需要在一致性和可用性之間做出選擇:選擇繼續(xù)重試就意味著選擇一致性,放棄可用性;放棄數(shù)據(jù)一致性讓操作完成就意味著選擇了可用性。值得注意的是在分區(qū)的時候放棄數(shù)據(jù)一致性并不是意味著完全不管,一般工程實現(xiàn)會采用重試的方式達到最終一致性。
通過上面的分析可以發(fā)現(xiàn),平衡分區(qū)期間可用性和一致性的影響是分布式系統(tǒng)設計中的關鍵問題。因此,管理分區(qū)不僅是需要主動發(fā)現(xiàn)分區(qū),還需要針對分區(qū)期間產(chǎn)生的影響準備恢復過程。也就是說我們可以從另一個角度來應用 CAP 理論:系統(tǒng)進入分區(qū)模式的時候,如何在一致性和可用性之間做出選擇。
管理分區(qū)有三個步驟:
檢測到分區(qū)開始
明確進入分區(qū)模式,限制某些操作
當通信恢復后啟動分區(qū)恢復過程
當系統(tǒng)進入分區(qū)模式之后,有兩種選擇:
選擇一致性:例如 Paxos 算法,只有大多數(shù)的主分區(qū)能夠進行操作,其他分區(qū)不可用,當網(wǎng)絡恢復之后少數(shù)節(jié)點跟多數(shù)節(jié)點同步數(shù)據(jù)。
選擇可用性:例如谷歌文檔,出現(xiàn)分區(qū)時進入離線模式,等網(wǎng)絡恢復了客戶端跟服務端數(shù)據(jù)進行合并恢復。
以上就是如何進行CAP理論的分析的全部內(nèi)容了,更多與如何進行CAP理論的分析相關的內(nèi)容可以搜索億速云之前的文章或者瀏覽下面的文章進行學習哈!相信小編會給大家增添更多知識,希望大家能夠支持一下億速云!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。