中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

大數(shù)據(jù)開發(fā)者應(yīng)該知道的分布式系統(tǒng) CAP 理論

2018-12-04    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

無論你是一個系統(tǒng)架構(gòu)師,還是一個普通開發(fā),當(dāng)你開發(fā)或者設(shè)計一個分布式系統(tǒng)的時候,CAP理論是無論如何也繞不過去的。本文就來介紹一下到底什么是CAP理論,如何證明CAP理論,以及CAP的權(quán)衡問題。

CAP理論概述

CAP理論:一個分布式系統(tǒng)最多只能同時滿足一致性(Consistency)、可用性(Availability)和分區(qū)容錯性(Partition tolerance)這三項中的兩項。

 

 

讀者需要注意的的是,CAP理論中的CA和數(shù)據(jù)庫事務(wù)中ACID的CA并完全是同一回事兒。兩者之中的A都是C都是一致性(Consistency)。CAP中的A指的是可用性(Availability),而ACID中的A指的是原子性(Atomicity),切勿混為一談。

CAP的定義

Consistency 一致性

一致性指“all nodes see the same data at the same time”,即更新操作成功并返回客戶端完成后,所有節(jié)點在同一時間的數(shù)據(jù)完全一致,所以,一致性,說的就是數(shù)據(jù)一致性。分布式的一致性

對于一致性,可以分為從客戶端和服務(wù)端兩個不同的視角。從客戶端來看,一致性主要指的是多并發(fā)訪問時更新過的數(shù)據(jù)如何獲取的問題。從服務(wù)端來看,則是更新如何復(fù)制分布到整個系統(tǒng),以保證數(shù)據(jù)最終一致。

一致性是因為有并發(fā)讀寫才有的問題,因此在理解一致性的問題時,一定要注意結(jié)合考慮并發(fā)讀寫的場景。

從客戶端角度,多進程并發(fā)訪問時,更新過的數(shù)據(jù)在不同進程如何獲取的不同策略,決定了不同的一致性。

三種一致性策略

對于關(guān)系型數(shù)據(jù)庫,要求更新過的數(shù)據(jù)能被后續(xù)的訪問都能看到,這是強一致性。

如果能容忍后續(xù)的部分或者全部訪問不到,則是弱一致性。

如果經(jīng)過一段時間后要求能訪問到更新后的數(shù)據(jù),則是最終一致性。

CAP中說,不可能同時滿足的這個一致性指的是強一致性。

Availability 可用性

可用性指“Reads and writes always succeed”,即服務(wù)一直可用,而且是正常響應(yīng)時間。

對于一個可用性的分布式系統(tǒng),每一個非故障的節(jié)點必須對每一個請求作出響應(yīng)。所以,一般我們在衡量一個系統(tǒng)的可用性的時候,都是通過停機時間來計算的。

 

 

通常我們描述一個系統(tǒng)的可用性時,我們說淘寶的系統(tǒng)可用性可以達到5個9,意思就是說他的可用水平是99.999%,即全年停機時間不超過 (1-0.99999)*365*24*60 = 5.256 min,這是一個極高的要求。

好的可用性主要是指系統(tǒng)能夠很好的為用戶服務(wù),不出現(xiàn)用戶操作失敗或者訪問超時等用戶體驗不好的情況。一個分布式系統(tǒng),上下游設(shè)計很多系統(tǒng)如負載均衡、WEB服務(wù)器、應(yīng)用代碼、數(shù)據(jù)庫服務(wù)器等,任何一個節(jié)點的不穩(wěn)定都可以影響可用性。

Partition Tolerance分區(qū)容錯性

分區(qū)容錯性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系統(tǒng)在遇到某節(jié)點或網(wǎng)絡(luò)分區(qū)故障的時候,仍然能夠?qū)ν馓峁M足一致性和可用性的服務(wù)。

