zookeeper數(shù)據(jù)一致性知識點(diǎn)有哪些

本篇內(nèi)容主要講解“zookeeper數(shù)據(jù)一致性知識點(diǎn)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“zookeeper數(shù)據(jù)一致性知識點(diǎn)有哪些”吧!

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),舟曲網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:舟曲等地區(qū)。舟曲做網(wǎng)站價格咨詢:13518219792

時間點(diǎn)一致性(Point in time Consistency)

時間點(diǎn)一致性我覺得也可以叫做副本一致性,時間點(diǎn)一致性的定義為:

如果所有相關(guān)的數(shù)據(jù)組件在任意時刻都是一致的,那么可以稱作為時間點(diǎn)一致性。

這個定義如果你了解過CAP理論的話,那么你應(yīng)該不會太陌生。(如果不熟悉的同學(xué)可以看我這篇文章分布式事務(wù))

在CAP中的C的定義為對某個指定的客戶端來說,讀操作能返回最新的寫操作。我們可以發(fā)現(xiàn)時間點(diǎn)并沒有規(guī)定一致的需要保證是最新的,所以可能有同學(xué)會提出疑問時間點(diǎn)一致性的范圍比CAP中的一致性范圍要大一點(diǎn)。其實(shí)細(xì)想一下如果我們某個數(shù)據(jù)組件更新了數(shù)據(jù),如果為了滿足時間點(diǎn)一致性,那么我們所有相關(guān)的數(shù)據(jù)組件的數(shù)據(jù)都是一致的,所以其他的數(shù)據(jù)都會變?yōu)樽钚碌?,那么其?shí)就和CAP是一樣的,都需要滿足如果在某個節(jié)點(diǎn)更新了數(shù)據(jù),那么在其他節(jié)點(diǎn)如果都能讀取到這個最新的數(shù)據(jù)。

當(dāng)然CAP和時間點(diǎn)一致性并不是完全的一致:時間點(diǎn)一致性的定義中要求所有數(shù)據(jù)組件的數(shù)據(jù)在任意時刻都是完全一致的,但是一般來說信息傳播的速度最大是光速,其實(shí)并不能達(dá)到任意時刻一致,總有一定的時間不一致,對于我們CAP中的一致性來說只要達(dá)到讀取到最新數(shù)據(jù)即可,達(dá)到這種情況并不需要嚴(yán)格的任意時間一致。

這里我們還需要注意的是這個并不總是用于分布式系統(tǒng)中的,在我們單個機(jī)器中如果有多核處理器,我們再任意時刻訪問不同處理器對同一變量數(shù)據(jù)都需要是一致的也可以同樣適用。

 

事務(wù)一致性

一致性不僅僅可以表示數(shù)據(jù)的同時變更或相同性,還可以用來表示約束,而我們的事務(wù)一致性就是其中的一種。事務(wù)一致性就是我們平時所說的ACID中的C,其定義如下:

事務(wù)的一致性指的是在一個事務(wù)執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫都必須處于一致性狀態(tài)。如果事務(wù)成功地完成,那么系統(tǒng)中所有變化將正確地應(yīng)用,系統(tǒng)處于有效狀態(tài)。如果在事務(wù)中出現(xiàn)錯誤,那么系統(tǒng)中的所有變化將自動地回滾,系統(tǒng)返回到原始狀態(tài)。

事務(wù)一致性只能存在在事務(wù)開始前的和事務(wù)完成之后,在事務(wù)過程中數(shù)據(jù)有可能不一致。舉個例子:比如A轉(zhuǎn)100元給B,A扣減100,B加上100,在事務(wù)開始前和事務(wù)完成之后都能保證他們的帳是對上的,那么這就是事務(wù)一致性。但是在事務(wù)過程中有可能會出現(xiàn)A扣減了100元,B沒有加上100元的情況,這就是不一致。

這里一般的初學(xué)者都會把CAP和ACID中的C都會誤解成一樣的含義,其實(shí)他們其中一個表示的數(shù)據(jù)的相同,而另一個是用來表示某種約束。

 

應(yīng)用一致性

