Pre
Apache ZooKeeper - JMX监控 ZooKeeper 的运行状态
除了 JConsole 监控控制台之外,ZooKeeper 还提供了一些命令,可使我们更加灵活地统计监控 ZooKeeper 服务的状态信息。
ZooKeeper 提供的这些命令也叫作四字母命令,如它们的名字一样,每一个命令都是由四个字母组成的。
比如,输入相关的命令来查询 ZooKeeper 服务,可以输入 stat 命令来查看数据节点等信息。
代码语言:javascript复制echo {command} | nc 127.0.0.1 2181
安装nc
netcat(nc)不仅可以通过使用TCP或UDP协议的网络连接读写数据,同时还是一个功能强大的网络调试和探测工具。
默认未安装 ,安装如下
代码语言:javascript复制 yum install -y nc
常见的四字母命令
FourLetterCommands
代码语言:javascript复制org.apache.zookeeper.server.command.FourLetterCommands
代码语言:javascript复制 // specify all of the commands that are available
static {
cmd2String.put(confCmd, "conf");
cmd2String.put(consCmd, "cons");
cmd2String.put(crstCmd, "crst");
cmd2String.put(dirsCmd, "dirs");
cmd2String.put(dumpCmd, "dump");
cmd2String.put(enviCmd, "envi");
cmd2String.put(getTraceMaskCmd, "gtmk");
cmd2String.put(ruokCmd, "ruok");
cmd2String.put(setTraceMaskCmd, "stmk");
cmd2String.put(srstCmd, "srst");
cmd2String.put(srvrCmd, "srvr");
cmd2String.put(statCmd, "stat");
cmd2String.put(wchcCmd, "wchc");
cmd2String.put(wchpCmd, "wchp");
cmd2String.put(wchsCmd, "wchs");
cmd2String.put(mntrCmd, "mntr");
cmd2String.put(isroCmd, "isro");
cmd2String.put(telnetCloseCmd, "telnet close");
}
命令解析
命令 | 示例 | 描述 |
---|---|---|
conf | echo conf | nc localhost 2181 | (New in 3.3.0)输出相关服务配置的详细信息。比如端口、zk数据及日志配置路径、最大连接数,session超时时间、serverId等 |
cons | echo cons | nc localhost 2181 | (New in 3.3.0)列出所有连接到这台服务器的客户端连接/会话的详细信息。包括“接受/发送”的包数量、session id 、操作延迟、最后的操作执行等信息。 |
crst | echo crst | nc localhost 2181 | (New in 3.3.0)重置当前这台服务器所有连接/会话的统计信息 |
dump | echo dump | nc localhost 2181 | 列出未经处理的会话和临时节点(只在leader上有效)。 |
envi | echo envi | nc localhost 2181 | 输出关于服务器的环境详细信息(不同于conf命令),比如zookeeper.version、host.name、java.version、java.home、user.dir=/data/zookeeper-3.4.6/bin之类信息 |
ruok | echo ruok | nc localhost 2181 | 测试服务是否处于正确运行状态。如果正常返回"imok",否则返回空。 |
srst | echo srst | nc localhost 2181 | 重置服务器的统计信息 |
srvr | echo srvr | nc localhost 2181 | (New in 3.3.0)输出服务器的详细信息。zk版本、接收/发送包数量、连接数、模式(leader/follower)、节点总数。 |
stat | echo stat | nc localhost 2181 | 输出服务器的详细信息:接收/发送包数量、连接数、模式(leader/follower)、节点总数、延迟。 所有客户端的列表。 |
wchs | echo wchs | nc localhost 2181 | (New in 3.3.0)列出服务器watches的简洁信息:连接总数、watching节点总数和watches总数 |
wchc | echo wchc | nc localhost 2181 | (New in 3.3.0)通过session分组,列出watch的所有节点,它的输出是一个与 watch 相关的会话的节点列表。如果watches数量很大的话,将会产生很大的开销,会影响性能,小心使用。 |
wchp | echo wchp | nc localhost 2181 | (New in 3.3.0)通过路径分组,列出所有的 watch 的session id信息。它输出一个与 session 相关的路径。如果watches数量很大的话,将会产生很大的开销,会影响性能,小心使用。 |
mntr | echo mntr | nc localhost 2181 | (New in 3.4.0)列出集群的健康状态。包括“接受/发送”的包数量、操作延迟、当前服务模式(leader/follower)、节点总数、watch总数、临时节点总数。 |
confs
属性 | 说明 | 默认值、配置说明 | 补充说明 |
---|---|---|---|
clientPort | 客户端端口号 | 2181 | 客户端所连接的服务器所监听的TCP端口 |
dataDir | 数据文件目录 | ${zkDir}/data/version-2 | 用于配置内存数据库保存的快照目录,(文件名snapshot.xxxxx) |
dataLogDir | 日志文件目录 | ${zkDir}/data/version-2 | 记录的是事务日志 (文件名如log.xxxx), 服务端会顺序写入事务日志,由于快照的写入可能会影响事务日志的写入吞吐能力,可以将dataLogDir指向专用的日志存储设备 |
tickTime | Zk使用的基本时间度量单位 | 3000 (单位毫秒) | 客户端的最小会话超时时间为两个tickTime |
更低的tickTime可以更快的发现超时问题,但也会导致更高的网络流量(心跳消息)和更高的CPU利用率(会话存储器的处理) | |||
maxClientCnxns | 客户端最大连接数 | 60个 | 允许每个IP地址的并发socket连接的最大连接数。为了解决某些错误的客户端每秒创建很多个Zookeeper连接,最后导致Dos而添加的选项。 |
minSessionTimeout | 最小会话超时 | 2个tickTime时间 | 客户端建立连接后会请求一个明确的超时值,此值不能低于minSessionTimeout |
该参数配置过低可能会导致错误的客户端故障检测,过高会延迟客户端故障的检测时间 | |||
maxSessionTimeout | 最大会话超时 | 20个tickTime时间 | 客户端建立连接后会请求一个明确的超时值,此值不能高于maxSessionTimeout |
该参数不会影响系统的性能,但却可以限制一个客户端消耗系统资源的时间 | |||
serverId | id | ||
initLimit | follower最初连接到master时的超时值 | 没有默认值,单位是tickTime的倍数 | 当某个follower最初与master建立连接时,之间会传输大量的数据,尤其是follower落后整体很多的时候。此参数的配置取决于follower与master之间的网络速度情况,以及传输的数据量大小,如果Zookeeper中保存的数据量很大,例如存在大量的znode节点或者传输网络很慢,就需要增大时initLimit值,可以配置initLimit值为2倍你所期待的值,此值最好在网络中进行follower和master之间进行网络基准测试后再决定 |
属于集群配置 | |||
syncLimit | follower与master进行sync操作时的超时值 | 没有默认值,单位为tickTime的倍数 | 当master与follower无法进行sync操作,而且超过了syncLimit的tickTime,就会放弃该follower |
属于集群配置 | 与initLimit不同的是,syncLimit 并不依赖于Zk中保存的数据量大小,而是依赖于网络的延迟和吞吐量 | ||
高延迟的网络中或者相对较大的事务传输时,都需要提高syncLimit值 | |||
electionAlg | 选举算法 | 默认3 | 此配置不需要更改,目前其他的选举算法已被弃用 |
0基于UDP的LeaderElection | |||
属于集群配置 | 1基于UDP的FastLeaderElection | ||
2基于UDP和认证的FastLeaderElection | |||
3基于TCP的FastLeaderElection | |||
electionPort | 选举端口 | 无 | 在ZK的配置文件中配置,格式为: |
server.x=[hostname]:port1:port2[:observer] | |||
配置文件可拷贝conf/zoo_sample.cfg文件,加入如上格式的配置,其中 | |||
x表示服务器的ID(需要是整数),必须配置在data/myid文件中 | |||
hostname表示当前服务器在网络中的名称 | |||
port1表示用于事务发送的端口号,如2888 | |||
port2表示用于master选举的端口号,如3888 | |||
observer表示将当前服务器设置为观察者模式。此选项可选 | |||
quorumPort | 法人端口 | 无 | |
peerType | 角色类型对应的序号 | 默认0,表示参与者的角色 | 在源码中使用LearnerType枚举类来表示,有2种类型 PARTICIPANT(0), OBSERVER(1) |
可选值有0和1 | 分别表示参与者和观察者,默认是参与者,可以参与投票进行选举的角色 | ||
若需要修改为观察者,需要在ZK配置文件中加入 | |||
peerType=observer | |||
以及 | |||
server.x=[hostname]:port1:port2 | |||
后加入:observer |
cons
cons 命令用于输出当前这台服务器上所有客户端连接的详细信息,包括每个客户端的客户端 IP 、会话 ID 和最后一次与服务器交互的操作类型等。
属性 | 说明 |
---|---|
ip port | ip地址 端口 |
[interestOps] | netty/NIO中定义的interestOps |
queued | 已经提交但未响应的请求数 |
recved | 收到的包数量 |
sent | 发送的数据包数量(包括通知) |
sid | session id |
lop | 即 last operation 此连接执行的上一个操作 |
est | 即 Established 建立连接的时间戳 |
to | 会话超时时间,单位毫秒值 |
lcxid | 此连接的最后一个 cxid (指客户端发送一个数据包到服务器之前在服务器生成一个单调递增的整数) |
lzxid | 此连接的最后一个 zxid (事务ID) |
lresp | 上次服务器在此连接上向客户端发送的响应时间 |
llat | 即 LastLatency 此连接对应客户端的上次响应的延迟 (单位ms) |
minlat | 最小延迟 ms |
avglat | 平均延迟 ms |
maxlat | 最大延迟 ms |
stat
stat 命令的作用是监控 ZooKeeper 服务器的状态,我们通过 stat 命令统计 ZooKeeper 服务器的 ZooKeeper 版本信息、集群数节点等信息
属性 | 说明 |
---|---|
Zookeeper version | zookeeper版本号 |
Clients | 客户端相关信息 |
Latency min/avg/max | 最小/平均/最大延迟 ms |
Received | 收包数 |
Sent | 发包数 |
Connections | 已连接的客户端数量 |
Outstanding | 队列中尚未完成的请求数 |
Zxid | 上次处理的zxid |
Mode | 所属角色 |
Node count | 节点数 |
[root@localhost ~]# echo stat | nc 192.168.126.136 2181
Zookeeper version: 3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 05/04/2020 15:07 GMT
Clients:
/192.168.126.136:54644[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 3
Sent: 2
Connections: 1
Outstanding: 0
Zxid: 0x69ce
Mode: standalone
Node count: 5
[root@localhost ~]#
mntr
属性 | 说明 |
---|---|
zk_version | 版本信息 |
zk_avg_latency | 平均延迟 |
zk_max_latency | 最大延迟 |
zk_min_latency | 最小延迟 |
zk_packets_received | 收包数 |
zk_packets_sent | 发包数 |
zk_num_alive_connections | 存活的连接数 |
zk_outstanding_requests | 堆积的请求数 |
zk_server_state | 服务器的状态,包括:leader, follower, observer, read-only, standalone |
zk_znode_count | znode节点总数 |
zk_watch_count | watch总数 |
zk_ephemerals_count | 临时节点总数(znode) |
zk_approximate_data_size | 数据的近似大小 |
zk_open_file_descriptor_count | 打开的文件描述符数量 |
zk_max_file_descriptor_count | 最大文件描述符数量 |
zk_followers | follower数量 |
zk_synced_followers | 已同步的follower数量 |
zk_pending_syncs | 等待同步请求的数量 |
[root@localhost ~]# echo mntr | nc 192.168.126.136 2181
zk_version 3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 05/04/2020 15:07 GMT
zk_avg_latency 0
zk_max_latency 0
zk_min_latency 0
zk_packets_received 4
zk_packets_sent 3
zk_num_alive_connections 1
zk_outstanding_requests 0
zk_server_state standalone
zk_znode_count 5
zk_watch_count 0
zk_ephemerals_count 0
zk_approximate_data_size 44
zk_open_file_descriptor_count 74
zk_max_file_descriptor_count 65536
[root@localhost ~]#
srvr
srvr 命令与 stat 命令的功能十分相似,唯一不同的地方是 srvr 命令不会将与客户端的连接情况输出,通过 srvr 命令只会查询服务器的自身信息。
代码语言:javascript复制[root@localhost ~]# echo srvr | nc 127.0.0.1 2181
Zookeeper version: 3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 05/04/2020 15:07 GMT
Latency min/avg/max: 0/0/0
Received: 5
Sent: 4
Connections: 1
Outstanding: 0
Zxid: 0x69ce
Mode: standalone
Node count: 5
[root@localhost ~]#
[root@localhost ~]#
ruok
ruok 命令的主要作用是查询 ZooKeeper 服务器是否正常运行。如果 ZooKeeper 服务器正常运行,执行完 ruok 命令后,会得到 “imok” 返回值。如果 ZooKeeper 服务没有正常运行,则不会有任何返回值。在使用 ruok 命令的时候,在这里我们要注意的一点是,有些时候即使返回了 “imok” 字段,ZooKeeper 服务也可能没有正常运行,唯一能确定的是该台服务器的 2181 端口是打开的.
代码语言:javascript复制[root@localhost ~]# echo ruok | nc 127.0.0.1 2181
imok
[root@localhost ~]#
Question
代码语言:javascript复制[root@localhost bin]# echo stat | nc 192.168.126.136 2181
stat is not executed because it is not in the whitelist.
需要加入白名单才能使用 , 开启 -Dzookeeper.4lw.commands.whitelist=*
解析类 org.apache.zookeeper.server.NettyServerCnxn#checkFourLetterWord