分區(qū)容錯性和擴展性緊密相關(guān)。在分布式應(yīng)用中,可能因為一些分布式的原因?qū)е孪到y(tǒng)無法正常運轉(zhuǎn)。好的分區(qū)容錯性要求能夠使應(yīng)用雖然是一個分布式系統(tǒng),而看上去卻好像是在一個可以運轉(zhuǎn)正常的整體。比如現(xiàn)在的分布式系統(tǒng)中有某一個或者幾個機器宕掉了,其他剩下的機器還能夠正常運轉(zhuǎn)滿足系統(tǒng)需求,或者是機器之間有網(wǎng)絡(luò)異常,將分布式系統(tǒng)分隔未獨立的幾個部分,各個部分還能維持分布式系統(tǒng)的運作,這樣就具有好的分區(qū)容錯性。

簡單點說,就是在網(wǎng)絡(luò)中斷,消息丟失的情況下,系統(tǒng)如果還能正常工作,就是有比較好的分區(qū)容錯性。

CAP的證明

 

 

如上圖,是我們證明CAP的基本場景,網(wǎng)絡(luò)中有兩個節(jié)點N1和N2,可以簡單的理解N1和N2分別是兩臺計算機,他們之間網(wǎng)絡(luò)可以連通,N1中有一個應(yīng)用程序A,和一個數(shù)據(jù)庫V,N2也有一個應(yīng)用程序B2和一個數(shù)據(jù)庫V,F(xiàn)在,A和B是分布式系統(tǒng)的兩個部分,V是分布式系統(tǒng)的數(shù)據(jù)存儲的兩個子數(shù)據(jù)庫。

在滿足一致性的時候,N1和N2中的數(shù)據(jù)是一樣的,V0=V0。在滿足可用性的時候,用戶不管是請求N1或者N2,都會得到立即響應(yīng)。在滿足分區(qū)容錯性的情況下,N1和N2有任何一方宕機,或者網(wǎng)絡(luò)不通的時候,都不會影響N1和N2彼此之間的正常運作。

 

 

如上圖,是分布式系統(tǒng)正常運轉(zhuǎn)的流程,用戶向N1機器請求數(shù)據(jù)更新,程序A更新數(shù)據(jù)庫Vo為V1,分布式系統(tǒng)將數(shù)據(jù)進行同步操作M,將V1同步的N2中V0,使得N2中的數(shù)據(jù)V0也更新為V1,N2中的數(shù)據(jù)再響應(yīng)N2的請求。

這里,可以定義N1和N2的數(shù)據(jù)庫V之間的數(shù)據(jù)是否一樣為一致性;外部對N1和N2的請求響應(yīng)為可用行;N1和N2之間的網(wǎng)絡(luò)環(huán)境為分區(qū)容錯性。這是正常運作的場景,也是理想的場景,然而現(xiàn)實是殘酷的,當(dāng)錯誤發(fā)生的時候,一致性和可用性還有分區(qū)容錯性,是否能同時滿足,還是說要進行取舍呢?

作為一個分布式系統(tǒng),它和單機系統(tǒng)的較大區(qū)別,就在于網(wǎng)絡(luò),現(xiàn)在假設(shè)一種極端情況,N1和N2之間的網(wǎng)絡(luò)斷開了,我們要支持這種網(wǎng)絡(luò)異常,相當(dāng)于要滿足分區(qū)容錯性,能不能同時滿足一致性和響應(yīng)性呢?還是說要對他們進行取舍。

 

 

假設(shè)在N1和N2之間網(wǎng)絡(luò)斷開的時候,有用戶向N1發(fā)送數(shù)據(jù)更新請求,那N1中的數(shù)據(jù)V0將被更新為V1,由于網(wǎng)絡(luò)是斷開的,所以分布式系統(tǒng)同步操作M,所以N2中的數(shù)據(jù)依舊是V0;這個時候,有用戶向N2發(fā)送數(shù)據(jù)讀取請求,由于數(shù)據(jù)還沒有進行同步,應(yīng)用程序沒辦法立即給用戶返回的數(shù)據(jù)V1,怎么辦呢?

有二種選擇,第一,犧牲數(shù)據(jù)一致性,保證可用性。響應(yīng)舊的數(shù)據(jù)V0給用戶;

第二,犧牲可用性,保證數(shù)據(jù)一致性。阻塞等待,直到網(wǎng)絡(luò)連接恢復(fù),數(shù)據(jù)更新操作M完成之后,再給用戶響應(yīng)的數(shù)據(jù)V1。

