您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“zookeeper數(shù)據(jù)一致性知識(shí)點(diǎn)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“zookeeper數(shù)據(jù)一致性知識(shí)點(diǎn)有哪些”吧!
時(shí)間點(diǎn)一致性我覺得也可以叫做副本一致性,時(shí)間點(diǎn)一致性的定義為:
如果所有相關(guān)的數(shù)據(jù)組件在任意時(shí)刻都是一致的,那么可以稱作為時(shí)間點(diǎn)一致性。
這個(gè)定義如果你了解過CAP理論的話,那么你應(yīng)該不會(huì)太陌生。(如果不熟悉的同學(xué)可以看我這篇文章分布式事務(wù))
在CAP中的C的定義為對(duì)某個(gè)指定的客戶端來說,讀操作能返回最新的寫操作。我們可以發(fā)現(xiàn)時(shí)間點(diǎn)并沒有規(guī)定一致的需要保證是最新的,所以可能有同學(xué)會(huì)提出疑問時(shí)間點(diǎn)一致性的范圍比CAP中的一致性范圍要大一點(diǎn)。其實(shí)細(xì)想一下如果我們某個(gè)數(shù)據(jù)組件更新了數(shù)據(jù),如果為了滿足時(shí)間點(diǎn)一致性,那么我們所有相關(guān)的數(shù)據(jù)組件的數(shù)據(jù)都是一致的,所以其他的數(shù)據(jù)都會(huì)變?yōu)樽钚碌?,那么其?shí)就和CAP是一樣的,都需要滿足如果在某個(gè)節(jié)點(diǎn)更新了數(shù)據(jù),那么在其他節(jié)點(diǎn)如果都能讀取到這個(gè)最新的數(shù)據(jù)。
當(dāng)然CAP和時(shí)間點(diǎn)一致性并不是完全的一致:時(shí)間點(diǎn)一致性的定義中要求所有數(shù)據(jù)組件的數(shù)據(jù)在任意時(shí)刻都是完全一致的,但是一般來說信息傳播的速度最大是光速,其實(shí)并不能達(dá)到任意時(shí)刻一致,總有一定的時(shí)間不一致,對(duì)于我們CAP中的一致性來說只要達(dá)到讀取到最新數(shù)據(jù)即可,達(dá)到這種情況并不需要嚴(yán)格的任意時(shí)間一致。
這里我們還需要注意的是這個(gè)并不總是用于分布式系統(tǒng)中的,在我們單個(gè)機(jī)器中如果有多核處理器,我們?cè)偃我鈺r(shí)刻訪問不同處理器對(duì)同一變量數(shù)據(jù)都需要是一致的也可以同樣適用。
一致性不僅僅可以表示數(shù)據(jù)的同時(shí)變更或相同性,還可以用來表示約束,而我們的事務(wù)一致性就是其中的一種。事務(wù)一致性就是我們平時(shí)所說的ACID中的C,其定義如下:
事務(wù)的一致性指的是在一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫都必須處于一致性狀態(tài)。如果事務(wù)成功地完成,那么系統(tǒng)中所有變化將正確地應(yīng)用,系統(tǒng)處于有效狀態(tài)。如果在事務(wù)中出現(xiàn)錯(cuò)誤,那么系統(tǒng)中的所有變化將自動(dòng)地回滾,系統(tǒng)返回到原始狀態(tài)。
事務(wù)一致性只能存在在事務(wù)開始前的和事務(wù)完成之后,在事務(wù)過程中數(shù)據(jù)有可能不一致。舉個(gè)例子:比如A轉(zhuǎn)100元給B,A扣減100,B加上100,在事務(wù)開始前和事務(wù)完成之后都能保證他們的帳是對(duì)上的,那么這就是事務(wù)一致性。但是在事務(wù)過程中有可能會(huì)出現(xiàn)A扣減了100元,B沒有加上100元的情況,這就是不一致。
這里一般的初學(xué)者都會(huì)把CAP和ACID中的C都會(huì)誤解成一樣的含義,其實(shí)他們其中一個(gè)表示的數(shù)據(jù)的相同,而另一個(gè)是用來表示某種約束。
應(yīng)用一致性可以看做是約束一致性中的一種。上面的事務(wù)一致性代表的是單一數(shù)據(jù)源,如果數(shù)據(jù)源是多個(gè),比如數(shù)據(jù)源有多個(gè)數(shù)據(jù)庫,文件系統(tǒng),緩存等。那么就需要我們應(yīng)用一致性,這里也看做是分布式事務(wù)一致性。
在應(yīng)用程序中涉及多個(gè)不同的單機(jī)事務(wù),只有在所有的單機(jī)事務(wù)完成之前和完成之后,數(shù)據(jù)是完全一致的。比如給用戶發(fā)送券和積分,券服務(wù)和積分服務(wù)是兩個(gè)服務(wù),他們各自有自己單機(jī)事務(wù),這兩個(gè)單機(jī)單機(jī)事務(wù)開始前和完成后都能保證用戶的帳是對(duì)應(yīng)上的。但是在這兩個(gè)單機(jī)事務(wù)執(zhí)行過程有可能會(huì)出現(xiàn)只送了券,沒有送積分的情況,有可能狀態(tài)不正確。
這三種一致性可以簡單的看做兩類,一個(gè)是數(shù)據(jù)副本一致,另一個(gè)是數(shù)據(jù)約束一致。接下來我更多的會(huì)介紹數(shù)據(jù)副本的一致的類型,而數(shù)據(jù)約束的一致,可以參考我之前寫過的分布式事務(wù)的那篇文章。
再寫這篇文章之前,我一直以為一致性就那么幾個(gè)常聽說的,強(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ú)享的緩存,那么就有可能會(huì)出現(xiàn)不一致。再分布式中我們的每個(gè)節(jié)點(diǎn)其實(shí)就可以看成一個(gè)獨(dú)立的處理器,而我們最初運(yùn)用于內(nèi)存一致性模型,也可以運(yùn)用于我們分布式系統(tǒng)當(dāng)中。下面我會(huì)從強(qiáng)到弱講講一些常見的一致性模型。
線性一致性又叫做原子一致性,強(qiáng)一致性。線性一致性可以看做只有一個(gè)單核處理器,或者可以看做只有一個(gè)數(shù)據(jù)副本,并且所有操作都是原子的。在可線性化的分布式系統(tǒng)中,如果某個(gè)節(jié)點(diǎn)更新了數(shù)據(jù),那么在其他節(jié)點(diǎn)如果都能讀取到這個(gè)最新的數(shù)據(jù)??梢钥匆娋€性一致性和我們的CAP中的C是一致的。
舉個(gè)非線性一致性的例子,比如有個(gè)秒殺活動(dòng),你和你的朋友同時(shí)去搶購一樣?xùn)|西,有可能他那里的庫存已經(jīng)沒了,但是在你手機(jī)上顯示還有幾件,這個(gè)就違反了線性一致性,哪怕過了一會(huì)你的手機(jī)也顯示庫存沒有,也依然是違反了。
線性一致性有什么作用呢?在《DDIA》這本書中描述了下面3個(gè)作用:
加鎖與主節(jié)點(diǎn)選舉:主從復(fù)制系統(tǒng)需要確保只有一個(gè)主節(jié)點(diǎn),否則會(huì)產(chǎn)生腦裂。選舉新的主節(jié)點(diǎn)一般是使用鎖:每個(gè)啟動(dòng)的節(jié)點(diǎn)都需要獲得鎖。而這個(gè)鎖就需要滿足可線性化,讓所有的節(jié)點(diǎn)都同時(shí)同意哪個(gè)節(jié)點(diǎn)有鎖。我們的ZooKeeper就可以用來提供分布式鎖功能,那么我們就可以說ZooKeeper是滿足線性一致性的嗎?這個(gè)只能說說對(duì)了一部分,后面再順序一致性的時(shí)候會(huì)對(duì)ZK是什么一致性再次說明。
約束與唯一性保證:比如同一個(gè)文件目錄下不允許有兩個(gè)相同的文件名,數(shù)據(jù)庫主鍵不能重復(fù),這些都需要線性化。其實(shí)這些本質(zhì)和加鎖類似,比如相同的文件名,那其實(shí)就是對(duì)這個(gè)文件名去做一個(gè)加鎖操作,然后去保存,后保存的自然會(huì)出錯(cuò)。
跨通道的時(shí)間依賴:之前的那個(gè)搶購的那個(gè)例子為什么會(huì)被違反呢?原因是因?yàn)槲覀兺ㄟ^朋友告知這個(gè)通道,讓我們提前知道了這個(gè)貨物已經(jīng)賣完。同樣的如果我們計(jì)算機(jī)中出現(xiàn)了多個(gè)通道。舉個(gè)例子,在用戶交易的場景下,用戶使用了50元,那么會(huì)在其余額中扣減50元,這個(gè)時(shí)候把這個(gè)事件作為一個(gè)消息隊(duì)列給發(fā)送出去,然后短信服務(wù)會(huì)查詢用戶的余額然后進(jìn)行發(fā)送短信,如果余額數(shù)據(jù)庫的從庫這個(gè)時(shí)候還沒有更新數(shù)據(jù),那么這個(gè)短信就有可能會(huì)取到用戶舊的余額。這里出現(xiàn)不一致的原因就是因?yàn)槎嗔艘粋€(gè)通道,就和我們上面朋友告知我們賣完的通道一樣。解決這個(gè)辦法可以控制某一個(gè)通道,比如說將這個(gè)用戶的余額作為參數(shù)給傳進(jìn)去,或者只讀主庫。秒殺的那個(gè)例子中,你可以不要自己的手機(jī),去用朋友的手機(jī)。
順序一致性弱于嚴(yán)格一致性。對(duì)變量的寫操作不一定要在瞬間看到,但是,不同處理器對(duì)變量的寫操作必須在所有處理器上以相同的順序看到,這里處理器再分布式系統(tǒng)中可以換成不同的節(jié)點(diǎn)。
這里我們又再回到Zookeeper到底是什么一致性?有很多面試題都會(huì)問到Zookeeper是CP還是AP呢?很多人都會(huì)回答到Zookeeper是CP,其實(shí)這個(gè)回答并不是很嚴(yán)謹(jǐn)?shù)?,我們從線性一致性中知道CAP中的一致性指的是線性一致性,那我們就可以說Zookeeper是線性一致性的嗎?答案是否定的。當(dāng)我們寫入一個(gè)值的時(shí)候,會(huì)交由Leader去處理,Zab協(xié)議只需要保證半數(shù)從節(jié)點(diǎn)成功即可,那么就會(huì)有節(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不能保證所有的信息馬上看到,但是最終都會(huì)看到。當(dāng)然Zookeeper其實(shí)可以實(shí)現(xiàn)線性化,在ZK中有一個(gè)sync()命令,只要我們每次讀的時(shí)候都去調(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í)行效果和單個(gè)處理器的執(zhí)行效果是一樣的,每個(gè)獨(dú)立的處理器的操作都會(huì)按照指定的順序出現(xiàn)在操作隊(duì)列。這個(gè)最開始是用于并發(fā)編程的,但是讓多處理器的執(zhí)行變得和單處理器的確是沒啥作用,后來就用于分布式系統(tǒng)當(dāng)中。在ZK中所有的寫操作都會(huì)交給Leader節(jié)點(diǎn)去做,并且所有操作的更新都會(huì)根據(jù)zxid的順序進(jìn)行更新,這里就是上面所說的指定的順序,這個(gè)隊(duì)列就是按照zxid的順序。
因果一致性是弱于順序一致性的一致性模型,順序一致性要求所有的操作的順序都必須按照某個(gè)單個(gè)處理器(節(jié)點(diǎn))的順序,而因果一致性只需要滿足有因果關(guān)系的操作是順序一致性即可。
怎么理解因果關(guān)系呢?簡單來說如果有人問你一個(gè)問題,那么你給出答案,這兩個(gè)就是因果關(guān)系,但如果你給出答案再問題之前,那么這個(gè)就違反了因果關(guān)系。
舉個(gè)簡單的例子如果節(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那么就破壞了因果一致性。
處理器一致性是更加弱的一致性模型,他只需要保證處理器看到某個(gè)處理器或者多個(gè)不同處理對(duì)相同位置的寫入都是一致的。不需要考慮因果關(guān)系,而是對(duì)同一個(gè)內(nèi)存或者同一個(gè)數(shù)據(jù)更新需要看到一致的順序。
FIFO一致性是比處理器一致性還更加弱的一種,它不需要保證對(duì)相同位置的寫入是一致的。
是指在一個(gè)處理器上完成的所有寫操作,將會(huì)被以它實(shí)際發(fā)生的順序通知給所有其它的處理器;但是在不同處理器上完成的寫操作也許會(huì)被其它處理器以不同于實(shí)際執(zhí)行的順序所看到。這個(gè)在分布式系統(tǒng)中反映了網(wǎng)絡(luò)中不同節(jié)點(diǎn)的延遲可能是不相同的。為了說明其和處理器一致性不同有如下例子:
其實(shí)除了強(qiáng)一致以外,其他的一致性都可以看作為最終一致性,只是根據(jù)一致性不同模型的不同要求又衍生出了很多具體一致性模型。當(dāng)然最簡單的最終一致性,是不需要關(guān)注中間變化的順序,只需要保證在某個(gè)時(shí)間點(diǎn)一致即可。只是這個(gè)某個(gè)時(shí)間點(diǎn)需要根據(jù)不同的系統(tǒng),不同業(yè)務(wù)再去衡量。再最終一致性完成之前,有可能返回任何的值,不會(huì)對(duì)這些值做任何順序保證。
BASE理論中的E就是最終一致。
上面介紹了這么多一致性模型,我們了解到越強(qiáng)的一致性他的約束條件就越多,如果我們實(shí)現(xiàn)的話成本那么也就會(huì)越大??梢钥匆奪K如果想實(shí)現(xiàn)完全的線性一致性,那么他就需要隨時(shí)都調(diào)用sync()去進(jìn)行同步數(shù)據(jù)。
再我們真實(shí)的場景中我們數(shù)據(jù)庫的主從復(fù)制模型(通過binlog復(fù)制也是順序一致性),從庫的很大作用就是為了緩解主庫的讀壓力,如果我們想盲目的達(dá)到線性化一致性,那么就必須去訪問主庫,這樣我們的從庫的意義就微乎其微了。
所以根據(jù)不同的系統(tǒng)的模型,不同的業(yè)務(wù)要求,我們對(duì)于一致性的要求是不同的,所以我們了解這些一致性的模型是有很多必要的。
到此,相信大家對(duì)“zookeeper數(shù)據(jù)一致性知識(shí)點(diǎn)有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。