Zookeeper 常用命令與注意事項

Zookeeper在互聯網行業和分佈式環境下是最常用的集羣協調工具,今天就對Zookeeper的常用命令和使用注意事項進一步說明,在這之前先看一下Zookeeper是什麼,它能做什麼?

Zookeeper 是什麼?

ZooKeeper是一個開源的分佈式應用程序協調服務,是GoogleChubby一個開源的實現,是Hadoop和 Hbase 的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。

它的這些特性可以讓我們在很多場景下使用它,可以用它做註冊中心、分佈式鎖、選舉、隊列等。

Zookeeper 的原理

ZooKeeper是以Fast Paxos算法爲基礎的,Paxos 算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成功,而Fast Paxos作了一些優化,通過選舉產生一個leader (領導者),只有leader才能提交proposer,具體算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所瞭解

ZooKeeper的基本運轉流程:

  1. 選舉Leader

  2. 同步數據。

  3. 選舉Leader過程中算法有很多,但要達到的選舉標準是一致的。

  4. Leader要具有最高的執行ID,類似root權限。

  5. 集羣中大多數的機器得到響應並接受選出的Leader

Zookeeper 數據結構

與普通的文件系統極其類似,如下:

其中每個節點稱爲一個 znode. 每個 znode 由 3 部分組成:

Zookeeper 節點類型

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. 其包含如下字段:

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