1. 程式人生 > >在Docker中執行的ZooKeeper無法使用四字命令解決辦法

在Docker中執行的ZooKeeper無法使用四字命令解決辦法

前陣子寫過一篇文章,用來記錄如何在docker中啟動ZooKeeper的單機或者叢集節點,最近收到一個issue,大意是說專案啟動後,測試ZK的四字命令無效,這篇文章記錄一下解決辦法

ZK四字命令

四字命令其實就是通過類似 echo stat | nc 127.0.0.1 2181 這樣的指令,來與zk節點互動,獲取或者設定資料的指令

zk四字命令列表:

命令示範解釋
confecho conf | nc 127.0.0.1 2181輸出相關服務配置的詳細資訊。比如埠、zk資料及日誌配置路徑、最大連線數,session超時時間、serverId等
consecho cons | nc 127.0.0.1 2181列出所有連線到這臺伺服器的客戶端連線/會話的詳細資訊 包括“接受/傳送”的包數量、session id 、操作延遲、最後的操作執行等資訊
crstecho crst | nc 127.0.0.1 2181重置當前這臺伺服器所有連線/會話的統計資訊
dumpecho dump | nc 127.0.0.1 2181列出未經處理的會話和臨時節點(只在leader上有效)
enviecho envi | nc 127.0.0.1 2181輸出關於伺服器的環境詳細資訊(不同於conf命令),比如host.name、java.version、java.home、user.dir=/data/zookeeper-3.4.6/bin之類資訊
ruokecho ruok | nc 127.0.0.1 2181測試服務是否處於正確執行狀態。如果正常返回"imok",否則返回空
srstecho srst | nc 127.0.0.1 2181重置伺服器的統計資訊
srvrecho srvr | nc 127.0.0.1 2181(New in 3.3.0)輸出伺服器的詳細資訊。zk版本、接收/傳送包數量、連線數、模式(leader/follower)、節點總數
statecho stat | nc 127.0.0.1 2181輸出伺服器的詳細資訊:接收/傳送包數量、連線數、模式(leader/follower)、節點總數、延遲。 所有客戶端的列表
wchsecho wchs | nc 127.0.0.1 2181列出伺服器watches的簡潔資訊:連線總數、watching節點總數和watches總數
wchcecho wchc | nc 127.0.0.1 2181通過session分組,列出watch的所有節點,它的輸出是一個與 watch 相關的會話的節點列表。如果watches數量很大的話,將會產生很大的開銷,會影響效能,小心使用
wchpecho wchp | nc 127.0.0.1 2181通過路徑分組,列出所有的 watch 的session id資訊。它輸出一個與 session 相關的路徑。如果watches數量很大的話,將會產生很大的開銷,會影響效能,小心使用
mntrecho 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