1. 程式人生 > >Zookeeper命令列zkCli.sh&zkServer.sh的使用(四)

Zookeeper命令列zkCli.sh&zkServer.sh的使用(四)

上篇博文,我們成功的安裝和啟動了zookeeper伺服器,zookeeper還提供了很多方便的功能,方便我們檢視伺服器的狀態,增加,修改,刪除資料(入口是zkServer.sh和zkCli.sh)。還提供了一系列四字命令,方便我們跟伺服器進行各種互動,來確認伺服器當前的工作情況(這也是伺服器監控告警的基礎)。

zkServer.sh

zookeeper啟動成功之後,我們先看一下zkServer.sh提供的主要功能:

  1. 檢視伺服器狀態
[yinpeng@slave1 zookeeper-3.4.9]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by
default Using config: /home/yinpeng/yuliang/zookeeper-3.4.9/bin/../conf/zoo.cfg Mode: standalone

我們使用的是zookeeper的單機模式。

  1. 啟停伺服器
[yinpeng@slave1 zookeeper-3.4.9]$ ./bin/zkServer.sh help  
ZooKeeper JMX enabled by default
Using config: /home/yinpeng/yuliang/zookeeper-3.4.9/bin/../conf/zoo.cfg
Usage: ./bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print
-cmd}

zkServer.sh還提供了啟動,停止,重啟等功能。zookeeper不僅提供了服務端命令,而且提供了客戶端命令。

zkCli.sh

使用zkCli.sh可以連線zookeeper,以及在客戶端操作zookeeper。

首先,連線zookeeper

./bin/zkCli.sh -timeout 5000 -server 192.168.0.23:2181

連線成功後,系統會輸出zookeeper的相關環境以及配置資訊,並在螢幕輸出“ Welcome to ZooKeeper ”等資訊。如下圖所示:
這裡寫圖片描述

輸入 help或h 之後,螢幕會輸出可用的客戶端命令列表,如下圖所示:
這裡寫圖片描述


從上到下,一共就十幾個命令。學的東西再多,不如多實踐,下面我們逐個命令實踐一遍:

  • ls 查詢當前節點列表(/是根節點)path:路徑
[zk: 192.168.0.23:2181(CONNECTED) 7] ls /
[zookeeper]
  • create 建立新的Znode節點 (-s : 順序節點 -e :臨時資料節點(重啟會消失)) path:路徑 data:資料 acl:許可權,不指定預設為world:anyone:cdwra,可參考Zookeeper的ACL access control list
[zk: 192.168.0.23:2181(CONNECTED) 10] create /node_1 "test" 
Created /node_1

順序節點可以作為主鍵自增的策略

  • get 檢視節點資料 path:路徑
[zk: 192.168.0.23:2181(CONNECTED) 11] get /node_1
test
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x13
mtime = Thu Feb 16 13:19:40 CST 2017
pZxid = 0x13
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0

test 為節點儲存的資料內容
注:
CZxid:表示該節點在那個事務中建立的事務id。
ctime:表示該節點的建立時間
mZxid:表示該節點更新時的事務id
mtime:表示該節點的修改時間
pZxid:表示該節點的子節點列表最後一次被修改的事務id
cversion:子節點版本號
dataversion:資料版本號
aclversion:許可權版本號
ephemeralOwner:專門用於臨時節點,表示建立該臨時節點的事務id(如果當前節點是持久節點,該值固定為0)
dataLength:當前節點存放資料的長度
numChildren:當前節點的子節點數目

  • stat 檢視資料節點的狀態資訊 path:路徑
[zk: 192.168.0.23:2181(CONNECTED) 12] stat /node_1
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x13
mtime = Thu Feb 16 13:19:40 CST 2017
pZxid = 0x13
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
  • ls2 是ls的超級指令,不僅可以列出當前節點的子節點,還可以輸出節點的狀態資訊,不再演示。

  • set 設定資料節點的值,path:路徑,data:資料,可以帶版本號,可以不帶版本號,

[zk: 192.168.0.23:2181(CONNECTED) 19] set /node_1 "11114"  
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x18
mtime = Thu Feb 16 13:32:59 CST 2017
pZxid = 0x17
cversion = 4
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 3
[zk: 192.168.0.23:2181(CONNECTED) 20] get /node_1 
11114
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x18
mtime = Thu Feb 16 13:32:59 CST 2017
pZxid = 0x17
cversion = 4
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 3

我在node_1下建立了三個節點,node_1_1,node_1_2以及node_1_3

  • set:新增上版本號(樂觀鎖)
[zk: 192.168.0.23:2181(CONNECTED) 27] get /node_1/node_1_3
333
cZxid = 0x30
ctime = Fri Feb 17 10:11:45 CST 2017
mZxid = 0x33
mtime = Fri Feb 17 10:29:37 CST 2017
pZxid = 0x30
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: 192.168.0.23:2181(CONNECTED) 28] set /node_1/node_1_3 332 2
cZxid = 0x30
ctime = Fri Feb 17 10:11:45 CST 2017
mZxid = 0x34
mtime = Fri Feb 17 10:31:51 CST 2017
pZxid = 0x30
cversion = 0
dataVersion = 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: 192.168.0.23:2181(CONNECTED) 29] set /node_1/node_1_3 332 2
version No is not valid : /node_1/node_1_3

通過get,我們知道了node_1_3,的資料值和版本號,然後修改node_1_3的資料值和版本號,版本號一致會修改成功,版本號不一致,丟擲版本號無效的異常。

  • delete 刪除node_1_3節點,此時它沒有子節點,否則會報錯,也可以攜帶版本
