以编程的方式连接JMX代理
在探讨如何用MCJ监测Tomcat之前我们先简略地看一个通过远程JMX API连接远程JMX代理(这里指的是Tomcat servlet容器)的Java应用示例以启用JMX监控的方式启动Tomcat
这个JMX远程客户端示例被称为RemoteJMXClient基本上是一个独立的起到JMX连接器作用的Java应用程序该Java类位于Web应用示例的src\com\remotejmx\client目录下运行这个Java应用程序时要在classpath中添加jmxremotejar和jmxrijar文件以下步骤说明了如何连接远程JMX服务器
以协议主机名远程JMX端口号和凭证哈希表(存有用户名和密码)为参数创建JMXServiceURL对象
JMXServiceURL url = new JMXServiceURL(service:jmx:rmi:///jndi/rmi://localhost:/jmxrmi); Map map = new HashMap(); String[] credentials = new String[] { monitorRole QED };mapput(jmxremotecredentials credentials);
用第一步中得到的url和凭证哈希表创建JMXConnector对象在获得了JMX连接器的引用后调用getConnectionId()方法来确保得到一个有效的连接ID:
JMXConnector conn = JMXnnect(url map); Systemoutprintln(JMXConnector=+conntoString()); String id = conngetConnectionId(); Systemoutprintln(Connection Id= + id);
接下来从JMXConnector对象中获得MBeanserverConnection对象
mbsc = conngetMBeanserverConnection(); String domains[] = mbscgetDomains(); Systemoutprintln(# of domains=+domainslength); for (int i = ; i < domainslength; i++) { Systemoutprintln(Domain[ + i + ] = + domains[i]);}
在获得MBeanserverConnection对象后你就可以象调用连接到本地JMX服务器(在同一个JVM虚拟机上)的MBeanserver那样调用MBeans有关的方法你可以查看JMX服务器上域的数量和类型还能获取在该服务器上注册的MBeans的数量属性及操作下面的代码片断展示了这一过程
mbsc = conngetMBeanserverConnection(); String domains[] = mbscgetDomains(); Systemoutprintln(# of domains=+domainslength); for (int i = ; i < domainslength; i++) { Systemoutprintln(Domain[ + i + ] = + domains[i]);} // Get MBeans count Integer MBeansCount = mbscgetMBeansCount(); Systemoutprintln(MBeansCount : + MBeansCountintValue());
接下来查询服务器上的MBeans显示它们的属性和操作检索有关集群对象类型的MBeans细节就像下面的代码展示的那样在下一节我们会用MCJ看到同样的集群细节
Set MBeanset = mbscqueryMBeans(null null); Systemoutprintln(MBeansetsize() : + MBeansetsize()); Iterator MBeansetIterator = erator(); while (MBeansetIteratorhasNext()) {ObjectInstance objectInstance = (ObjectInstance)MBeansetIteratornext();ObjectName objectName = objectInstancegetObjectName();String canonicalName = objectNamegetCanonicalName();Systemoutprintln(canonicalName : + canonicalName);if (canonicalNameequals(Catalina:host=localhosttype=Cluster)){ // Get details of cluster MBeans Systemoutprintln(Cluster MBeans Details:); Systemoutprintln(=========================================); getMBeansDetails(canonicalName);}String canonicalKeyPropList = objectNamegetCanonicalKeyPropertyListString(); }
最后关闭JMX MBeans连接并释放资源
connclose();
Web应用示例安装
本节用一个Web应用示例来测试Tomcat集群的宕机(failover)和session复制我在两个集群节点上部署Web应用还编写了一个客户端程序用来做在servlet容器里创建和修改HTTP session的负载测试
通过以下步骤启动服务器集群及负载均衡
启动两个服务器实例并启用JMX监测功能
启动负载均衡我用的是Pen-一个简单的基于TCP协议的负载均衡工具它基于一些算法来分配负载比如轮循算法能自动检测到宕机的服务器并将客户请求转发到集群中其它可用的服务器上有关安装和配置Pen的详细情况参见Pen的网页
我用下面的命令启动负载均衡负载分配算法选项用的是轮循算法
pen r a f d localhost: : :
其中
r用轮循算法处理负载均衡
a用ASCII码打印传入/传出数据
f前台方式运行
d启用Debug模式
双击可执行文件(C:\dev\tools\mcj\MCJ Console bexe)启动MCJ(注在这个应用示例中我在同一台机器上运行JMX客户端和Tomcat集群但在真实的场景中JMX客户端是在远程机上运行而不是在应用服务器上)启动后MCJ的控制台应该如图所示
图 MCJ控制台窗口的截图控制台启动后创建一个新的连接绑定到JMX服务器上用Management菜单的Create Server Connection选项新建一个连接命名为Tomcatinstance该连接的设置如表所示
表 MCJ的Tomcat连接设置
注意你需要在classPathEntries参数中指定catalinajarcatalinaclusterjar和 catalinaoptionaljar文件(位于%CATALINA_HOME%\server\lib\目录下)
当Tomcat服务器群启用了远程JMX再将配置好的MCJ连接到这些服务器上我们就可以运行java测试客户端并用LogJ记录sesion的详细情况在下一节我们将看到测量层的细节以及测试客户端运行时的参数
测量层
我用多线程模式运行客户端并指定迭代的次数每达到次请求对session复制的详细情况(如在集群中传递session发生变化以及处理请求花费的时间)做一个记录同时用JMX控制台对session细节进行监测我们按以下步骤运行测试客户端并监测服务器统计数据
运行客户端我用SessionReplicationClient仿真对Tomcat服务器群的负载测试采用了以下设置
线程数
迭代次数
请求间隔 毫秒
测试样本数量
用MCJ控制台监测集群元素如图所示你可以通过Cluster 和 ClusterSender组件来监测集群的细节比如复制模式(replicationMode)请求数量(nrOfRequests)以及数据传输总量(totalBytes)都会显示在属性窗口中
图 Tomcat集群MBeans的截图用session管理MBeans检查session细节图显示了HTTP session的详细情况包括session数量活动session数和超时session数你还可以从日志文件中了解到session复制需要的时间
图 session细节的截图至此你已看到了如何通过远程JMX提供的API查看Tomcat服务器集群和session复制的运行时细节以及如何通过JMX客户端的图形用户界面查看这些细节而无需任何JMX编码
小结
在本文中你看到了如何运用JMX MBeans技术以及在JMX控制台(MCJ)的帮助下从远程监测Tomcat服务器(特别是集群和session复制模块)你会发现用JSE 提供的JMX技术监测JEE应用服务器(或者servlet容器)是多么的方便和强大
使用JMX技术来监测和管理服务器开发者网管和运营部门都可以从中获益有了远程JMX技术开发者可以监测他们在服务器上的应用程序发现JEE应用中需要调整和优化的瓶颈从而改善应用的性能和伸缩性网管可以看到服务器的统计数字如CPU使用率线程数内存使用率以评估当前和未来的负载量需求运营部门可以通过远程JMX监测来检查服务器状态和阀值溢出警报提前发现任何与服务器有关的问题
在使用JMX监测应用服务器时安全是另一个要考虑的重要因素特别是在产品环境下比如必须通过安全可控的方式(使用用户名密码)访问JMX控制台只允许经过授权的用户访问查看和修改MBeans的属性和操作系统管理员应当在服务器监测控制台上对MBeans属性和操作级别的访问进行细粒度的控制还要将所有的基于JMX访问用户的活动记录到日志文件中供以后的报告和审计之用
JMX客户端为远程绑定到各种应用服务器监测服务器状态以及运行于这些服务器之上的应用提供了一个集中的监测控制台在企业对其所有的服务器和应用进行生命期管理方面远程JMX监测是个相当不错的解决方案