如何從命令提示字元檢查 Zookeeper 是否正在運作或啟動?
1. 簡介
Apache ZooKeeper是一種分散式協調服務,可以簡化分散式應用程式的開發。開發分散式應用程式的挑戰在於協調、配置管理、領導者選舉等。 Apache Zookeeper 很好地解決了這些挑戰。這使得它在多個開源產品中廣受歡迎,包括 Apache Hadoop、Solr等。
我們現在將研究 ZooKeeper 的安裝選項以及檢查 ZooKeeper 節點是否正在運行的方法。
2.安裝
我們可以從這裡下載最新的 ZooKeeper 版本。支援大多數常見的生產作業系統(Mac 除外) 。具體的系統要求可以在這裡找到。 ZooKeeper 可以以兩種模式安裝:獨立模式和群集模式(又稱集合模式) 。
獨立模式在開發目的中很流行,但生產應用程式應該使用整合模式。在集合模式下,建議使用奇數個 ZooKeeper 伺服器節點(znode) 。為了實現容錯生產安裝,我們需要至少三個 znode。
雖然 ZooKeeper 中的所有節點都保存相同的數據,但在 ZooKeeper 集合中,一個節點通常充當“領導者”,其餘 znode 充當“追隨者”。因此,設計安裝以便每個 znode 可以與其他 znode 連接非常重要。
完整的安裝步驟請參閱 Apache ZooKeeper 安裝指南。 對於本文,我們將假設獨立模式,但對於整合模式的檢查也是相同的。
3.檢查ZooKeeper節點狀態
安裝 ZooKeeper 後,一項重要任務是檢查伺服器是否啟動並正在執行。當我們想要從遠端應用程式伺服器檢查與 znode 的連線時,我們也需要知道這一點。
首先,我們需要知道 znode 的 FQDN 或 IP 位址以及它正在監聽的客戶端連接埠。對於本文,我們假設使用預設設定安裝了獨立的 ZooKeeper,因此主機名稱是localhost
,連接埠號碼是2181
。
一旦我們獲得所需的信息,就可以透過幾種不同的方法來檢查 znode 狀態。
3.1.作業系統命令
我們登入znode所在的伺服器,然後我們可以發出一些OS指令來檢查ZooKeeper的狀態。
如果我們使用的是 Unix/Linux/Mac,那麼ps
指令很有用:
$ ps -ef | grep Zookeeper
以下是範例輸出:
501 3969 1 0 9:13AM ttys000 0:03.75 /usr/bin/java -Dzookeeper.log.dir=.....
org.apache.zookeeper.server.quorum.QuorumPeerMain /opt/apache-zookeeper-3.9.3-bin/bin/../conf/zoo.cfg
Java 指令後的文字被替換為「 ….”
刪除不必要的類別路徑和配置細節。這裡的關鍵點是 ZooKeeper 作為 Java 程式運行,其主類別是QuorumPeerMain
。
鑑於 ZooKeeper 是一個 Java 進程,並且我們也安裝了 JVM,我們可以執行另一個命令來檢查 ZooKeeper 的狀態:
$ jps | grep Quorum
jps
指令也適用於 Windows,但指令會略有不同。我們不能再使用管道符(|)和grep
命令了。
輸出應該是這樣的:
$ jps
3969 QuorumPeerMain
5565 Jps
作業系統命令是管理員和監控工具檢查 ZooKeeper 進程是否正在運行的快捷方法。但是,有時進程可能正在運行但沒有回應。在這種情況下,即使 ZooKeeper 沒有回應,作業系統命令也可能表示它已啟動。有幾種不同的方法可以真正了解 ZooKeeper 是否正在運行並響應。
3.2. zkServer
和zkCli
腳本
ZooKeeper 安裝包括兩個命令列介面腳本 - zkServer.sh
和zkCli.sh.
我們一般會使用zkServer.sh
腳本啟動Zookeeper伺服器。我們可以使用相同的腳本來檢查正在運行的伺服器的狀態:
$ ./zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.3-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone
zkServer.sh
是一個伺服器管理腳本,只有當我們登入 znode 時才起作用。但是, zkCli.sh
是 ZooKeeper 的命令列客戶端,我們可以使用它來檢查遠端伺服器狀態。它開啟一個類似 Linux 或 Windows shell 的shell
,但允許 ZooKeeper 管理員與 ZooKeeper 系統進行互動。我們也可以使用它來檢查與 znode 的基本連接:
$ ./bin/zkCli.sh -waitforconnection -timeout 3000 -server 127.0.0.1:2181
這裡我們使用了本地環回IP (127.0.0.1);
但是,我們也可以使用它透過伺服器的 IP 連接到遠端伺服器。 zkCli.sh
還有更多有用的管理指令,詳細資訊可以參考ZooKeeper 管理指南。
如果zkCli.sh
連線成功,我們將進入 ZooKeeper shell:
Welcome to ZooKeeper!
JLine support is enabled
[zk: 127.0.0.1:2181(CONNECTED) 0]
3.3. ZooKeeper 命令
到目前為止,我們已經討論了用於檢查伺服器狀態的腳本和作業系統命令。我們注意到,在所有這些方式中,我們都必須登入 znode,或者至少我們需要在執行命令的來源機器上安裝 ZooKeeper。
ZooKeeper 也提供簡單的四個字母的命令詞。我們可以使用它們與 ZooKeeper 遠端互動並從網路上的任何地方提取有用的信息。預設未啟用這些命令。我們首先透過在每個 znode 上的zoo.cfg
檔案中新增通配符白名單設定來將它們列入白名單:
4lw.commands.whitelist=*
或者我們可以使用逗號分隔的清單將特定命令列入白名單:
4lw.commands.whitelist=stat, ruok, conf, isro
新增這些指令後我們需要重新啟動znode。一旦我們重新啟動了 znode,我們就可以使用命令遠端連線到 ZooKeeper 節點。我們感興趣的指令是ruok
,它只是問題「你還好嗎?」的 4 個字母版本。伺服器以答案imok
回應,相當於“我很好”。
為此,我們可以使用網路連線命令,如telnet
:
> telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
ruok
imok Connection closed by foreign host.
或者,在 Linux/Unix 系統中,我們可以使用netcat
:
$ echo ruok | nc localhost 2181
imo
4. 進一步閱讀
過去,Apache Kafka 也使用 Zookeeper,但現在已轉向其他解決方案。但是,對於在分散式環境中存在協調和配置管理相同問題的任何應用程序,ZooKeeper 提供了一個簡單、輕量且強大的解決方案。
透過有效利用 ZooKeeper 命名空間和 ACL,我們可以將 Zookeeper 集合與多個不同的應用程式一起使用。 ZooKeeper 隨附 C 和 Java 用戶端函式庫,還有其他幾種後端語言的 ZooKeeper 函式庫,包括 Python、Rust、Go、JavaScript(NodeJS)和 PHP。
這意味著組織可以使用 ZooKeeper 開發分散式生產應用程式來處理協調和組態管理任務,而不必處理與這些任務相關的複雜性。一個例子是使用 Spring 和 ZooKeeper 進行服務發現。只要提供者應用程式在 ZooKeeper 集合中註冊為服務,我們就可以使用來自其他應用程式的服務。
5. 結論
在本文中,我們簡要概述了 ZooKeeper 及其安裝選項。我們也研究了檢查 ZooKeeper 伺服器節點 (znodes) 狀態的方法。 Apache ZooKeeper提供了強大的命令列腳本zkCli.sh,
以及ruok,
stat.
我們可以遠端使用它們來檢查 znode 的狀態。