[zk: 192.168.0.23:2181(CONNECTED) 4] delete /node_1/node_1_3
[zk: 192.168.0.23:2181(CONNECTED) 5] ls2 /node_1
[node_1_1, node_1_2]
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x18
mtime = Thu Feb 16 13:32:59 CST 2017
pZxid = 0x26
cversion = 6
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 2

此時,我們看到node_1_3節點已經被刪除了。

  • rmr 迴圈刪除有子節點的父節點,例如刪除node_1
[zk: 192.168.0.23:2181(CONNECTED) 6] rmr /node_1
[zk: 192.168.0.23:2181(CONNECTED) 7] ls /
[zookeeper]

使用ls驗證之後,確實刪除了父節點,以及子節點。

  • quota(配額):增加一些節點的限制,必須在一定的範圍內
  • setquota :設定子節點的個數(-n:子節點個數的限制,-b:資料資料節點資料長度的限制)
[zk: 192.168.0.23:2181(CONNECTED) 33] create /node_1 1
Created /node_1
[zk: 192.168.0.23:2181(CONNECTED) 40] setquota -n 2 /node_1
Comment: the parts are option -n val 2 path /node_1
[zk: 192.168.0.23:2181(CONNECTED) 47] create /node_1/node_1_1 11
Created /node_1/node_1_1
[zk: 192.168.0.23:2181(CONNECTED) 48] create /node_1/node_1_2 12
Created /node_1/node_1_2
[zk: 192.168.0.23:2181(CONNECTED) 49] create /node_1/node_1_3 13
Created /node_1/node_1_3

上面的命令,我們重新建立了node_1節點,並給它設定節點數為2的限制,但是我們成功了建立子節點,node_1_3,並沒有給我們丟擲異常,它僅僅是在跟目錄下的zookeeper.out的輸出了一個警告。

超過個數只會報警告:

[yinpeng@slave1 zookeeper-3.4.9]$ tail zookeeper.out 
....省略
2017-02-17 10:45:32,472 [myid:] - WARN  [SyncThread:0:DataTree@301] - Quota exceeded: /node_1 count=3 limit=2
  • listquota,檢視資料節點配額的情況
[zk: 192.168.0.23:2181(CONNECTED) 50] listquota /node_1
absolute path is /zookeeper/quota/node_1/zookeeper_limits
Output quota for /node_1 count=2,bytes=-1
Output stat for /node_1 count=4,bytes=7

輸出了兩行資訊,第一行是配額資訊,設定的子節點數為2,資料長度為-1,表示沒有限制,第二行是狀態資訊,此時的子節點數為4,資料長度為7(自己的資料長度加上子節點的資料長度)

  • delquota,刪除資料節點配額的情況
[zk: 192.168.0.23:2181(CONNECTED) 51] delquota -n /node_1
[zk: 192.168.0.23:2181(CONNECTED) 52] listquota /node_1
absolute path is /zookeeper/quota/node_1/zookeeper_limits
Output quota for /node_1 count=-1,bytes=-1
Output stat for /node_1 count=4,bytes=7

刪除節點的配置之後,我們驗證一下,看到此時node_1節點的子節點個數沒有限制,資料長度沒有限制了。

我們簡單看一下其他的命令:

history 打印出最近執行的十個命令
redo cmdno 根據命令編號(可用history查詢編號)重新執行以前執行過的命令
close關閉當前連線,可用connect 再次連線,不會退出客戶端
quit 關閉連線並退出連線客戶端
connect連線伺服器

常用四字命令

命令 功能描述
conf 輸出相關服務配置的詳細資訊
cons 列出所有連線到伺服器的客戶端的完全的連線/會話的詳細資訊.包括“接受/傳送”的包數量,會話,id,操作延遲,最後的操作執行等等資訊
dump 列出未經處理的會話和臨時節點.
envi 輸出關於服務環境的詳細資訊
reqs 列出未經處理的請求
ruok 測試服務是否處於正確狀態.如果確實如此,那麼服務返回”imok”,否則不做任何響應
stat 輸出關於效能和連線的客戶端的列表
wchs 列出伺服器watch的詳細資訊
wchc 通過session列出伺服器watch的詳細資訊,它的輸出是一個與watch相關的會話的列表
wchp 通過路徑列出伺服器watch的詳細資訊.它輸出一個與session相關的路徑

下面給出幾個例子:

  • conf
[[email protected] zookeeper-3.4.9]$ echo conf | nc 192.168.0.23 2181
clientPort=2181
dataDir=/home/yinpeng/yuliang/data/version-2
dataLogDir=/home/yinpeng/yuliang/data/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
  • cons
[[email protected] zookeeper-3.4.9]$ echo cons | nc 192.168.0.23 2181
 /192.168.0.23:38968[0](queued=0,recved=1,sent=0)
  • ruok

測試服務是否處於正確狀態.如果確實如此,那麼服務返回” imok”,否則不做任何相應.

[yinpeng@slave1 zookeeper-3.4.9]$ echo ruok | nc 192.168.0.23 2181
imok

回覆imok表示已經啟動

  • stat
[[email protected] zookeeper-3.4.9]$ echo stat | nc 192.168.0.23 2181
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Clients:
 /192.168.0.23:38972[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/32
Received: 5425
Sent: 5424
Connections: 1
Outstanding: 0
Zxid: 0x4a
Mode: standalone
Node count: 11

其他命令,我們不看了,大家可以嘗試一下,這篇博文到此為止。

總結

zookeeper的命令還是非常的簡單,跟平時使用sql,差不太多,不多說了,下篇博文我們使用java的客戶端來操作一下。