2021年大数据ZooKeeper(四):ZooKeeper的shell操作
目錄
ZooKeeper的shell操作
客戶端連接
shell基本操作
操作命令
操作實(shí)例
節(jié)點(diǎn)屬性
???????ZooKeeper?Watcher(監(jiān)聽機(jī)制)
???????Watch機(jī)制特點(diǎn)
???????通知狀態(tài)和事件類型
???????Shell 客戶端設(shè)置watcher
ZooKeeper的shell操作
客戶端連接
運(yùn)行?zkCli.sh?–server?ip???進(jìn)入命令行工具。
bin/zkCli.sh ?-server node1:2181
shell基本操作
操作命令
| 命令 | 說明 | 參數(shù) |
| create [-s] [-e] path data acl | 創(chuàng)建Znode | -s 指定是順序節(jié)點(diǎn)<br>-e 指定是臨時(shí)節(jié)點(diǎn) |
| ls path [watch] | 列出Path下所有子Znode | |
| get path [watch] | 獲取Path對(duì)應(yīng)的Znode的數(shù)據(jù)和屬性 | |
| ls2 path [watch] | 查看Path下所有子Znode以及子Znode的屬性 | |
| set path data [version] | 更新節(jié)點(diǎn) | version 數(shù)據(jù)版本 |
| delete path [version] | 刪除節(jié)點(diǎn), 如果要?jiǎng)h除的節(jié)點(diǎn)有子Znode則無法刪除 | version 數(shù)據(jù)版本 |
| rmr path | 刪除節(jié)點(diǎn), 如果有子Znode則遞歸刪除 | |
| setquota -n|-b val path | 修改Znode配額 | -n 設(shè)置子節(jié)點(diǎn)最大個(gè)數(shù)<br>-b 設(shè)置節(jié)點(diǎn)數(shù)據(jù)最大長(zhǎng)度 |
| history | 列出歷史記錄 |
???????操作實(shí)例
1:創(chuàng)建普通節(jié)點(diǎn)
?create /app1 hello
2: 創(chuàng)建順序節(jié)點(diǎn)
create -s /app2 world
3:創(chuàng)建臨時(shí)節(jié)點(diǎn)
create -e /tempnode world
4:創(chuàng)建順序的臨時(shí)節(jié)點(diǎn)
create -s -e /tempnode2 aaa
5:獲取節(jié)點(diǎn)數(shù)據(jù)
get ?/app1
6:修改節(jié)點(diǎn)數(shù)據(jù)
set /app1 ?hadoop
7:刪除節(jié)點(diǎn)
??delete ?/app1 刪除的節(jié)點(diǎn)不能有子節(jié)點(diǎn)
??rmr ???/app1 遞歸刪除
???????節(jié)點(diǎn)屬性
每個(gè)znode都包含了一系列的屬性,通過命令get,可以獲得節(jié)點(diǎn)的屬性。
dataVersion:數(shù)據(jù)版本號(hào),每次對(duì)節(jié)點(diǎn)進(jìn)行set操作,dataVersion的值都會(huì)增加1(即使設(shè)置的是相同的數(shù)據(jù)),可有效避免了數(shù)據(jù)更新時(shí)出現(xiàn)的先后順序問題。
cversion :子節(jié)點(diǎn)的版本號(hào)。當(dāng)znode的子節(jié)點(diǎn)有變化時(shí),cversion 的值就會(huì)增加1。
cZxid :Znode創(chuàng)建的事務(wù)id。
mZxid :Znode被修改的事務(wù)id,即每次對(duì)znode的修改都會(huì)更新mZxid。
對(duì)于zk來說,每次的變化都會(huì)產(chǎn)生一個(gè)唯一的事務(wù)id,zxid(ZooKeeper Transaction Id)。通過zxid,可以確定更新操作的先后順序。例如,如果zxid1小于zxid2,說明zxid1操作先于zxid2發(fā)生,zxid對(duì)于整個(gè)zk都是唯一的,即使操作的是不同的znode。
ctime:節(jié)點(diǎn)創(chuàng)建時(shí)的時(shí)間戳.
mtime:節(jié)點(diǎn)最新一次更新發(fā)生時(shí)的時(shí)間戳.
ephemeralOwner:如果該節(jié)點(diǎn)為臨時(shí)節(jié)點(diǎn), ephemeralOwner值表示與該節(jié)點(diǎn)綁定的session id. 如果不是, ephemeralOwner值為0.
在client和server通信之前,首先需要建立連接,該連接稱為session。連接建立后,如果發(fā)生連接超時(shí)、授權(quán)失敗,或者顯式關(guān)閉連接,連接便處于CLOSED狀態(tài), 此時(shí)session結(jié)束。
???????ZooKeeper?Watcher(監(jiān)聽機(jī)制)
ZooKeeper提供了分布式數(shù)據(jù)發(fā)布/訂閱功能,一個(gè)典型的發(fā)布/訂閱模型系統(tǒng)定義了一種一對(duì)多的訂閱關(guān)系,能讓多個(gè)訂閱者同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,當(dāng)這個(gè)主題對(duì)象自身狀態(tài)變化時(shí),會(huì)通知所有訂閱者,使他們能夠做出相應(yīng)的處理。
ZooKeeper中,引入了Watcher機(jī)制來實(shí)現(xiàn)這種分布式的通知功能。ZooKeeper允許客戶端向服務(wù)端注冊(cè)一個(gè)Watcher監(jiān)聽,當(dāng)服務(wù)端的一些事件觸發(fā)了這個(gè)Watcher,那么就會(huì)向指定客戶端發(fā)送一個(gè)事件通知來實(shí)現(xiàn)分布式的通知功能。
觸發(fā)事件種類很多,如:節(jié)點(diǎn)創(chuàng)建,節(jié)點(diǎn)刪除,節(jié)點(diǎn)改變,子節(jié)點(diǎn)改變等。
總的來說可以概括Watcher為以下三個(gè)過程:客戶端向服務(wù)端注冊(cè)Watcher、服務(wù)端事件發(fā)生觸發(fā)Watcher、客戶端回調(diào)Watcher得到觸發(fā)事件情況
???????Watch機(jī)制特點(diǎn)
一次性觸發(fā)?
事件發(fā)生觸發(fā)監(jiān)聽,一個(gè)watcher event就會(huì)被發(fā)送到設(shè)置監(jiān)聽的客戶端,這種效果是一次性的,后續(xù)再次發(fā)生同樣的事件,不會(huì)再次觸發(fā)。
事件封裝
ZooKeeper使用WatchedEvent對(duì)象來封裝服務(wù)端事件并傳遞。
WatchedEvent包含了每一個(gè)事件的三個(gè)基本屬性:
通知狀態(tài)(keeperState),事件類型(EventType)和節(jié)點(diǎn)路徑(path)
event異步發(fā)送 ?
watcher的通知事件從服務(wù)端發(fā)送到客戶端是異步的。
先注冊(cè)再觸發(fā)
Zookeeper中的watch機(jī)制,必須客戶端先去服務(wù)端注冊(cè)監(jiān)聽,這樣事件發(fā)送才會(huì)觸發(fā)監(jiān)聽,通知給客戶端。
???????通知狀態(tài)和事件類型
同一個(gè)事件類型在不同的通知狀態(tài)中代表的含義有所不同,下表列舉了常見的通知狀態(tài)和事件類型。
事件封裝: Watcher?得到的事件是被封裝過的, 包括三個(gè)內(nèi)容 keeperState, eventType, path
| KeeperState | EventType | 觸發(fā)條件 | 說明 |
| None | 連接成功 | ||
| SyncConnected | NodeCreated | Znode被創(chuàng)建 | 此時(shí)處于連接狀態(tài) |
| SyncConnected | NodeDeleted | Znode被刪除 | 此時(shí)處于連接狀態(tài) |
| SyncConnected | NodeDataChanged | Znode數(shù)據(jù)被改變 | 此時(shí)處于連接狀態(tài) |
| SyncConnected | NodeChildChanged | Znode的子Znode數(shù)據(jù)被改變 | 此時(shí)處于連接狀態(tài) |
| Disconnected | None | 客戶端和服務(wù)端斷開連接 | 此時(shí)客戶端和服務(wù)器處于斷開連接狀態(tài) |
| Expired | None | 會(huì)話超時(shí) | 會(huì)收到一個(gè)SessionExpiredExceptio |
| AuthFailed | None | 權(quán)限驗(yàn)證失敗 | 會(huì)收到一個(gè)AuthFailedException |
其中連接狀態(tài)事件(type=None, path=null)不需要客戶端注冊(cè),客戶端只要有需要直接處理就行了。
???????Shell 客戶端設(shè)置watcher
設(shè)置節(jié)點(diǎn)數(shù)據(jù)變動(dòng)監(jiān)聽:
通過另一個(gè)客戶端更改節(jié)點(diǎn)數(shù)據(jù):
此時(shí)設(shè)置監(jiān)聽的節(jié)點(diǎn)收到通知:
總結(jié)
以上是生活随笔為你收集整理的2021年大数据ZooKeeper(四):ZooKeeper的shell操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据ZooKeeper(三)
- 下一篇: 2021年大数据ZooKeeper(五)