這個過程,證明了要滿足分區(qū)容錯性的分布式系統(tǒng),只能在一致性和可用性兩者中,選擇其中一個。

CAP權(quán)衡

通過CAP理論及前面的證明,我們知道無法同時滿足一致性、可用性和分區(qū)容錯性這三個特性,那要舍棄哪個呢?

我們分三種情況來闡述一下。

CA without P

這種情況在分布式系統(tǒng)中幾乎是不存在的。首先在分布式環(huán)境下,網(wǎng)絡(luò)分區(qū)是一個自然的事實。因為分區(qū)是必然的,所以如果舍棄P,意味著要舍棄分布式系統(tǒng)。那也就沒有必要再討論CAP理論了。這也是為什么在前面的CAP證明中,我們以系統(tǒng)滿足P為前提論述了無法同時滿足C和A。

比如我們熟知的關(guān)系型數(shù)據(jù)庫,如My SQL和Oracle就是保證了可用性和數(shù)據(jù)一致性,但是他并不是個分布式系統(tǒng)。一旦關(guān)系型數(shù)據(jù)庫要考慮主備同步、集群部署等就必須要把P也考慮進來。

其實,在CAP理論中。C,A,P三者并不是平等的,CAP之父在《Spanner,真時,CAP理論》一文中寫到:

如果說Spanner真有什么特別之處,那就是谷歌的廣域網(wǎng)。Google通過建立私有網(wǎng)絡(luò)以及強大的網(wǎng)絡(luò)工程能力來保證P,在多年運營改進的基礎(chǔ)上,在生產(chǎn)環(huán)境中可以較大程度的減少分區(qū)發(fā)生,從而實現(xiàn)高可用性。

從Google的經(jīng)驗中可以得到的結(jié)論是,無法通過降低CA來提升P。要想提升系統(tǒng)的分區(qū)容錯性,需要通過提升基礎(chǔ)設(shè)施的穩(wěn)定性來保障。

所以,對于一個分布式系統(tǒng)來說。P是一個基本要求,CAP三者中,只能在CA兩者之間做權(quán)衡,并且要想盡辦法提升P。

CP without A

如果一個分布式系統(tǒng)不要求強的可用性,即容許系統(tǒng)停機或者長時間無響應(yīng)的話,就可以在CAP三者中保障CP而舍棄A。

一個保證了CP而一個舍棄了A的分布式系統(tǒng),一旦發(fā)生網(wǎng)絡(luò)故障或者消息丟失等情況,就要犧牲用戶的體驗,等待所有數(shù)據(jù)全部一致了之后再讓用戶訪問系統(tǒng)。

設(shè)計成CP的系統(tǒng)其實也不少,其中最典型的就是很多分布式數(shù)據(jù)庫,他們都是設(shè)計成CP的。在發(fā)生極端情況時,優(yōu)先保證數(shù)據(jù)的強一致性,代價就是舍棄系統(tǒng)的可用性。如Redis、HBase等,還有分布式系統(tǒng)中常用的Zookeeper也是在CAP三者之中選擇優(yōu)先保證CP的。

無論是像Redis、HBase這種分布式存儲系統(tǒng),還是像Zookeeper這種分布式協(xié)調(diào)組件。數(shù)據(jù)的一致性是他們最最基本的要求。一個連數(shù)據(jù)一致性都保證不了的分布式存儲要他有何用?

在我的Zookeeper介紹(二)——Zookeeper概述一文中其實介紹過zk關(guān)于CAP的思考,這里再簡單回顧一下:

ZooKeeper是個CP(一致性+分區(qū)容錯性)的,即任何時刻對ZooKeeper的訪問請求能得到一致的數(shù)據(jù)結(jié)果,同時系統(tǒng)對網(wǎng)絡(luò)分割具備容錯性。但是它不能保證每次服務(wù)請求的可用性,也就是在極端環(huán)境下,ZooKeeper可能會丟棄一些請求,消費者程序需要重新請求才能獲得結(jié)果。ZooKeeper是分布式協(xié)調(diào)服務(wù),它的職責(zé)是保證數(shù)據(jù)在其管轄下的所有服務(wù)之間保持同步、一致。所以就不難理解為什么ZooKeeper被設(shè)計成CP而不是AP特性的了。

