在Docker中執行的ZooKeeper無法使用四字命令解決辦法
阿新 • • 發佈:2019-08-05
前陣子寫過一篇文章,用來記錄如何在docker中啟動ZooKeeper的單機或者叢集節點,最近收到一個issue,大意是說專案啟動後,測試ZK的四字命令無效,這篇文章記錄一下解決辦法
ZK四字命令
四字命令其實就是通過類似 echo stat | nc 127.0.0.1 2181
這樣的指令,來與zk節點互動,獲取或者設定資料的指令
zk四字命令列表:
命令 | 示範 | 解釋 |
---|---|---|
conf | echo conf | nc 127.0.0.1 2181 | 輸出相關服務配置的詳細資訊。比如埠、zk資料及日誌配置路徑、最大連線數,session超時時間、serverId等 |
cons | echo cons | nc 127.0.0.1 2181 | 列出所有連線到這臺伺服器的客戶端連線/會話的詳細資訊 包括“接受/傳送”的包數量、session id 、操作延遲、最後的操作執行等資訊 |
crst | echo crst | nc 127.0.0.1 2181 | 重置當前這臺伺服器所有連線/會話的統計資訊 |
dump | echo dump | nc 127.0.0.1 2181 | 列出未經處理的會話和臨時節點(只在leader上有效) |
envi | echo envi | nc 127.0.0.1 2181 | 輸出關於伺服器的環境詳細資訊(不同於conf命令),比如host.name、java.version、java.home、user.dir=/data/zookeeper-3.4.6/bin之類資訊 |
ruok | echo ruok | nc 127.0.0.1 2181 | 測試服務是否處於正確執行狀態。如果正常返回"imok",否則返回空 |
srst | echo srst | nc 127.0.0.1 2181 | 重置伺服器的統計資訊 |
srvr | echo srvr | nc 127.0.0.1 2181 | (New in 3.3.0)輸出伺服器的詳細資訊。zk版本、接收/傳送包數量、連線數、模式(leader/follower)、節點總數 |
stat | echo stat | nc 127.0.0.1 2181 | 輸出伺服器的詳細資訊:接收/傳送包數量、連線數、模式(leader/follower)、節點總數、延遲。 所有客戶端的列表 |
wchs | echo wchs | nc 127.0.0.1 2181 | 列出伺服器watches的簡潔資訊:連線總數、watching節點總數和watches總數 |
wchc | echo wchc | nc 127.0.0.1 2181 | 通過session分組,列出watch的所有節點,它的輸出是一個與 watch 相關的會話的節點列表。如果watches數量很大的話,將會產生很大的開銷,會影響效能,小心使用 |
wchp | echo wchp | nc 127.0.0.1 2181 | 通過路徑分組,列出所有的 watch 的session id資訊。它輸出一個與 session 相關的路徑。如果watches數量很大的話,將會產生很大的開銷,會影響效能,小心使用 |
mntr | echo mntr | nc 127.0.0.1 2181 | 列出叢集的健康狀態。包括“接受/傳送”的包數量、操作延遲、當前服務模式(leader/follower)、節點總數、watch總數、臨時節點總數 |
Docker容器中的ZooKeeper不響應四字命令
隨著ZooKeeper的官方Docker映象推出,大家也都紛紛按照官方介紹的那樣,用Docker來執行ZooKeeper,開始用著很爽,直到有人發現四字命令出問題:“輸了命令沒有響應”
百度谷歌各家論壇也沒有找到解決辦法,直到認真翻了一遍ZooKeeper的官方文件:zookeeper-doc
才發現,使用Docker映象啟動的ZK容器,預設是沒有配置四字命令白名單列表的,說白了,你只有在這個docker容器內部才能使用四字命令,而到了宿主機上,則會被禁止掉,所以就會出現無響應這種問題
那麼解決辦法也很簡單,我們可以利用volumes指令,在宿主機上配置好zk映象,再對映到容器中來啟動zk即可解決
具體操作辦法:
-
編寫配置檔案zoo.cfg,並儲存在./config目錄下,內容如下所示:
dataDir=/data dataLogDir=/datalog tickTime=2000 initLimit=5 syncLimit=2 autopurge.snapRetainCount=3 autopurge.purgeInterval=0 maxClientCnxns=60 standaloneEnabled=true admin.enableServer=true server.1=localhost:2888:3888;2181 4lw.commands.whitelist=*
-
編寫docker-compose,配置volumes,新增以下內容:
volumes:
- ./config:/conf
- 啟動測試,解決
如果這篇文章沒有幫助您解決問題的話,歡迎來:docker-compose-zook