面试官:说出几个你熟悉的 Zookeeper 命令
來源:blog.csdn.net/xuan_lu/
首先說明一下環境,溪源使用zookeeper版本為3.5.10;由于版本不同,命令語法略有差異,提前說明一下,但是基本原理一致,大家可以通過help命令查看自己當前版本的命令語法。
客戶端、服務器命令
切換至zookeeper安裝目錄下的bin目錄輸入以下命令啟動服務器或者客戶端 1.?啟動ZK服務:?./zkServer.sh?start 2.?查看ZK服務狀態:?./zkServer.sh?status 3.?停止ZK服務:?./zkServer.sh?stop 4.?重啟ZK服務:?./zkServer.sh?restart 5.?連接內部客戶端:?./zkCli.sh或者./zkCli.sh?-server?127.0.0.1(指定連接服務器IP):2181節點屬性
學習zookeeper常用命令之前先介紹一下節點屬性的含義。
-`cZxid`:當前數據結點創建時的事務ID——針對于`zookeeper`數據結點的管理:我們對結點數據的一些寫操作都會導致`zookeeper`自動地為我們去開啟一個事務,并且自動地去為每一個事務維護一個事務`ID` -?`ctime`:當前數據結點創建時的時間 -?`mZxid`:當前數據結點最后一次更新時的事務ID -?`mtime`:當前數據結點最后一次更新時的時間 -?`pZxid`:當前數據節點最后一次修改**其**子節點**更改的`zxid`。修改指(增加子節點、刪除子節點),并不指其子節點的數據發生改變; -?`cversion`:當前數據節點對應**子結點**的更改次數 -?`dataVersion`:當前結點數據的發生更改的次數 -?`aclVersion`:當前結點的ACL更改次數——類似`linux`的權限列表,維護的是當前結點的權限列表被修改的次數 -?`ephemeralOwner`:如果結點是臨時結點,則表示創建該結點的會話的`SessionID`;如果是持久結點,該屬性值為0 -?`dataLength`:當前節點的數據內容長度 -?`numChildren`:當前數據結點的子結點個數help命令
zookeeper基本常用命令通過help查看,遇到錯誤命令可以直接查詢語法。
ZooKeeper?-server?host:port?cmd?argsaddauth?scheme?authcloseconfig?[-c]?[-w]?[-s]connect?host:portcreate?[-s]?[-e]?[-c]?[-t?ttl]?path?[data]?[acl]delete?[-v?version]?pathdeleteall?pathdelquota?[-n|-b]?pathget?[-s]?[-w]?pathgetAcl?[-s]?pathhistorylistquota?pathls?[-s]?[-w]?[-R]?pathls2?path?[watch]printwatches?on|offquitreconfig?[-s]?[-v?version]?[[-file?path]?|?[-members?serverID=host:port1:port2;port3[,...]*]]?|?[-add?serverId=host:port1:port2;port3[,...]]*?[-remove?serverId[,...]*]redo?cmdnoremovewatches?path?[-c|-d|-a]?[-l]rmr?pathset?[-s]?[-v?version]?path?datasetAcl?[-s]?[-v?version]?[-R]?path?aclsetquota?-n|-b?val?pathstat?[-w]?pathsync?path Command?not?found:?Command?not?found?help新增、查詢節點
新增命令:create [-s] [-e] path data其中 -s 為有序結點,-e 臨時結點(默認是持久結點)
查詢命令:get [-s] [-w] path-s 查看節點所有信息:數據信息+節點屬性值 -w 查看節點數據信息
實戰
修改節點
命令:set [-s] [-v version] path data可以直接進行修改;也可以選擇使用版本號 -v + 版本號,類似樂觀鎖原理;
刪除節點
命令:
delete [-v version] path:可以直接刪除,也可以指定版本號刪除,此命令只能刪除單個節點,如果存在子節點,則需要依次刪除子節點
deleteall path:直接刪除指定的所有節點
[zk:?localhost:2181(CONNECTED)?0]?delete?/node1 [zk:?localhost:2181(CONNECTED)?1]?get?-s?/node1 org.apache.zookeeper.KeeperException$NoNodeException:?KeeperErrorCode?=?NoNode?for?/node1 [zk:?localhost:2181(CONNECTED)?4]?create?/node1?"node1" Created?/node1 [zk:?localhost:2181(CONNECTED)?5]?create?/node1/node11?"node11" Created?/node1/node11 //使用delete刪除存在子節點的節點,刪除失敗 [zk:?localhost:2181(CONNECTED)?6]?delete?/node1 Node?not?empty:?/node1 [zk:?localhost:2181(CONNECTED)?7]?get?-s?/node1 node1 cZxid?=?0x4f ctime?=?Wed?Jul?29?21:53:37?CST?2020 mZxid?=?0x4f mtime?=?Wed?Jul?29?21:53:37?CST?2020 pZxid?=?0x50 cversion?=?1 dataVersion?=?0 aclVersion?=?0 ephemeralOwner?=?0x0 dataLength?=?5 numChildren?=?1 [zk:?localhost:2181(CONNECTED)?8]?deleteall?/node1 [zk:?localhost:2181(CONNECTED)?9]?get?/node1 org.apache.zookeeper.KeeperException$NoNodeException:?KeeperErrorCode?=?NoNode?for?/node1注意:刪除存在子節點時,命令不要再使用rmr,此命令已經無效。
[zk:?localhost:2181(CONNECTED)?17]?rmr?/node1 The?command?'rmr'?has?been?deprecated.?Please?use?'deleteall'?instead.查看子節點列表
命令:
ls [-s] [-w] [-R] path:
ls2?path?[watch] [zk:?localhost:2181(CONNECTED)?19]?ls?/ [a0000000001,?b0000000002,?c,?hadoop,?seqNode10000000011,?zookeeper] [zk:?localhost:2181(CONNECTED)?20]?ls?-s?/ [a0000000001,?b0000000002,?c,?hadoop,?seqNode10000000011,?zookeeper]cZxid?=?0x0 ctime?=?Thu?Jan?01?08:00:00?CST?1970 mZxid?=?0x0 mtime?=?Thu?Jan?01?08:00:00?CST?1970 pZxid?=?0x53 cversion?=?22 dataVersion?=?0 aclVersion?=?0 ephemeralOwner?=?0x0 dataLength?=?0 numChildren?=?6[zk:?localhost:2181(CONNECTED)?21]?create?/node1?"node1" Created?/node1 //當前節點下沒有子節點,返回空數組 [zk:?localhost:2181(CONNECTED)?22]?ls?/node1 [] [zk:?localhost:2181(CONNECTED)?23]?create?/node1/node11?"node11" Created?/node1/node11 [zk:?localhost:2181(CONNECTED)?24]?ls?/node1 [node11]查看節點狀態
使用stat命令查看節點狀態,與get命令的區別是此命令不返回數據信息;
[zk:?localhost:2181(CONNECTED)?25]?stat?/node1 cZxid?=?0x55 ctime?=?Wed?Jul?29?22:05:16?CST?2020 mZxid?=?0x55 mtime?=?Wed?Jul?29?22:05:16?CST?2020 pZxid?=?0x56 cversion?=?1 dataVersion?=?0 aclVersion?=?0 ephemeralOwner?=?0x0 dataLength?=?5 numChildren?=?1監聽器
特殊說明get path [watch]命令已被廢棄:
[zk:?localhost:2181(CONNECTED)?27]?get?/node1?watch 'get?path?[watch]'?has?been?deprecated.?Please?use?'get?[-s]?[-w]?path'?instead. node1使用?get [-s] [-w] path注冊的監聽器能夠在結點內容發生改變?的時候,向客戶端發出通知。需要注意的是zookeeper的觸發器是一次性的(One-time trigger),即觸發一次后就會立即失效。
//一個窗口監聽,新打開一個窗口修改節點數據 [zk:?localhost:2181(CONNECTED)?29]?get?-w?/node1 node1 //收到修改信息 [zk:?localhost:2181(CONNECTED)?30] WATCHER::WatchedEvent?state:SyncConnected?type:NodeDataChanged?path:/node1//另一個窗口修改節點: [zk:?localhost:2181(CONNECTED)?0]?set?/node1?"set?node1" 圖片權限控制
zookeeper類似文件系統,client可以創建結點、更新結點、刪除結點,那么如何做到結點的權限控制呢?zookeeper的?access control list?訪問控制列表可以做到這一點。acl權限控制,使用scheme:id:permission來標識,主要涵蓋3個方面:
權限模式(scheme):授權的策略
授權對象(id):授權的對象
權限(permission):授予的權限權限模式
| 方案 | 描述 | | --- | --- | | world | 只有一個用戶:anyone,代表登錄zookeeper所有人(默認) | | ip | 對客戶端使用IP地址認證 | | auth | 使用已添加認證的用戶認證 | | digest | 使用"用戶名:密碼"方式認證 |
授權對象
給誰授予權限
授權對象ID是指,權限賦予的實體,例如:IP地址或用戶
權限
create、delete、read、writer、admin也就是 增、刪、查、改、管理權限,這5種權限簡寫為 c d r w a,注意:這五種權限中,有的權限并不是對結點自身操作的例如:delete是指對子結點?的刪除權限。可以試圖刪除父結點,但是子結點必須刪除干凈,所以delete的權限也是很有用的
| create | c | 可以創建子結點 |
| delete | d | 可以刪除子結點(僅下一級結點) |
| read | r | 可以讀取結點數據以及顯示子結點列表 |
| write | w | 可以設置結點數據 |
| admin | a | 可以設置結點訪問控制權限列表 |
授權的相關命令
| getAcl | getAcl | 讀取ACL權限 |
| setAcl | setAcl | 設置ACL權限 |
| addauth | addauth | 添加認證用戶 |
world模式:
IP模式:需要兩臺虛擬機一起授權的話需要用逗號?將授權列表隔開:setAcl /ipNode ip:192.168.103.133:cdrwa,ip:192.168.103.132:cdrwa
auth模式:命令:addauth digest :****setAcl auth::
Digest模式:命令:**setAcl digest:::**密碼是經過SHA1以及BASE64處理的密文,在shell 中可以通過以下命令計算:
建立新的窗口,計算密碼
[root@izbp14najjyuhkvm4qbic7z?bin]#?echo?-n?qxy:123456?|?openssl?dgst?-binary?-sha1?|?openssl?base64 hDF4uLZvMJqOX2ekKFa6kSz9HNo=實戰:
[zk:?localhost:2181(CONNECTED)?5]?create?/digestNode?"digestNode" Created?/digestNode [zk:?localhost:2181(CONNECTED)?2]?setAcl?/digestNode?digest:qxy:hDF4uLZvMJqOX2ekKFa6kSz9HNo=:cdrwa [zk:?localhost:2181(CONNECTED)?3]?get?/digestNode org.apache.zookeeper.KeeperException$NoAuthException:?KeeperErrorCode?=?NoAuth?for?/digestNode [zk:?localhost:2181(CONNECTED)?2]?setAcl?/digestNode?digest:qxy:hDF4uLZvMJqOX2ekKFa6kSz9HNo=:cdrwa [zk:?localhost:2181(CONNECTED)?3]?get?/digestNode org.apache.zookeeper.KeeperException$NoAuthException:?KeeperErrorCode?=?NoAuth?for?/digestNode [zk:?localhost:2181(CONNECTED)?4]?getAcl?/digestNode Authentication?is?not?valid?:?/digestNode [zk:?localhost:2181(CONNECTED)?5]?addauth?digest?qxy:123456 [zk:?localhost:2181(CONNECTED)?6]?getAcl?/digestNode 'digest,'qxy:hDF4uLZvMJqOX2ekKFa6kSz9HNo= :?cdrwa [zk:?localhost:2181(CONNECTED)?7]?get?/digestNode digestNodePS:如果覺得我的分享不錯,歡迎大家隨手點贊、在看。
更多推薦30多個Java實戰項目,全部在這里了 「吐血」我把大學4年、研究生3年的全部學習資源都分享在這里了總結
以上是生活随笔為你收集整理的面试官:说出几个你熟悉的 Zookeeper 命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后端必备的200本书,一次性给你!
- 下一篇: 这 56 个代码注释让我笑吐了