今天給大家介紹一下如何進行CAP理論的分析。文章的內(nèi)容小編覺得不錯,現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。
成都創(chuàng)新互聯(lián)長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為天全企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站建設(shè),天全網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
CAP 理論是分布式系統(tǒng)設(shè)計中的一個重要理論,雖然它為系統(tǒng)設(shè)計提供了非常有用的依據(jù),但是也帶來了很多誤解。本文將從 CAP 誕生的背景說起,然后對理論進行解釋,最后對 CAP 在當(dāng)前背景下的一些新理解進行分析,澄清一些對 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)、最終一致性),這在當(dāng)時還不怎么被接受。因為大家還是比較看重 ACID 的優(yōu)點,不愿意放棄強一致性。因此,Brewer 提出了 CAP 理論,目的就是為了開闊分布式系統(tǒng)的設(shè)計空間,通過“三選二”的公式,解放思想,不要只抓著一致性不放。
理解了 CAP 誕生的背景,我們才能更加深入的理解 CAP 理論,以及它帶來的啟示。“三選二”的觀點雖然幫助大家開拓了設(shè)計思路,但是也帶來了很多誤解。下面我們會逐一分析,首先來看一下 CAP 理論的解釋。
CAP 定理是分布式系統(tǒng)設(shè)計中最基礎(chǔ),也是最為關(guān)鍵的理論。它指出,分布式數(shù)據(jù)存儲不可能同時滿足以下三個條件。
一致性(Consistency):每次讀取要么獲得最近寫入的數(shù)據(jù),要么獲得一個錯誤。
可用性(Availability):每次請求都能獲得一個(非錯誤)響應(yīng),但不保證返回的是最新寫入的數(shù)據(jù)。
分區(qū)容忍(Partition tolerance):盡管任意數(shù)量的消息被節(jié)點間的網(wǎng)絡(luò)丟失(或延遲),系統(tǒng)仍繼續(xù)運行。
CAP 定理表明,在存在網(wǎng)絡(luò)分區(qū)的情況下,一致性和可用性必須二選一。當(dāng)網(wǎng)絡(luò)發(fā)生分區(qū)(不同節(jié)點之間的網(wǎng)絡(luò)發(fā)生故障或者延遲較大)時,要么失去一致性(允許不同分區(qū)的數(shù)據(jù)寫入),要么失去可用性(識別到網(wǎng)絡(luò)分區(qū)時停止服務(wù))。而在沒有發(fā)生網(wǎng)絡(luò)故障時,即分布式系統(tǒng)正常運行時,一致性和可用性是可以同時被滿足的。這里需要注意的是,CAP 定理中的一致性與 ACID 數(shù)據(jù)庫事務(wù)中的一致性截然不同。ACID 的 C 指的是事務(wù)不能破壞任何數(shù)據(jù)庫規(guī)則,如鍵的唯一性。與之相比,CAP 的 C 僅指單一副本這個意義上的一致性,因此只是 ACID 一致性約束的一個嚴格的子集。
CAP 理論看起來難理解,其實只要抓住一個核心點就能推導(dǎo)出來,不用死記硬背。在出現(xiàn)網(wǎng)絡(luò)分區(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)設(shè)計的思路。首先,由于分區(qū)很少發(fā)生,那么在系統(tǒng)不存在分區(qū)的情況下沒什么理由犧牲 C 或 A。其次,C 與 A 之間的取舍可以在同一系統(tǒng)內(nèi)以非常細小的粒度反復(fù)發(fā)生,而每一次的決策可能因為具體的操作,乃至因為牽涉到特定的數(shù)據(jù)或用戶而有所不同。最后,這三種性質(zhì)都可以在程度上都可以進行度量,并不是非黑即白的有或無。可用性顯然是在 0% 到 100% 之間連續(xù)變化的,一致性分很多級別,連分區(qū)也可以細分為不同含義,如系統(tǒng)內(nèi)的不同部分對于是否存在分區(qū)可以有不一樣的認知。
在現(xiàn)實世界中,正常情況下分布式系統(tǒng)各個節(jié)點之間的通信是可靠的,不會出現(xiàn)消息丟失或者延遲很高的情況,但是網(wǎng)絡(luò)是不可靠的,總會偶爾出現(xiàn)消息丟失或者消息延遲很高的情況,這個時候不同區(qū)域的節(jié)點之間在一段時間內(nèi)就會出現(xiàn)無法通信的情況,也就是發(fā)生了分區(qū)。
分區(qū)容忍就是指分布式系統(tǒng)在出現(xiàn)網(wǎng)絡(luò)分區(qū)的時候,仍然能繼續(xù)運行,對外提供服務(wù)。注意,這里所說的仍然能夠?qū)ν馓峁┓?wù)跟可用性的要求不一樣,可用性要求的是對于任意請求都能得到響應(yīng),意味著即使出現(xiàn)網(wǎng)絡(luò)分區(qū)所有節(jié)點都能夠提供服務(wù)。而分區(qū)容忍的重點在于出現(xiàn)網(wǎng)絡(luò)分區(qū)之后,系統(tǒng)仍然是可用的(包括部分可用)。
舉個例子:使用 Paxos 進行數(shù)據(jù)復(fù)制的系統(tǒng)就是典型的 CP 系統(tǒng),即使出現(xiàn)網(wǎng)絡(luò)分區(qū),主分區(qū)也能夠提供服務(wù),所以它是分區(qū)容忍的。再舉個反例:使用 2PC 進行數(shù)據(jù)復(fù)制的系統(tǒng)沒有分區(qū)容忍的特性,當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)時,整個系統(tǒng)都會阻塞。
可用性其實很直觀:每次請求都能獲得一個(非錯誤)響應(yīng),但不保證返回的是最新寫入的數(shù)據(jù)。換一個說法就是對于分布式系統(tǒng)中的每個節(jié)點,都能夠?qū)ν獠空埱笞龀鲰憫?yīng),但不要求一致性。
經(jīng)常讓我們疑惑的問題是衡量系統(tǒng)可用性的標準是什么?其實關(guān)鍵點在于可用性的范圍,脫離了具體場景下的可用性范圍是沒有意義的。討論可用性是要有具體場景來劃分邊界的,簡單的認為某個算法是滿足可用性要求其實并不嚴謹,因為在工程實現(xiàn)中會有很多的技巧去彌補修正。
舉個例子:谷歌文檔就是非常典型的 AP 系統(tǒng),它在網(wǎng)絡(luò)斷了的情況下也能夠使用。訣竅在于它在發(fā)現(xiàn)網(wǎng)絡(luò)斷了之后會進入離線模式,允許用戶繼續(xù)進行編輯,然后在網(wǎng)絡(luò)恢復(fù)之后再對修改的內(nèi)容進行合并處理。可以發(fā)現(xiàn)對于谷歌文檔來說,用戶的瀏覽器也是它系統(tǒng)的一個節(jié)點,當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)時,它仍然能夠為用戶提供服務(wù),但是代價是放棄了一致性,因為用戶做的修改只有本地知道,服務(wù)端是不清楚的。所以在這個例子里面,可用性的范圍是包括了用戶瀏覽器在內(nèi)的,不是我們常規(guī)理解的分布式系統(tǒng)的節(jié)點一定就是服務(wù)端的機器。
值得注意的是在現(xiàn)實世界中,我們一般不會去追求完美的可用性,所以一般的說法是高可用,即盡可能保證更多的節(jié)點服務(wù)可用。這也是為什么 Paxos 這類的一致性算法越來越流行的原因之一。
討論一致性的時候必須要明確一致性的范圍,即在一定的邊界內(nèi)狀態(tài)是一致的,超出邊界之外的一致性是無從談起的。比如 Paxos 在發(fā)生網(wǎng)絡(luò)分區(qū)的時候,在一個主分區(qū)內(nèi)可以保證完備的一致性和可用性,而在分區(qū)外服務(wù)是不可用的。值得注意的是,當(dāng)系統(tǒng)在分區(qū)的時候選擇了一致性,也就是 CP,并不意味著完全失去了可用性,這取決于一致性算法的實現(xiàn)。比如標準的兩階段提交發(fā)生分區(qū)的時候是完全不可用的,而 Paxos 則保證了主分區(qū)的一致性和可用性。
經(jīng)過上面的討論可以發(fā)現(xiàn),可用性的范圍要求比一致性的范圍要求要更嚴格,CAP 理論中的可用性要求的是整個系統(tǒng)的可用性,即使出現(xiàn)部分節(jié)點不可用也算是違反了可用性約束。而一致性的要求則沒有那么高,發(fā)生網(wǎng)絡(luò)分區(qū)的時候只要保證主分區(qū)數(shù)據(jù)一致性,也認為系統(tǒng)是符合一致性約束的。為什么這么說呢?因為當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)的時候,客戶端只要通過訪問主分區(qū)就能得到最新的值(訪問超過半數(shù)以上節(jié)點,如果值都相同說明訪問的數(shù)據(jù)是最新的),此時系統(tǒng)是滿足 CAP 理論中一致性的要求的。
網(wǎng)絡(luò)分區(qū)是分布式系統(tǒng)中必然發(fā)生的事情,經(jīng)典的 CAP 理論是忽略網(wǎng)絡(luò)延遲的,但是在現(xiàn)實世界中,網(wǎng)絡(luò)延遲跟分區(qū)密切相關(guān)。也就是說當(dāng)系統(tǒng)在有限的時間內(nèi)無法通信達成一致(網(wǎng)絡(luò)延遲很高),就意味著發(fā)生了分區(qū)。此時就需要在一致性和可用性之間做出選擇:選擇繼續(xù)重試就意味著選擇一致性,放棄可用性;放棄數(shù)據(jù)一致性讓操作完成就意味著選擇了可用性。值得注意的是在分區(qū)的時候放棄數(shù)據(jù)一致性并不是意味著完全不管,一般工程實現(xiàn)會采用重試的方式達到最終一致性。
通過上面的分析可以發(fā)現(xiàn),平衡分區(qū)期間可用性和一致性的影響是分布式系統(tǒng)設(shè)計中的關(guān)鍵問題。因此,管理分區(qū)不僅是需要主動發(fā)現(xiàn)分區(qū),還需要針對分區(qū)期間產(chǎn)生的影響準備恢復(fù)過程。也就是說我們可以從另一個角度來應(yīng)用 CAP 理論:系統(tǒng)進入分區(qū)模式的時候,如何在一致性和可用性之間做出選擇。
管理分區(qū)有三個步驟:

