Zookeeper 常用命令與注意事項
Zookeeper
在互聯網行業和分佈式環境下是最常用的集羣協調工具,今天就對Zookeeper
的常用命令和使用注意事項進一步說明,在這之前先看一下Zookeeper
是什麼,它能做什麼?
Zookeeper 是什麼?
ZooKeeper
是一個開源的分佈式應用程序協調服務,是Google
的Chubby
一個開源的實現,是Hadoop
和 Hbase 的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。
它的這些特性可以讓我們在很多場景下使用它,可以用它做註冊中心、分佈式鎖、選舉、隊列等。
Zookeeper 的原理
ZooKeeper
是以Fast Paxos
算法爲基礎的,Paxos
算法存在活鎖的問題,即當有多個proposer
交錯提交時,有可能互相排斥導致沒有一個proposer
能提交成功,而Fast Paxos
作了一些優化,通過選舉產生一個leader
(領導者),只有leader
才能提交proposer
,具體算法可見Fast Paxos
。因此,要想弄懂ZooKeeper
首先得對Fast Paxos
有所瞭解
ZooKeeper
的基本運轉流程:
-
選舉
Leader
。 -
同步數據。
-
選舉
Leader
過程中算法有很多,但要達到的選舉標準是一致的。 -
Leader
要具有最高的執行ID
,類似root
權限。 -
集羣中大多數的機器得到響應並接受選出的
Leader
。
Zookeeper 數據結構
與普通的文件系統極其類似,如下:
其中每個節點稱爲一個 znode. 每個 znode 由 3 部分組成:
-
stat:此爲狀態信息, 描述該 znode 的版本, 權限等信息
-
data:與該 znode 關聯的數據
-
children:該 znode 下的子節點
Zookeeper 節點類型
-
persistent
:persistent
節點不和特定的session
綁定, 不會隨着創建該節點的session
的結束而消失, 而是一直存在, 除非該節點被顯式刪除。 -
ephemeral
:ephemeral
節點是臨時性的, 如果創建該節點的session
結束了, 該節點就會被自動刪除.ephemeral
節點不能擁有子節點。雖然ephemeral
節點與創建它的session
綁定, 但只要該該節點沒有被刪除, 其他session
就可以讀寫該節點中關聯的數據. 使用-e
參數指定創建ephemeral
節點。 -
sequence
:嚴格的說,sequence
並非節點類型中的一種.sequence
節點既可以是ephemeral
的, 也可以是persistent
的. 創建sequence
節點時,ZooKeeper server
會在指定的節點名稱後加上一個數字序列, 該數字序列是遞增的. 因此可以多次創建相同的sequence
節點, 而得到不同的節點. 使用 - s 參數指定創建sequence
節點。
Zookeeper 常用命令
啓動服務
1[app@iZbp1dijzcfg8m0bcqfv9yZ zookeeper]$ ./bin/zkServer.sh start
2ZooKeeper JMX enabled by default
3Using config: /usr/local/servers/zookeeper/zookeeper/bin/../conf/zoo.cfg
4Starting zookeeper ... STARTED
查看當前 zk 節點狀態
1[zk@iZbp1dijzcfg8m0bcqfv9yZ bin]$ ./zkServer.sh status
2JMX enabled by default
3Using config: /usr/local/servers/zookeeper/zookeeper/bin/../conf/zoo.cfg
4Mode: standalone
ps. standalone
代表單機模式
1[zk@iZ23np2fk60Z bin]$ ./zkServer.sh status
2JMX enabled by default
3Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
4Mode: leader
ps. 集羣模式下會顯示的狀態,leader
節點,集羣中其他機器會從 leader 節點同步數據
ps. 集羣模式下會顯示的狀態,follower
節點在啓動過程中會從 leader 節點同步所有數據
連接服務
ps. 不寫 ip 端口默認連接本機服務。
查看節點信息
查看指定 node 的子 node
1[zk: localhost:2181(CONNECTED) 3] ls /zookeeper
2[quota]
創建一個普通節點
1[zk: localhost:2181(CONNECTED) 6] create /hello world
2Created /hello
獲取 hello 節點的數據與狀態
1[zk: localhost:2181(CONNECTED) 8] get /hello
2world
3cZxid = 0x262ea76
4ctime = Wed Mar 21 14:39:12 CST 2018
5mZxid = 0x262ea76
6mtime = Wed Mar 21 14:39:12 CST 2018
7pZxid = 0x262ea76
8cversion = 0
9dataVersion = 0
10aclVersion = 0
11ephemeralOwner = 0x0
12dataLength = 5
13numChildren = 0
刪除 hello 節點
1[zk: localhost:2181(CONNECTED) 9] delete /hello
2[zk: localhost:2181(CONNECTED) 10] get /hello
3Node does not exist: /hello
ps. 使用 delete 命令可以刪除指定 znode. 當該 znode 擁有子 znode 時, 必須先刪除其所有子 znode, 否則操作將失敗. rmr 命令可用於代替 delete 命令, rmr 是一個遞歸刪除命令, 如果發生指定節點擁有子節點時, rmr 命令會首先刪除子節點.
znode 節點的狀態信息
使用 get 命令獲取指定節點的數據時, 同時也將返回該節點的狀態信息, 稱爲 Stat. 其包含如下字段:
-
czxid. 節點創建時的 zxid.
-
mzxid. 節點最新一次更新發生時的 zxid.
-
ctime. 節點創建時的時間戳.
-
mtime. 節點最新一次更新發生時的時間戳.
-
dataVersion. 節點數據的更新次數.
-
cversion. 其子節點的更新次數.
-
aclVersion. 節點 ACL(授權信息) 的更新次數.
-
ephemeralOwner. 如果該節點爲 ephemeral 節點, ephemeralOwner 值表示與該節點綁定的 session id. 如果該節點不是 ephemeral 節點, ephemeralOwner 值爲 0. 至於什麼是 ephemeral 節點, 請看後面的講述.
-
dataLength. 節點數據的字節數.
-
numChildren. 子節點個數.
zxid
znode 節點的狀態信息中包含 czxid 和 mzxid, 那麼什麼是 zxid 呢?
ZooKeeper 狀態的每一次改變, 都對應着一個遞增的 Transaction id, 該 id 稱爲 zxid. 由於 zxid 的遞增性質, 如果 zxid1 小於 zxid2, 那麼 zxid1 肯定先於 zxid2 發生. 創建任意節點, 或者更新任意節點的數據, 或者刪除任意節點, 都會導致 Zookeeper 狀態發生改變, 從而導致 zxid 的值增加.
session
在 client 和 server 通信之前, 首先需要建立連接, 該連接稱爲 session. 連接建立後, 如果發生連接超時, 授權失敗, 或者顯式關閉連接, 連接便處於 CLOSED 狀態, 此時 session 結束.
創建不同類型的節點
節點的類型前面已經講過。
創建一個臨時節點
1[zk: localhost:2181(CONNECTED) 12] create -e /hello world
2Created /hello
3[zk: localhost:2181(CONNECTED) 13] get /hello
4world
5cZxid = 0x262ea78
6ctime = Wed Mar 21 14:45:23 CST 2018
7mZxid = 0x262ea78
8mtime = Wed Mar 21 14:45:23 CST 2018
9pZxid = 0x262ea78
10cversion = 0
11dataVersion = 0
12aclVersion = 0
13ephemeralOwner = 0x15c150a650f066c
14dataLength = 5
15numChildren = 0
創建一個序列節點
1[zk: localhost:2181(CONNECTED) 14] create -s /hello1 world
2Created /hello10000000007
3[zk: localhost:2181(CONNECTED) 15] create -s /hello1 world
4Created /hello10000000008
5[zk: localhost:2181(CONNECTED) 16] ls /
6[hello, dubbo, otter, zookeeper, seq, disconf, hello10000000007, hello10000000008, pinpoint-cluster]
7[zk: localhost:2181(CONNECTED) 17] get /hello10000000007
8world
9cZxid = 0x262ea7e
10ctime = Wed Mar 21 14:47:51 CST 2018
11mZxid = 0x262ea7e
12mtime = Wed Mar 21 14:47:51 CST 2018
13pZxid = 0x262ea7e
14cversion = 0
15dataVersion = 0
16aclVersion = 0
17ephemeralOwner = 0x0
18dataLength = 5
19numChildren = 0
watch
watch 的意思是監聽感興趣的事件. 在命令行中, 以下幾個命令可以指定是否監聽相應的事件.
ls 命令
ls 命令. ls 命令的第一個參數指定 znode, 第二個參數如果爲 true, 則說明監聽該 znode 的子節點的增減, 以及該 znode 本身的刪除事件
1[zk: localhost:2181(CONNECTED) 27] create /hello world
2Created /hello
3[zk: localhost:2181(CONNECTED) 28] ls /hello true
4[]
5[zk: localhost:2181(CONNECTED) 29] create /hello/test item001
6
7WATCHER::
8
9WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hello
10Created /hello/test
get 命令
get 命令. get 命令的第一個參數指定 znode, 第二個參數如果爲 true, 則說明監聽該 znode 的更新和刪除事件
1[zk: localhost:2181(CONNECTED) 30] get /hello true
2world
3cZxid = 0x262ef5d
4ctime = Wed Mar 21 14:52:16 CST 2018
5mZxid = 0x262ef5d
6mtime = Wed Mar 21 14:52:16 CST 2018
7pZxid = 0x262ef5e
8cversion = 1
9dataVersion = 0
10aclVersion = 0
11ephemeralOwner = 0x0
12dataLength = 5
13numChildren = 1
14[zk: localhost:2181(CONNECTED) 31] create /hello/test1 item001
15Created /hello/test1
16[zk: localhost:2181(CONNECTED) 32] rmr /hello
17
18WATCHER::
19
20WatchedEvent state:SyncConnected type:NodeDeleted path:/hello
stat 命令
stat 命令. stat 命令用於獲取 znode 的狀態信息. 第一個參數指定 znode, 如果第二個參數爲 true
1[zk: localhost:2181(CONNECTED) 35] create /hello world
2
3WATCHER::
4
5WatchedEvent state:SyncConnected type:NodeCreated path:/hello
6Created /hello
7[zk: localhost:2181(CONNECTED) 36] stat /hello true
8cZxid = 0x262f0f0
9ctime = Wed Mar 21 14:56:31 CST 2018
10mZxid = 0x262f0f0
11mtime = Wed Mar 21 14:56:31 CST 2018
12pZxid = 0x262f0f0
13cversion = 0
14dataVersion = 0
15aclVersion = 0
16ephemeralOwner = 0x0
17dataLength = 5
18numChildren = 0
source: //ningyu1.github.io/20180321/71-zookeeper-considerations.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/N7GL0Qb6LZJeTQfFK5WTJQ