應(yīng)用一致性可以看做是約束一致性中的一種。上面的事務(wù)一致性代表的是單一數(shù)據(jù)源,如果數(shù)據(jù)源是多個,比如數(shù)據(jù)源有多個數(shù)據(jù)庫,文件系統(tǒng),緩存等。那么就需要我們應(yīng)用一致性,這里也看做是分布式事務(wù)一致性。

在應(yīng)用程序中涉及多個不同的單機(jī)事務(wù),只有在所有的單機(jī)事務(wù)完成之前和完成之后,數(shù)據(jù)是完全一致的。比如給用戶發(fā)送券和積分,券服務(wù)和積分服務(wù)是兩個服務(wù),他們各自有自己單機(jī)事務(wù),這兩個單機(jī)單機(jī)事務(wù)開始前和完成后都能保證用戶的帳是對應(yīng)上的。但是在這兩個單機(jī)事務(wù)執(zhí)行過程有可能會出現(xiàn)只送了券,沒有送積分的情況,有可能狀態(tài)不正確。

這三種一致性可以簡單的看做兩類,一個是數(shù)據(jù)副本一致,另一個是數(shù)據(jù)約束一致。接下來我更多的會介紹數(shù)據(jù)副本的一致的類型,而數(shù)據(jù)約束的一致,可以參考我之前寫過的分布式事務(wù)的那篇文章。

 

一致性的模型

再寫這篇文章之前,我一直以為一致性就那么幾個常聽說的,強(qiáng)一致,弱一致,最終一致。再查詢了一些文獻(xiàn)資料之后發(fā)現(xiàn)一致性的類型真的是非常的多,這里我挑選一些比較重要的

如果有人問你你知道哪些一致性模型呢?很多人馬上答出,強(qiáng)一致,最終一致。

很多一致性的模型最開始是用來描述內(nèi)存是否一致的,也就是最開始并不是運(yùn)用于分布式系統(tǒng)當(dāng)中的。如果我們的機(jī)器是單核的話,那么他的內(nèi)存一定是強(qiáng)一致的。如果我們的機(jī)器是多核的話,那么由于處理器并不是直接訪問的內(nèi)存而是訪問的處理器獨(dú)享的緩存,那么就有可能會出現(xiàn)不一致。再分布式中我們的每個節(jié)點(diǎn)其實(shí)就可以看成一個獨(dú)立的處理器,而我們最初運(yùn)用于內(nèi)存一致性模型,也可以運(yùn)用于我們分布式系統(tǒng)當(dāng)中。下面我會從強(qiáng)到弱講講一些常見的一致性模型。

 

線性一致性

線性一致性又叫做原子一致性,強(qiáng)一致性。線性一致性可以看做只有一個單核處理器,或者可以看做只有一個數(shù)據(jù)副本,并且所有操作都是原子的。在可線性化的分布式系統(tǒng)中,如果某個節(jié)點(diǎn)更新了數(shù)據(jù),那么在其他節(jié)點(diǎn)如果都能讀取到這個最新的數(shù)據(jù)??梢钥匆娋€性一致性和我們的CAP中的C是一致的。

舉個非線性一致性的例子,比如有個秒殺活動,你和你的朋友同時去搶購一樣?xùn)|西,有可能他那里的庫存已經(jīng)沒了,但是在你手機(jī)上顯示還有幾件,這個就違反了線性一致性,哪怕過了一會你的手機(jī)也顯示庫存沒有,也依然是違反了。