檢測到分區(qū)開始
明確進入分區(qū)模式,限制某些操作
當(dāng)通信恢復(fù)后啟動分區(qū)恢復(fù)過程
當(dāng)系統(tǒng)進入分區(qū)模式之后,有兩種選擇:
選擇一致性:例如 Paxos 算法,只有大多數(shù)的主分區(qū)能夠進行操作,其他分區(qū)不可用,當(dāng)網(wǎng)絡(luò)恢復(fù)之后少數(shù)節(jié)點跟多數(shù)節(jié)點同步數(shù)據(jù)。
選擇可用性:例如谷歌文檔,出現(xiàn)分區(qū)時進入離線模式,等網(wǎng)絡(luò)恢復(fù)了客戶端跟服務(wù)端數(shù)據(jù)進行合并恢復(fù)。
以上就是如何進行CAP理論的分析的全部內(nèi)容了,更多與如何進行CAP理論的分析相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進行學(xué)習(xí)哈!相信小編會給大家增添更多知識,希望大家能夠支持一下創(chuàng)新互聯(lián)!
當(dāng)前名稱:如何進行CAP理論的分析
當(dāng)前地址:http://chinadenli.net/article10/ppdsdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、自適應(yīng)網(wǎng)站、網(wǎng)站收錄、網(wǎng)站設(shè)計公司、定制網(wǎng)站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)