ZooKeeper 的监控

1. 前言

在我们的分布式环境中,我们可以使用 Zookeeper 来管理众多的服务,对它们的运行状态进行监控和管理,这样的话,确保 Zookeeper 的正常运行也是我们需要关注的事情。那么我们如何对 Zookeeper 的运行状态进行监控呢?在本节的内容中,我们就来介绍 Zookeeper 的监控工具和四字监控命令。

2. 使用 JConsole 监控 Zookeeper

JConsole 是 JDK 自带的 Java 进程监控工具,Zookeeper 是基于 Java 的应用程序,也支持 JMX( Java Management Extensions ),所以我们可以通过 JConsole 来对 Zookeeper 的运行状态进行监控。

在使用 JConsole 开启监控之前,我们需要修改 Zookeeper 关于 JMX 的配置。如果是 Windows 平台的需要修改启动文件 zkServer.cmd,如果是 Linux 平台则需要修改启动文件 zkServer.sh

  • Windows 平台修改 zkServer.cmd

call %JAVA% 这一行中加入以下配置:

# 对 jmx 开放的端口,要注意避免和其它端口冲突
"-Dcom.sun.management.jmxremote.port=21810"
# 关闭 ssl
"-Dcom.sun.management.jmxremote.ssl=false"
# 关闭身份验证
"-Dcom.sun.management.jmxremote.authenticate=false"

zkServer.cmd 完整的配置如下:

@echo off
REM Licensed to the Apache Software Foundation (ASF) under one or more
REM contributor license agreements.  See the NOTICE file distributed with
REM this work for additional information regarding copyright ownership.
REM The ASF licenses this file to You under the Apache License, Version 2.0
REM (the "License"); you may not use this file except in compliance with
REM the License.  You may obtain a copy of the License at
REM
REM     http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.

setlocal
call "%~dp0zkEnv.cmd"

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
set ZOO_LOG_FILE=zookeeper-%USERNAME%-server-%COMPUTERNAME%.log

echo on
call %JAVA% "-Dcom.sun.management.jmxremote.port=21810" "-Dcom.sun.management.jmxremote.ssl=false" "-Dcom.sun.management.jmxremote.authenticate=false" "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*


endlocal
  

在第一个 ZOOMAIN 中添加以下配置:

# 关闭仅本地连接
-Dcom.sun.management.jmxremote.local.only=false
# zookeeper地址
-Djava.rmi.server.hostname=127.0.0.1  
# 对 jmx 开放的端口,要注意避免和其它端口冲突
-Dcom.sun.management.jmxremote.port=21810 
# 关闭 ssl
-Dcom.sun.management.jmxremote.ssl=false  
# 关闭身份验证
-Dcom.sun.management.jmxremote.authenticate=false  
# 开启日志
-Dzookeeper.jmx.log4j.disable=true

添加完毕后第一个 ZOOMAIN 配置如下:

ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=127.0.0.1  -Dcom.sun.management.jmxremote.port=21810 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dzookeeper.jmx.log4j.disable=true org.apache.zookeeper.server.quorum.QuorumPeerMain"

配置完启动文件,我们就可以重启 Zookeeper 服务端,打开 JConsole 界面,输入 Zookeeper 地址和开放的 JMX 端口,然后就能监控 Zookeeper 的 Java 进程了。

图片描述

除了使用 JConsole 来监控 Zookeeper 进程的运行状态之外,我们还可以使用 Zookeeper 提供的四字监控命令来查看Zookeeper 进程的运行状态,那么接下来我们就来学习 Zookeeper 的四字监控命令。

3. Zookeeper 的四字监控命令

Zookeeper 的四字监控命令,每个命令都由 4 个字母组成,我们可以通过 telnet 或者 nc(netcat)向 Zookeeper 服务端发送命令,来获取 Zookeeper 的运行状态及相关信息。

  • netcat 安装

这里我们使用 netcat 进行演示,首先我们需要安装 netcat,使用 apt-get install 命令来安装 nc:

# 安装 netcat
sudo apt-get -y install netcat-traditional 
# 更新 nc 命令,使用 netcat-traditional 的 nc 命令
sudo update-alternatives --config nc 

nc 安装完毕,接下来我们就可以使用 nc 来向 Zookeeper 服务端发送命令了。

  • 发送四字命令

首先我们来查看 Zookeeper 服务端的运行状态:

