运行时Java系统的管控,不得不提JMX(Java Management Extensions,Java管理扩展)。JMX是一个为应用程序、设备、系统等植入管理功能的框架,能够非常方便的让Java系统对外提供运行时数据信息获取和系统管控的接口。从3.3.0版本开始,ZooKeeper也使用了标准的JMX方式对外提供时数据信息和便捷的管控接口。
从Apache官方网站上下载的ZooKeeper,默认开启了JMX功能,但是却只限连接,无法通过远程连接,可以打开%ZK_HOME%/bin目录下的zkServer.sh文件,找到如下图所示的配置。
在这个配置中并没有开启远程连接JMX的端口信息,通常需要加入以下三个配置才能开启远程JMX:
例如我们配置开启JMX端口为21811,同时不需要任何权限,如下图所示。
通过上述配置,就可以允许远程机器和ZooKeeper服务器进行JMX连接了。
JConsole(Java监视和管理控制台)是一个Java内置的基于JMX的图形化管理工具,是最常用的JMX连接器。
假设我们搭建一个由三台服务器组成的ZooKeeper集群,分别有机器A、B和C,其中C是Leader,A和B是Follower,并都开启了JMX远程端口:21811。
使用JConsole,我们首先连接上服务器A,连接成功后,如下图所示。
连接成功后,我们可以看到界面上依次有“概述”、“内存”和“线程”等标签页,这些都是JCoonsole上的基本信息,这里主要讲解MBean标签页中的信息,如下图所示。
在MBean标签页中,可以看到org.apache.ZooKeeperService节点,及其树状结构的子节点列表,这些就是ZooKeeper服务器对外暴露的MBean。
在org.apache.ZooKeeperService节点下,首先可以看到ReplicatedServer_id1节点,从该节点的名字中,我们可以识别当前连接的ZooKeeper服务器的SID为1.继续往下可以看到三个子节点:replica.1、replica.2和replica.3,分别代表当前集群中的三台服务器。同时我们可以发现,replica.2和replica.3两个节点下面只有“属性”节点,而replica.1节点下还有一个Follower节点,这也不足为奇,原因就是当前连接的服务器就是SID为1的服务器,因此对于SID为2和3的ZooKeeper服务器,能够获取到的信息不多。从“属性”节点中,我们可以看到服务器的基本配置信息,包括所选用的Leader选举算法(ElectionType)、单个客户端最大连接数(MaxClientCnxnsPerHost)、会话的超时时间和启动时间等。
我们再来看replica.1节点下的Follower节点,如下图所示。
在Follower节点下的“属性”节点上,我们可以看到Follower服务器当前的运行时信息,包括:请求处理的平均延时(AvgRequestLatency)、客户端服务器端口和收到/发送的数据包个数,在上图的示例中,replica.1节点下有一个Follower节点,这表明当前服务器的角色是Follower。
下面我们来看Leader服务器的数据信息。通过同样的方式,我们使用JConsole连接到服务器C上,如下图所示。
首先,我们可以看到在replica.3节点下已经出现了Leader节点,表明该服务器的角色是Leader。选择“属性”节点,我们还可以发现,右侧出现了CurrentZxid属性,表明当前Leader服务器上处理的最后一个事务的ZXID是0x1400000045。
下面我们再来看看有哪些对Leader服务器的操作,如下图所示。
从上图中我们可以看到,Leader服务器对外提供了四个操作,下表中列举了这四个操作。
操作 说明 followerInfo() 获取所有Follower的运行时信息。该操作只在Leader服务器上提供 resetLatency() 重置所有与客户端请求处理延时相关的统计 resetMaxLatency() 重置客户端请求处理的最大延时统计 resetStatistics() 重置所有客户端请求处理延时统计,以及所有客户端数据包发送与接收量的统计
作为示例,我们执行followerInfo操作,之后就会罗列出当前集群中所有Follower的运行时信息,如下图所示。
从上图中我们可以看到,集群中一共有两个Follower服务器。
下面我们来看最后一个MBean:InMemoryDataTree。这个MBean就是ZooKeeper服务器上的内存数据库,如下图所示。
选择“属性”节点,我们可以看到当前内存数据库中最后处理的事务ID、数据节点的总个数以及Watcher的总个数。
下面我们再来看看针对内存数据库,我们有哪些操作,如下图所示。
从上图中我们可以看到,ZooKeeper向我们提供了两个操作,分别用于统计内存数据库所有节点的数据总量和临时节点总个数。