線性一致性有什么作用呢?在《DDIA》這本書中描述了下面3個作用:

  • 加鎖與主節(jié)點(diǎn)選舉:主從復(fù)制系統(tǒng)需要確保只有一個主節(jié)點(diǎn),否則會產(chǎn)生腦裂。選舉新的主節(jié)點(diǎn)一般是使用鎖:每個啟動的節(jié)點(diǎn)都需要獲得鎖。而這個鎖就需要滿足可線性化,讓所有的節(jié)點(diǎn)都同時同意哪個節(jié)點(diǎn)有鎖。我們的ZooKeeper就可以用來提供分布式鎖功能,那么我們就可以說ZooKeeper是滿足線性一致性的嗎?這個只能說說對了一部分,后面再順序一致性的時候會對ZK是什么一致性再次說明。

  • 約束與唯一性保證:比如同一個文件目錄下不允許有兩個相同的文件名,數(shù)據(jù)庫主鍵不能重復(fù),這些都需要線性化。其實(shí)這些本質(zhì)和加鎖類似,比如相同的文件名,那其實(shí)就是對這個文件名去做一個加鎖操作,然后去保存,后保存的自然會出錯。

  • 跨通道的時間依賴:之前的那個搶購的那個例子為什么會被違反呢?原因是因?yàn)槲覀兺ㄟ^朋友告知這個通道,讓我們提前知道了這個貨物已經(jīng)賣完。同樣的如果我們計(jì)算機(jī)中出現(xiàn)了多個通道。舉個例子,在用戶交易的場景下,用戶使用了50元,那么會在其余額中扣減50元,這個時候把這個事件作為一個消息隊(duì)列給發(fā)送出去,然后短信服務(wù)會查詢用戶的余額然后進(jìn)行發(fā)送短信,如果余額數(shù)據(jù)庫的從庫這個時候還沒有更新數(shù)據(jù),那么這個短信就有可能會取到用戶舊的余額。這里出現(xiàn)不一致的原因就是因?yàn)槎嗔艘粋€通道,就和我們上面朋友告知我們賣完的通道一樣。解決這個辦法可以控制某一個通道,比如說將這個用戶的余額作為參數(shù)給傳進(jìn)去,或者只讀主庫。秒殺的那個例子中,你可以不要自己的手機(jī),去用朋友的手機(jī)。

zookeeper數(shù)據(jù)一致性知識點(diǎn)有哪些  
 

順序一致性

順序一致性弱于嚴(yán)格一致性。對變量的寫操作不一定要在瞬間看到,但是,不同處理器對變量的寫操作必須在所有處理器上以相同的順序看到,這里處理器再分布式系統(tǒng)中可以換成不同的節(jié)點(diǎn)。

這里我們又再回到Zookeeper到底是什么一致性?有很多面試題都會問到Zookeeper是CP還是AP呢?很多人都會回答到Zookeeper是CP,其實(shí)這個回答并不是很嚴(yán)謹(jǐn)?shù)模覀儚木€性一致性中知道CAP中的一致性指的是線性一致性,那我們就可以說Zookeeper是線性一致性的嗎?答案是否定的。當(dāng)我們寫入一個值的時候,會交由Leader去處理,Zab協(xié)議只需要保證半數(shù)從節(jié)點(diǎn)成功即可,那么就會有節(jié)點(diǎn)的數(shù)據(jù)是老的數(shù)據(jù),這樣客戶端就有可能讀出的數(shù)據(jù)并非是最新的從而破壞了線性一致性。

Zookeeper其實(shí)實(shí)現(xiàn)的是順序一致性,在ZK中利用zxid(ZooKeeper Transaction Id),實(shí)現(xiàn)了整體順序一致性,當(dāng)然也可以認(rèn)為Zookeeper的的寫是線性一致性,讀是順序一致性。從節(jié)點(diǎn)通過zxid順序的接收leader的廣播,所以ZK不能保證所有的信息馬上看到,但是最終都會看到。當(dāng)然Zookeeper其實(shí)可以實(shí)現(xiàn)線性化,在ZK中有一個sync()命令,只要我們每次讀的時候都去調(diào)用sync()強(qiáng)制同步數(shù)據(jù),那么我們都能保證其是最新的。

順序一致性是由Lamport(Paxos算法的作者)提出的,最開始只用來定義多處理內(nèi)存的一致性,在Lamport的《How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs》中其定義了什么是順序一致性:

the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program.

這句話的大致意思是多處理器的執(zhí)行效果和單個處理器的執(zhí)行效果是一樣的,每個獨(dú)立的處理器的操作都會按照指定的順序出現(xiàn)在操作隊(duì)列。這個最開始是用于并發(fā)編程的,但是讓多處理器的執(zhí)行變得和單處理器的確是沒啥作用,后來就用于分布式系統(tǒng)當(dāng)中。在ZK中所有的寫操作都會交給Leader節(jié)點(diǎn)去做,并且所有操作的更新都會根據(jù)zxid的順序進(jìn)行更新,這里就是上面所說的指定的順序,這個隊(duì)列就是按照zxid的順序。

 

因果一致性

因果一致性是弱于順序一致性的一致性模型,順序一致性要求所有的操作的順序都必須按照某個單個處理器(節(jié)點(diǎn))的順序,而因果一致性只需要滿足有因果關(guān)系的操作是順序一致性即可。