# 使用 nc 向 zookeeper 的地址和端口发送 stat 命令
echo stat | nc 127.0.0.1 2181 
# 输出 zookeeper 状态
# Zookeeper 版本信息,构建时间
Zookeeper version: 3.6.1--104dcb3e3fb464b30c5186d229e00af9f332524b, built on 04/21/2020 15:01 GMT
Clients:
 /127.0.0.1:44226[0](queued=0,recved=1,sent=0)
# 延时信息
Latency min/avg/max: 0/0.0/0
# 收包
Received: 3
# 发包
Sent: 2
# 当前服务连接数
Connections: 1
# 堆积的未处理的请求数
Outstanding: 0
# 最大事务ID
Zxid: 0x2
# 启动模式
Mode: standalone
# 节点数
Node count: 5

如果在发送命令时出现下面的情况:

stat is not executed because it is not in the whitelist.

说明我们的服务端未开启四字命令,需要我们在启动文件 zkServcie.sh 添加四字命令的支持。

zkService.sh 文件中大约 77 行处添加 :

ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

图片描述

添加完毕后,使用 zkServcie.sh restart 命令重启 Zookeeper 服务端,再使用四字命令进行监控。

接下来我们对 Zookeeper 的四字命令的含义,以及返回的信息进行介绍。

3.1 四字命令介绍

这里我们列出常用的四字命令进行介绍:

  • conf: 查询 Zookeeper 服务的配置信息。
# 对客户端开放的端口,默认 2181
clientPort=2181
# 安全的客户端的端口
secureClientPort=-1
# 数据文件目录
dataDir=/usr/local/zookeeper/apache-zookeeper-3.6.1-bin/data/version-2
# 数据文件大小
dataDirSize=67108880
# 日志文件目录
dataLogDir=/usr/local/zookeeper/apache-zookeeper-3.6.1-bin/data/log/version-2
# 日志文件大小
dataLogSize=914
# 心跳检测间隔毫秒
tickTime=2000
# 最大客户端连接数
maxClientCnxns=60
# 最小的会话超时时间
minSessionTimeout=4000
# 最大的会话超时时间
maxSessionTimeout=40000
# 客户端端口列表备份日志
clientPortListenBacklog=-1
# 服务id
serverId=0
  • cons: 列出连接到 Zookeeper 服务的所有客户端的完整连接和会话详细信息。包括接收和发送的数据包数量、会话id、操作延迟、最后执行的操作等信息。
/127.0.0.1:44244[0](queued=0,recved=1,sent=0)
  • crst: 重置服务端的连接和会话统计信息。
Connection stats reset.
  • dump: 适用于 Leader 节点,列出未完成的请求和临时节点。

  • envi: 列出服务器的环境信息。

Environment:
zookeeper.version=3.6.1--104dcb3e3fb464b30c5186d229e00af9f332524b, built on 04/21/2020 15:01 GMT
host.name=fbbc740a6217
java.version=1.8.0_261
java.vendor=Oracle Corporation
java.home=/usr/local/java/jdk1.8.0_261/jre
java.class.path=/usr/local/java/jdk1.8.0_261/jre/lib
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.io.tmpdir=/tmp
java.compiler=<NA>
os.name=Linux
os.arch=amd64
os.version=4.19.128-microsoft-standard
user.name=root
user.home=/root
user.dir=/usr/local/zookeeper/apache-zookeeper-3.6.1-bin
os.memory.free=142MB
os.memory.max=889MB
os.memory.total=192MB
  • ruok: 测试服务是否处于正确运行状态,如果正常返回 imok,否则返回空。

  • srst: 重置服务的统计信息。

  • srvr: 列出服务的详细信息。

Zookeeper version: 3.6.1--104dcb3e3fb464b30c5186d229e00af9f332524b, built on 04/21/2020 15:01 GMT
Latency min/avg/max: 0/0.0/0
Received: 9
Sent: 8
Connections: 1
Outstanding: 0
Zxid: 0x2
Mode: standalone
Node count: 5
  • wchs: 列出服务的 Watcher 的简要信息。

  • wchc: 按会话列出服务的 Watcher 的详细信息。

  • wchp: 按路径列出服务带有 znode 列表的 Watcher 的详细信息。如果 Watcher 的数量多,会影响服务器性能,请谨慎使用。

  • dirs: 以字节为单位显示快照和日志文件的总大小。

    datadir_size: 67108880
    logdir_size: 914
    

4. 总结

在本节内容中,我们学习了如何使用 JConsole 来监控 Zookeeper 的 Java 进程,还学习了使用 Zookeeper 的四字监控命令来监控 Zookeeper 的运行状态。以下是本节内容总结:

  1. JConsole 监控 Zookeeper。
  2. 四字命令监控 Zookeeper。