zookeeper中展示所有节点_Zookeeper数据结构与监听机制
ZooKeeper數據模型Znode
在ZooKeeper中,數據信息被保存在?個數據節點上,這些節點被稱為znode。ZNode 是 Zookeeper 中最小數據單位,在 ZNode 下?又可以再掛 ZNode,這樣?層下去就形成了一個層次化命名空間 ZNode 樹,我們稱為 ZNode Tree,它采?了類似?件系統的層級樹狀結構進行管理。?下圖示例:
Znode.png在 Zookeeper 中,每一個數據節點都是?個 ZNode,上圖根?錄下有兩個節點,分別是:app1 和 app2,其中 app1 下面又有三個?節點,所有ZNode按層次化進?組織,形成這么一顆樹,ZNode的節點路徑標識?式和Unix文件系統路徑?常相似,都是由?系列使用斜杠(/)進行分割的路徑表示,開發人員可以向這個節點寫入數據,也可以在這個節點下面創建?節點。
ZNode的類型
三大類
持久性節點(Persistent)
臨時性節點(Ephemeral)
順序性節點(Sequential)
創建節點可以生成以下四種節點類型:持久節點、持久順序節點、臨時節點、臨時順序節點。不同類型的節點則會有不同的生命周期。
持久節點:是Zookeeper中最常見的?種節點類型,所謂持久節點,就是指節點被創建后會?直存在服務?,直到刪除操作主動清除
持久順序節點:就是有順序的持久節點,節點特性和持久節點是一樣的,只是額外特性表現在順序上。順序特性實質是在創建節點的時候,會在節點名后?加上一個數字后綴,來表示其順序。
臨時節點:就是會被?動清理掉的節點,它的生命周期和客戶端會話綁在一起,客戶端會話結束,節點會被刪除掉。與持久性節點不同的是,臨時節點不能創建子節點。
臨時順序節點:就是有順序的臨時節點,和持久順序節點相同,在其創建的時候會在名字后面加上數字后綴。
事務ID
首先,先了解,事務是對物理和抽象的應用狀態上的操作集合。往往在現在的概念中,?狹義上的事務通常指的是數據庫事務,?般包含了一系列對數據庫有序的讀寫操作,這些數據庫事務具有所謂的ACID特性,即原子性(Atomic)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。
?在ZooKeeper中,事務是指能夠改變ZooKeeper服務器狀態的操作,我們也稱之為事務操作或更新操作,?般包括數據節點創建與刪除、數據節點內容更新等操作。對于每?個事務請求,ZooKeeper都會為其分配一個全局唯一的事務ID,?用ZXID來表示,通常是一個 64 位的數字。每一個 ZXID對應?次更新操作,從這些ZXID中可以間接地識別出ZooKeeper處理這些更新操作請求的全局順序
zk中的事務指的是對zk服務器狀態改變的操作(create,update data,更新字節點);zk對這些事務操作都會編號,這個編號是自增長的被稱為ZXID。
ZNode的狀態信息
#?使用bin/zkCli.sh?連接到zk集群get?/zookeeper
##?第一行返回空
cZxid?=?0x0
ctime?=?Wed?Dec?31?19:00:00?EST?1969?mZxid?=?0x0
mtime?=?Wed?Dec?31?19:00:00?EST?1969?pZxid?=?0x0
cversion?=?-1
dataVersion?=?0
aclVersion?=?0
ephemeralOwner?=?0x0
dataLength?=?0
numChildren?=?1
整個ZNode節點內容包括兩部分:節點數據內容和節點狀態信息。數據內容是空,其他的屬于狀態信息。那么這些狀態信息都有什么含義呢?
cZxid 就是 Create ZXID,表示節點被創建時的事務ID。
ctime 就是 Create Time,表示節點創建時間。
mZxid 就是 Modified ZXID,表示節點最后一次被修改時的事務ID。
mtime 就是 Modified Time,表示節點最后?次被修改的時間。
pZxid 表示該節點的?子節點列列表最后一次被修改時的事務 ID。只有子節點列表變更才會更新 pZxid,子節點內容變更不會更新。
cversion 表示?節點的版本號。
dataVersion 表示內容版本號。
aclVersion 標識acl版本
ephemeralOwner 表示創建該臨時節點時的會話 sessionID,如果是持久性節點那么值為 0
dataLength 表示數據?長度。
numChildren 表示直系?子節點數。
Wacher機制
Zookeeper使用Watcher機制實現分布式數據的發布/訂閱功能
一個典型的發布/訂閱模型系統定義了一種一對多的訂閱關系,能夠讓多個訂閱者同時監聽某一個主題對象,當這個主題對象?身狀態變化時,會通知所有訂閱者,使它們能夠做出相應的處理。
在 ZooKeeper 中,引?了 Watcher機制來實現這種分布式的通知功能。ZooKeeper允許客戶端向服務端注冊一個 Watcher 監聽,當服務端的?些指定事件觸發了這個Watcher,那么Zk就會向指定客戶端發送一個事件通知來實現分布式的通知功能。
整個Watcher注冊與通知過程如圖所示。
Watcher注冊與通知過程.pngZookeeper的Watcher機制主要包括客戶端線程、客戶端WatcherManager、Zookeeper服務?三部分。
具體?工作流程為:
客戶端在向Zookeeper服務器注冊的同時,會將Watcher對象存儲在客戶端的WatcherManager當中
當Zookeeper服務?觸發Watcher事件后,會向客戶端發送通知
客戶端線程從WatcherManager中取出對應的Watcher對象來執?回調邏輯
Zookeeper的基本使用
Zookeeper命令行操作
./zkcli.sh?連接本地的zookeeper服務器器./zkCli.sh?-server?ip:port(2181)?連接指定的服務器器
鏈接上服務器后:
?helpZooKeeper?-server?host:port?cmd?args
stat?path?[watch]
set?path?data?[version]
ls?path?[watch]
delquota?[-n|-b]?path
ls2?path?[watch]
setAcl?path?acl
setquota?-n|-b?val?path?history
redo?cmdno
printwatches?on|off
delete?path?[version]
sync?path
listquota?path
rmr?path
get?path?[watch]
create?[-s]?[-e]?path?data?acl?addauth?scheme?auth
quit
getAcl?path
close
connect?host:port
創建節點
?create?[-s][-e]?path?data??其中,-s或-e分別指定節點特性,順序或臨時節點,若不指定,則創建持久節點
創建永久順序節點
創建臨時節點
?退出本次鏈接后,改節點自動刪除
創建永久節點
創建臨時順序節點
退出本次鏈接后,改節點自動刪除
讀取節點
展示路徑信息:
ls?/{path}其中,{path}表示的是指定數據節點的節點路徑
get命令可以獲取Zookeeper指定節點的數據內容和屬性信息。
get?path更新節點
set?path?datadata就是要更新的新內容
刪除節點
delete?path若刪除節點存在子節點,那么無法刪除該節點,必須先刪除子節點,再刪除?節點
Zookeeper-開源客戶端
ZkClient
ZkClient是Github上一個開源的zookeeper客戶端,在Zookeeper原?API接?之上進?了了包裝,是?個更易用的Zookeeper客戶端,同時,zkClient在內部還實現了了諸如Session超時重連、Watcher反復注冊等功能.接下來,還是從創建會話、創建節點、讀取數據、更新數據、刪除節點等?面來介紹如何使用zkClient 這個zookeeper客戶端
添加依賴
<dependency>??<groupId>org.apache.zookeepergroupId>
??<artifactId>zookeeperartifactId>
??<version>3.4.14version>
dependency>
<dependency>
??<groupId>com.101tecgroupId>
??<artifactId>zkclientartifactId>
??<version>0.2version>
dependency>
創建會話
public?class?ZkDemo?{????public?static?void?main(String[]?args)?{
????????//?獲取ZkClient對象,客戶端與集群通信的端口是2181
????????//建立了到ZK集群的會話
????????ZkClient?zkClient?=?new?ZkClient("linux122:2181");
????????System.err.println("zkClient?is?ready");
????}
}
運行結果:ZooKeeper session created 。結果表明已經成功創建會話。
創建節點
ZkClient提供了遞歸創建節點的接?,即其幫助開發者先完成父節點的創建,再創建?節點
public?class?ZkCreateNode?{????public?static?void?main(String[]?args)?{
????????ZkClient?zkClient?=?new?ZkClient("linux122:2181");
????????//副節點不存在,直接創建自節點,屬于及聯創建,createPersistent方法默認不及聯創建
????????zkClient.createPersistent("/lagouClient/lagou-c1",?true);
????????System.err.println("創建成功");
????}
}
刪除節點
public?class?ZkDeleteNode?{????public?static?void?main(String[]?args)?{
????????ZkClient?zkClient?=?new?ZkClient("linux122:2181");
????????//delete刪除的方式,只能刪除目錄下沒有子節點的目錄
//????????zkClient.delete("/hhb-test");
????????//及聯遞歸的刪除,把要刪除的目錄下面的子節點全都刪除。
????????//是先刪除子節點,在刪除父節點
????????zkClient.deleteRecursive("/lagouClient");
????}
}
總結
以上是生活随笔為你收集整理的zookeeper中展示所有节点_Zookeeper数据结构与监听机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中访问控制_一个实例:基于RBAC
- 下一篇: div旋转 vue_详细解析:uniap