數(shù)據(jù)模型
網(wǎng)站建設哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序設計、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了虞城免費建站歡迎大家使用!
ZK擁有一個命名空間就像一個精簡的文件系統(tǒng),不同的是它的命名空間中的每個節(jié)點擁有它自己或者它下面子節(jié)點相關聯(lián)的數(shù)據(jù)。ZK中必須使用絕對路徑也就是使用“/”開頭。
Znode:
ZK目錄樹中每個節(jié)點對應一個Znode。每個Znode維護這一個屬性,當前版本、數(shù)據(jù)版本、建立時間和修改時間等,看下圖:
ZK就是使用這些屬性來實現(xiàn)特殊功能的。當一個客戶端要對某個節(jié)點進行修改時,必須提供該數(shù)據(jù)的版本號,當節(jié)點數(shù)據(jù)發(fā)生變化是其版本號就會增加。如下圖:
Znode具有如下特性:
Watches:客戶端可以在節(jié)點上設置Watches(可以叫做監(jiān)視器)。當節(jié)點狀態(tài)發(fā)生變化時,就會觸發(fā)監(jiān)視器對應的操作,當監(jiān)視器被觸發(fā)時,ZK服務器會向客戶端發(fā)送且只發(fā)送一個通知
數(shù)據(jù)訪問:ZK上存儲的數(shù)據(jù)需要被原子性的操作(要么修改成功要么回到原樣),也是就讀操作將會讀取節(jié)點相關所有數(shù)據(jù),寫操作也會修改節(jié)點相關所有數(shù)據(jù),,而且每個節(jié)點都有自己的ACL。
節(jié)點類型:ZK中有幾種節(jié)點類型,節(jié)點類型在節(jié)點創(chuàng)建的時候就被確定且不可改變
臨時節(jié)點(EPHEMERAL):臨時創(chuàng)建的,會話結束節(jié)點自動被刪除,也可以手動刪除,臨時節(jié)點不能擁有子節(jié)點
臨時順序節(jié)點(EPHEMERAL_SEQUENTIAL):具有臨時節(jié)點特征,但是它會有序列號,分布式鎖中會用到該類型節(jié)點
持久節(jié)點(PERSISTENT):創(chuàng)建后永久存在,除非主動刪除。
持久順序節(jié)點(PERSISTENT_SEQUENTIAL):該節(jié)點創(chuàng)建后持久存在,相對于持久節(jié)點它會在節(jié)點名稱后面自動增加一個10位數(shù)字的序列號,這個計數(shù)對于此節(jié)點的父節(jié)點是唯一,如果這個序列號大于2^32-1就會溢出。
創(chuàng)建順序節(jié)點
create -s /NODE_NAME DATA # -e參數(shù)為創(chuàng)建臨時節(jié)點,如果不帶參數(shù)則創(chuàng)建持久節(jié)點
ZK中的時間和版本號:
ZXID:ZK節(jié)點狀態(tài)改變會導致該節(jié)點收到一個zxid格式的時間戳,這個時間戳是全局有序的,每次更新都會產生一個新的。如果zxid1的值小于zxid2,那么說明zxid2發(fā)生的改變在zxid1之后。zxid是一個唯一的事務ID,具有遞增性,一個znode的建立或者更新都會產生一個新的zxid值,具體時間有3個cZxid(節(jié)點創(chuàng)建時間)、mZxid(該節(jié)點修改時間,與子節(jié)點無關)、pZxid(該節(jié)點的子節(jié)點的最后一次創(chuàng)建或者修改時間,孫子節(jié)點無關)
version:對節(jié)點的每次操作都會使節(jié)點的版本號增加,有三個版本號dataversion(數(shù)據(jù)版本號)、cversion(子節(jié)點版本號)、aclversion(節(jié)點所擁有的ACL版本號)
cZxid | 創(chuàng)建節(jié)點時的事務ID |
ctime | 創(chuàng)建節(jié)點時的時間 |
mZxid | 最后修改節(jié)點時的事務ID |
mtime | 最后修改節(jié)點時的時間 |
pZxid | 表示該節(jié)點的子節(jié)點列表最后一次修改的事務ID,添加子節(jié)點或刪除子節(jié)點就會影響子節(jié)點列表,但是修改子節(jié)點的數(shù)據(jù)內容則不影響該ID |
cversion | 子節(jié)點版本號,子節(jié)點每次修改版本號加1 |
dataversion | 數(shù)據(jù)版本號,數(shù)據(jù)每次修改該版本號加1 |
aclversion | 權限版本號,權限每次修改該版本號加1 |
dataLength | 該節(jié)點的數(shù)據(jù)長度 |
numChildren | 該節(jié)點擁有子節(jié)點的數(shù)量 |
版本號的作用
Zookeeper里面的版本號和我們理解的版本號不同,它表示的是對數(shù)據(jù)節(jié)點的內容、子節(jié)點列表或者ACL信息的修改次數(shù)。節(jié)點創(chuàng)建時dataversion、aclversion,cversion都為0,每次修改響應內容其對應的版本號加1。
這個版本號的用途就和分布式場景的一個鎖概念有關。比如演出售票中的一個座位,顯然每個場次中的每個座位都只有一個,不可能賣出2次。如果A下單的時候顯示可售,他想買,那么為了保證他可以下單成功,此時別人就不能買。這時候就需要有一種機制來保證同一時刻只能有一個人去修改該座位的庫存。這就用到了鎖。鎖有悲觀鎖和樂觀鎖。
悲觀鎖:它會假定所有不同事務的處理一定會出現(xiàn)干擾,數(shù)據(jù)庫中最嚴格的并發(fā)控制策略,如果一個事務A正在對數(shù)據(jù)處理,那么在整個事務過程中,其他事務都無法對這個數(shù)據(jù)進行更新操作,直到A事務釋放了這個鎖。
樂觀鎖:它假定所有不同事務的處理不一定會出現(xiàn)干擾,所以在大部分操作里不許加鎖,但是既然是并發(fā)就有出現(xiàn)干擾的可能,如何解決沖突就是一個問題。在樂觀鎖中當你在提交更新請求之前,你要先去檢查你讀取這個數(shù)據(jù)之后該數(shù)據(jù)是否發(fā)生了變化,如果有那么你此次的提交就要放棄,如果沒有就可以提交。
Zookeeper中的版本號就是樂觀鎖,你修改節(jié)點數(shù)據(jù)之前會讀取這個數(shù)據(jù)并記錄該數(shù)據(jù)版本號,當你需要更新時會攜帶這個版本號去提交,如果你此時攜帶的版本號(就是你上次讀取出來的)和當前節(jié)點的版本號相同則說明該數(shù)據(jù)沒有被修改過,那么你的提交就會成功,如果提交失敗說明該數(shù)據(jù)在你讀取之后和提交之前這段時間內被修改了。
這里通過set命令并攜帶版本號提交更新,版本號相同更新就會成功。
如果你再次更新并使用之前的版本號那么就會失敗。
名稱欄目:Zookeeper詳解(三):Zookeeper中的Znod
地址分享:http://aaarwkj.com/article30/pjsdpo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內鏈、用戶體驗、標簽優(yōu)化、定制開發(fā)、移動網(wǎng)站建設、域名注冊
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)