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. zkServer 和 zkCli 脚本
ZooKeeper 安装包包含两个命令行脚本:zkServer.sh 和 zkCli.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)状态的三种方法:
- OS 命令(如
ps
/jps
)快速检查进程 - 脚本工具(
zkServer.sh
/zkCli.sh
)进行本地/远程管理 - 四字母命令(如
ruok
)实现轻量级远程监控
Apache ZooKeeper 提供的 zkCli.sh
脚本和 ruok
、stat
等命令,可远程高效检查 znode 状态,是运维监控的利器。