數(shù)據(jù)模型
ZK擁有一個(gè)命名空間就像一個(gè)精簡(jiǎn)的文件系統(tǒng),不同的是它的命名空間中的每個(gè)節(jié)點(diǎn)擁有它自己或者它下面子節(jié)點(diǎn)相關(guān)聯(lián)的數(shù)據(jù)。ZK中必須使用絕對(duì)路徑也就是使用“/”開頭。
Znode:
ZK目錄樹中每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)Znode。每個(gè)Znode維護(hù)這一個(gè)屬性,當(dāng)前版本、數(shù)據(jù)版本、建立時(shí)間和修改時(shí)間等,看下圖:
ZK就是使用這些屬性來實(shí)現(xiàn)特殊功能的。當(dāng)一個(gè)客戶端要對(duì)某個(gè)節(jié)點(diǎn)進(jìn)行修改時(shí),必須提供該數(shù)據(jù)的版本號(hào),當(dāng)節(jié)點(diǎn)數(shù)據(jù)發(fā)生變化是其版本號(hào)就會(huì)增加。如下圖:
Znode具有如下特性:
Watches:客戶端可以在節(jié)點(diǎn)上設(shè)置Watches(可以叫做監(jiān)視器)。當(dāng)節(jié)點(diǎn)狀態(tài)發(fā)生變化時(shí),就會(huì)觸發(fā)監(jiān)視器對(duì)應(yīng)的操作,當(dāng)監(jiān)視器被觸發(fā)時(shí),ZK服務(wù)器會(huì)向客戶端發(fā)送且只發(fā)送一個(gè)通知
數(shù)據(jù)訪問:ZK上存儲(chǔ)的數(shù)據(jù)需要被原子性的操作(要么修改成功要么回到原樣),也是就讀操作將會(huì)讀取節(jié)點(diǎn)相關(guān)所有數(shù)據(jù),寫操作也會(huì)修改節(jié)點(diǎn)相關(guān)所有數(shù)據(jù),,而且每個(gè)節(jié)點(diǎn)都有自己的ACL。
節(jié)點(diǎn)類型:ZK中有幾種節(jié)點(diǎn)類型,節(jié)點(diǎn)類型在節(jié)點(diǎn)創(chuàng)建的時(shí)候就被確定且不可改變
臨時(shí)節(jié)點(diǎn)(EPHEMERAL):臨時(shí)創(chuàng)建的,會(huì)話結(jié)束節(jié)點(diǎn)自動(dòng)被刪除,也可以手動(dòng)刪除,臨時(shí)節(jié)點(diǎn)不能擁有子節(jié)點(diǎn)
臨時(shí)順序節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL):具有臨時(shí)節(jié)點(diǎn)特征,但是它會(huì)有序列號(hào),分布式鎖中會(huì)用到該類型節(jié)點(diǎn)
持久節(jié)點(diǎn)(PERSISTENT):創(chuàng)建后永久存在,除非主動(dòng)刪除。
持久順序節(jié)點(diǎn)(PERSISTENT_SEQUENTIAL):該節(jié)點(diǎn)創(chuàng)建后持久存在,相對(duì)于持久節(jié)點(diǎn)它會(huì)在節(jié)點(diǎn)名稱后面自動(dòng)增加一個(gè)10位數(shù)字的序列號(hào),這個(gè)計(jì)數(shù)對(duì)于此節(jié)點(diǎn)的父節(jié)點(diǎn)是唯一,如果這個(gè)序列號(hào)大于2^32-1就會(huì)溢出。
創(chuàng)建順序節(jié)點(diǎn)
create -s /NODE_NAME DATA # -e參數(shù)為創(chuàng)建臨時(shí)節(jié)點(diǎn),如果不帶參數(shù)則創(chuàng)建持久節(jié)點(diǎn)ZK中的時(shí)間和版本號(hào):
ZXID:ZK節(jié)點(diǎn)狀態(tài)改變會(huì)導(dǎo)致該節(jié)點(diǎn)收到一個(gè)zxid格式的時(shí)間戳,這個(gè)時(shí)間戳是全局有序的,每次更新都會(huì)產(chǎn)生一個(gè)新的。如果zxid1的值小于zxid2,那么說明zxid2發(fā)生的改變?cè)趜xid1之后。zxid是一個(gè)唯一的事務(wù)ID,具有遞增性,一個(gè)znode的建立或者更新都會(huì)產(chǎn)生一個(gè)新的zxid值,具體時(shí)間有3個(gè)cZxid(節(jié)點(diǎn)創(chuàng)建時(shí)間)、mZxid(該節(jié)點(diǎn)修改時(shí)間,與子節(jié)點(diǎn)無關(guān))、pZxid(該節(jié)點(diǎn)的子節(jié)點(diǎn)的最后一次創(chuàng)建或者修改時(shí)間,孫子節(jié)點(diǎn)無關(guān))
version:對(duì)節(jié)點(diǎn)的每次操作都會(huì)使節(jié)點(diǎn)的版本號(hào)增加,有三個(gè)版本號(hào)dataversion(數(shù)據(jù)版本號(hào))、cversion(子節(jié)點(diǎn)版本號(hào))、aclversion(節(jié)點(diǎn)所擁有的ACL版本號(hào))
cZxid | 創(chuàng)建節(jié)點(diǎn)時(shí)的事務(wù)ID |
ctime | 創(chuàng)建節(jié)點(diǎn)時(shí)的時(shí)間 |
mZxid | 最后修改節(jié)點(diǎn)時(shí)的事務(wù)ID |
mtime | 最后修改節(jié)點(diǎn)時(shí)的時(shí)間 |
pZxid | 表示該節(jié)點(diǎn)的子節(jié)點(diǎn)列表最后一次修改的事務(wù)ID,添加子節(jié)點(diǎn)或刪除子節(jié)點(diǎn)就會(huì)影響子節(jié)點(diǎn)列表,但是修改子節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容則不影響該ID |
cversion | 子節(jié)點(diǎn)版本號(hào),子節(jié)點(diǎn)每次修改版本號(hào)加1 |
dataversion | 數(shù)據(jù)版本號(hào),數(shù)據(jù)每次修改該版本號(hào)加1 |
aclversion | 權(quán)限版本號(hào),權(quán)限每次修改該版本號(hào)加1 |
dataLength | 該節(jié)點(diǎn)的數(shù)據(jù)長(zhǎng)度 |
numChildren | 該節(jié)點(diǎn)擁有子節(jié)點(diǎn)的數(shù)量 |
版本號(hào)的作用
Zookeeper里面的版本號(hào)和我們理解的版本號(hào)不同,它表示的是對(duì)數(shù)據(jù)節(jié)點(diǎn)的內(nèi)容、子節(jié)點(diǎn)列表或者ACL信息的修改次數(shù)。節(jié)點(diǎn)創(chuàng)建時(shí)dataversion、aclversion,cversion都為0,每次修改響應(yīng)內(nèi)容其對(duì)應(yīng)的版本號(hào)加1。
這個(gè)版本號(hào)的用途就和分布式場(chǎng)景的一個(gè)鎖概念有關(guān)。比如演出售票中的一個(gè)座位,顯然每個(gè)場(chǎng)次中的每個(gè)座位都只有一個(gè),不可能賣出2次。如果A下單的時(shí)候顯示可售,他想買,那么為了保證他可以下單成功,此時(shí)別人就不能買。這時(shí)候就需要有一種機(jī)制來保證同一時(shí)刻只能有一個(gè)人去修改該座位的庫(kù)存。這就用到了鎖。鎖有悲觀鎖和樂觀鎖。
悲觀鎖:它會(huì)假定所有不同事務(wù)的處理一定會(huì)出現(xiàn)干擾,數(shù)據(jù)庫(kù)中最嚴(yán)格的并發(fā)控制策略,如果一個(gè)事務(wù)A正在對(duì)數(shù)據(jù)處理,那么在整個(gè)事務(wù)過程中,其他事務(wù)都無法對(duì)這個(gè)數(shù)據(jù)進(jìn)行更新操作,直到A事務(wù)釋放了這個(gè)鎖。
樂觀鎖:它假定所有不同事務(wù)的處理不一定會(huì)出現(xiàn)干擾,所以在大部分操作里不許加鎖,但是既然是并發(fā)就有出現(xiàn)干擾的可能,如何解決沖突就是一個(gè)問題。在樂觀鎖中當(dāng)你在提交更新請(qǐng)求之前,你要先去檢查你讀取這個(gè)數(shù)據(jù)之后該數(shù)據(jù)是否發(fā)生了變化,如果有那么你此次的提交就要放棄,如果沒有就可以提交。
Zookeeper中的版本號(hào)就是樂觀鎖,你修改節(jié)點(diǎn)數(shù)據(jù)之前會(huì)讀取這個(gè)數(shù)據(jù)并記錄該數(shù)據(jù)版本號(hào),當(dāng)你需要更新時(shí)會(huì)攜帶這個(gè)版本號(hào)去提交,如果你此時(shí)攜帶的版本號(hào)(就是你上次讀取出來的)和當(dāng)前節(jié)點(diǎn)的版本號(hào)相同則說明該數(shù)據(jù)沒有被修改過,那么你的提交就會(huì)成功,如果提交失敗說明該數(shù)據(jù)在你讀取之后和提交之前這段時(shí)間內(nèi)被修改了。
這里通過set命令并攜帶版本號(hào)提交更新,版本號(hào)相同更新就會(huì)成功。
如果你再次更新并使用之前的版本號(hào)那么就會(huì)失敗。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前名稱:Zookeeper詳解(三):Zookeeper中的Znod-創(chuàng)新互聯(lián)
鏈接分享:http://jinyejixie.com/article42/dseohc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、建站公司、動(dòng)態(tài)網(wǎng)站、ChatGPT、搜索引擎優(yōu)化、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容