怎么理解因果關(guān)系呢?簡單來說如果有人問你一個問題,那么你給出答案,這兩個就是因果關(guān)系,但如果你給出答案再問題之前,那么這個就違反了因果關(guān)系。
舉個簡單的例子如果節(jié)點(diǎn)1更新了數(shù)據(jù)A,節(jié)點(diǎn)2讀取數(shù)據(jù)A,并更新數(shù)據(jù)B,這里的數(shù)據(jù)B有可能是根據(jù)數(shù)據(jù)A計(jì)算出來的,所有具備因果關(guān)系,但是如果節(jié)點(diǎn)3看到的是先更新的B,再更新的A那么就破壞了因果一致性。

zookeeper數(shù)據(jù)一致性知識點(diǎn)有哪些  
 

處理器一致性

處理器一致性是更加弱的一致性模型,他只需要保證處理器看到某個處理器或者多個不同處理對相同位置的寫入都是一致的。不需要考慮因果關(guān)系,而是對同一個內(nèi)存或者同一個數(shù)據(jù)更新需要看到一致的順序。

 

FIFO一致性

FIFO一致性是比處理器一致性還更加弱的一種,它不需要保證對相同位置的寫入是一致的。
是指在一個處理器上完成的所有寫操作,將會被以它實(shí)際發(fā)生的順序通知給所有其它的處理器;但是在不同處理器上完成的寫操作也許會被其它處理器以不同于實(shí)際執(zhí)行的順序所看到。這個在分布式系統(tǒng)中反映了網(wǎng)絡(luò)中不同節(jié)點(diǎn)的延遲可能是不相同的。為了說明其和處理器一致性不同有如下例子:

zookeeper數(shù)據(jù)一致性知識點(diǎn)有哪些  

上面這個圖中,可以發(fā)現(xiàn)是違反了處理器一致性的,為什么呢因?yàn)閷懭腠樞蚴莣(x)1,w(x)2而,p4應(yīng)該是先R(x)1再R(x)2。但是這個符合FIFO一致性,F(xiàn)IFO只需要把自己的發(fā)生順序通知給其他的處理器或者節(jié)點(diǎn),不需要保證同一個值寫入順序是一致的。

最終一致性

其實(shí)除了強(qiáng)一致以外,其他的一致性都可以看作為最終一致性,只是根據(jù)一致性不同模型的不同要求又衍生出了很多具體一致性模型。當(dāng)然最簡單的最終一致性,是不需要關(guān)注中間變化的順序,只需要保證在某個時間點(diǎn)一致即可。只是這個某個時間點(diǎn)需要根據(jù)不同的系統(tǒng),不同業(yè)務(wù)再去衡量。再最終一致性完成之前,有可能返回任何的值,不會對這些值做任何順序保證。

BASE理論中的E就是最終一致。

一致性模型有什么用

上面介紹了這么多一致性模型,我們了解到越強(qiáng)的一致性他的約束條件就越多,如果我們實(shí)現(xiàn)的話成本那么也就會越大??梢钥匆奪K如果想實(shí)現(xiàn)完全的線性一致性,那么他就需要隨時都調(diào)用sync()去進(jìn)行同步數(shù)據(jù)。

再我們真實(shí)的場景中我們數(shù)據(jù)庫的主從復(fù)制模型(通過binlog復(fù)制也是順序一致性),從庫的很大作用就是為了緩解主庫的讀壓力,如果我們想盲目的達(dá)到線性化一致性,那么就必須去訪問主庫,這樣我們的從庫的意義就微乎其微了。

所以根據(jù)不同的系統(tǒng)的模型,不同的業(yè)務(wù)要求,我們對于一致性的要求是不同的,所以我們了解這些一致性的模型是有很多必要的。

到此,相信大家對“zookeeper數(shù)據(jù)一致性知識點(diǎn)有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前文章:zookeeper數(shù)據(jù)一致性知識點(diǎn)有哪些
網(wǎng)站URL:http://www.muchs.cn/article48/jdochp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、用戶體驗(yàn)、搜索引擎優(yōu)化網(wǎng)站內(nèi)鏈、品牌網(wǎng)站制作網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作