1. 简介

Apache ZooKeeper 是一个分布式协调服务,能简化分布式应用的开发。分布式应用开发中的协调、配置管理、领导者选举等挑战,ZooKeeper 都能很好解决。这使其在 Apache Hadoop、Solr 等众多开源项目中广受欢迎。

接下来我们将探讨 ZooKeeper 的安装选项,以及如何检查 ZooKeeper 节点是否正常运行。

2. 安装

可从官网下载最新版 ZooKeeper。支持主流生产操作系统(Mac 除外),具体系统要求见文档ZooKeeper 支持两种安装模式:单机模式和集群模式(即 ensemble)

单机模式常用于开发,但生产环境应使用集群模式。集群模式下建议部署奇数个 ZooKeeper 服务器节点(znode),至少需要 3 个节点才能实现容错。

虽然 ZooKeeper 中所有节点数据一致,但在集群中通常有一个"leader"节点和多个"follower"节点。因此安装设计时需确保每个节点都能与其他节点通信。

完整安装步骤参考 Apache ZooKeeper 安装指南。本文以单机模式为例,但检查方法同样适用于集群模式。

3. 检查 ZooKeeper 节点状态

安装 ZooKeeper 后,重要任务是确认服务器是否正常运行。当需要从远程应用服务器检查 znode 连接性时,也需要掌握这些方法。

首先需要知道 znode 的 FQDN 或 IP 地址,以及监听的客户端端口。本文假设使用默认配置的单机 ZooKeeper,主机名为 localhost,端口为 2181

掌握这些信息后,可通过以下几种方式检查 znode 状态:

3.1. 操作系统命令

登录 znode 所在服务器,执行系统命令检查 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 进程,也可使用 jps 命令检查:

$ jps | grep Quorum

jps 命令在 Windows 上同样适用,但命令格式略有不同(不能使用管道符和 grep):

$ jps
3969 QuorumPeerMain
5565 Jps

OS 命令优点:管理员和监控工具可快速检查进程状态
OS 命令缺点:进程可能存在但无响应,此时命令会误判 ZooKeeper 正常运行

3.2. zkServerzkCli 脚本

ZooKeeper 安装包包含两个命令行脚本:zkServer.shzkCli.sh。通常用 zkServer.sh 启动服务器,也可用它检查运行状态:

$ ./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 是命令行客户端,可检查远程服务器状态。它会打开类似 Linux/Windows 的 shell,允许管理员与 ZooKeeper 交互。检查基本连通性:

$ ./bin/zkCli.sh -waitforconnection -timeout 3000 -server 127.0.0.1:2181

这里使用本地回环 IP *(127.0.0.1)*,也可替换为服务器 IP 检查远程节点。连接成功后进入 ZooKeeper shell:

Welcome to ZooKeeper!
JLine support is enabled
[zk: 127.0.0.1:2181(CONNECTED) 0] 

3.3. ZooKeeper 四字母命令

ZooKeeper 提供简单的四字母命令,可在网络任意位置远程交互获取信息。这些命令默认未启用,需在每个 znode 的 zoo.cfg 中添加白名单配置:

4lw.commands.whitelist=*

或仅启用特定命令(逗号分隔):

4lw.commands.whitelist=stat, ruok, conf, isro

修改后需重启 znode。重启后即可使用命令远程检查状态。我们关注 ruok 命令("Are you OK?" 的缩写),服务器会返回 imok("I'm OK")。

使用 telnet 检查:

> telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
ruok
imokConnection closed by foreign host.

在 Linux/Unix 系统中,也可使用 netcat

$ echo ruok | nc localhost 2181
imok

4. 延伸阅读

Apache Kafka 曾使用 ZooKeeper,现已迁移至新方案。但对于分布式环境中的协调和配置管理问题,ZooKeeper 仍提供简单、轻量且健壮的解决方案。

通过有效利用 ZooKeeper 的命名空间和 ACL,可在多个不同应用中共享 ZooKeeper 集群。ZooKeeper 提供 C 和 Java 客户端库,其他语言(Python、Rust、Go、JavaScript (NodeJS)、PHP)也有第三方库。

这意味着组织可使用 ZooKeeper 处理分布式应用的协调和配置管理,无需直接处理相关复杂性。例如使用 Spring 和 ZooKeeper 实现服务发现,只要提供方应用在 ZooKeeper 集群中注册为服务,其他应用即可消费其服务。

5. 总结

本文概述了 ZooKeeper 及其安装选项,并介绍了检查 ZooKeeper 服务器节点(znode)状态的三种方法:

  1. OS 命令(如 ps/jps)快速检查进程
  2. 脚本工具zkServer.sh/zkCli.sh)进行本地/远程管理
  3. 四字母命令(如 ruok)实现轻量级远程监控

Apache ZooKeeper 提供的 zkCli.sh 脚本和 ruokstat 等命令,可远程高效检查 znode 状态,是运维监控的利器。


原始标题:How to Check if Zookeeper Is Running or up From Command Prompt? | Baeldung