AP wihtout C

要高可用并允許分區(qū),則需放棄一致性。一旦網(wǎng)絡(luò)問題發(fā)生,節(jié)點之間可能會失去聯(lián)系。為了保證高可用,需要在用戶訪問時可以馬上得到返回,則每個節(jié)點只能用本地數(shù)據(jù)提供服務(wù),而這樣會導(dǎo)致全局數(shù)據(jù)的不一致性。

這種舍棄強一致性而保證系統(tǒng)的分區(qū)容錯性和可用性的場景和案例非常多。前面我們介紹可用性的時候說到過,很多系統(tǒng)在可用性方面會做很多事情來保證系統(tǒng)的全年可用性可以達到N個9,所以,對于很多業(yè)務(wù)系統(tǒng)來說,比如淘寶的購物,12306的買票。都是在可用性和一致性之間舍棄了一致性而選擇可用性。

你在12306買票的時候肯定遇到過這種場景,當(dāng)你購買的時候提示你是有票的(但是可能實際已經(jīng)沒票了),你也正常的去輸入驗證碼,下單了。但是過了一會系統(tǒng)提示你下單失敗,余票不足。這其實就是先在可用性方面保證系統(tǒng)可以正常的服務(wù),然后在數(shù)據(jù)的一致性方面做了些犧牲,會影響一些用戶體驗,但是也不至于造成用戶流程的嚴重阻塞。

但是,我們說很多網(wǎng)站犧牲了一致性,選擇了可用性,這其實也不準確的。就比如上面的買票的例子,其實舍棄的只是強一致性。退而求其次保證了最終一致性。也就是說,雖然下單的瞬間,關(guān)于車票的庫存可能存在數(shù)據(jù)不一致的情況,但是過了一段時間,還是要保證最終一致性的。

對于多數(shù)大型互聯(lián)網(wǎng)應(yīng)用的場景,主機眾多、部署分散,而且現(xiàn)在的集群規(guī)模越來越大,所以節(jié)點故障、網(wǎng)絡(luò)故障是常態(tài),而且要保證服務(wù)可用性達到N個9,即保證P和A,舍棄C(退而求其次保證最終一致性)。雖然某些地方會影響客戶體驗,但沒達到造成用戶流程的嚴重程度。

適合的才是較好的

上面介紹了如何CAP中權(quán)衡及取舍以及典型的案例。孰優(yōu)孰略,沒有定論,只能根據(jù)場景定奪,適合的才是較好的。

對于涉及到錢財這樣不能有一絲讓步的場景,C必須保證。網(wǎng)絡(luò)發(fā)生故障寧可停止服務(wù),這是保證CA,舍棄P。比如前幾年支付寶光纜被挖斷的事件,在網(wǎng)絡(luò)出現(xiàn)故障的時候,支付寶就在可用性和數(shù)據(jù)一致性之間選擇了數(shù)據(jù)一致性,用戶感受到的是支付寶系統(tǒng)長時間宕機,但是其實背后是無數(shù)的工程師在恢復(fù)數(shù)據(jù),保證數(shù)數(shù)據(jù)的一致性。

對于其他場景,比較普遍的做法是選擇可用性和分區(qū)容錯性,舍棄強一致性,退而求其次使用最終一致性來保證數(shù)據(jù)的安全。這其實是分布式領(lǐng)域的另外一個理論——BASE理論。我們下一篇文章再來介紹。

總結(jié)

無論你是一個架構(gòu)師,還是一個普通開發(fā),在設(shè)計或開發(fā)分布式系統(tǒng)的時候,不可避免的要在CAP中做權(quán)衡。需要根據(jù)自己的系統(tǒng)的實際情況,選擇最適合自己的方案。

標簽: Google web服務(wù)器 安全 代碼 服務(wù)器 谷歌 互聯(lián)網(wǎng) 數(shù)據(jù)庫 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:數(shù)據(jù)可視化高手總結(jié)的15個技巧

下一篇:吳恩達《機器學(xué)習(xí)》筆記,哥大研究生獻上