站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题用MC4J远程监测Tomcat集群-JMX技术助力Tomcat

用MC4J远程监测Tomcat集群-JMX技术助力Tomcat

摘要: 最新版本的Tomcat(5.5.9)采用Java管理扩展(JMX)管理beans(managed beans)技术实现了对servlet容器的管理,其中包括监测所有的集群(cluster)元素和session复制情况。本文探讨了Tomcat对集群和session复制的支持,介绍了所有能用MBeans API监测的Tomcat集群组件。还通过一个运行在集群上的Web应用示例展示了如何监测集群的细节和session复制,以及用JMX控制台显示服务器的统计数据.
用MC4J远程监测Tomcat集群

-JMX技术助力Tomcat

作者:Srini Penchikala

翻译:observer


版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
英文原文地址:
http://www.javaworld.com/javaworld/jw-08-2005/jw-0801-jmx.html
中文地址:
http://www.matrix.org.cn/resource/article/43/43706_Tomcat_MC4J.html
关键词: Tomcat JMX MC4J



摘要
最新版本的Tomcat(5.5.9)采用Java管理扩展(JMX)管理beans(managed beans)技术实现了对servlet容器的管理,其中包括监测所有的集群(cluster)元素和session复制情况。本文探讨了Tomcat对集群和session复制的支持,作者Srini Penchikala介绍了所有能用MBeans API监测的Tomcat集群组件。他还通过一个运行在集群上的Web应用示例展示了如何监测集群的细节和session复制,以及用JMX控制台显示服务器的统计数据。(原文2,300词,2005年8月1日发表)
J2SE5.0在监测和管理方面的支持很全面,拥有对Java平台及运行于其上的应用进行远程监测能力。J2SE 5.0中包含了Java管理扩展(JMX)远程监测技术,这是对JVM监控能力的一个新的补充。Java规范第160号需求是JMX远程监测规范,它是关于远程访问机制的,为基于JMX的代理制定了一套远程客户端API。


Tomcat 5.5在设计上借助了J2SE 5.0内建的JMX技术,5.5版(由Tomcat 5.0.27发展而来)实现了最新的Servlet (2.4) 规范和JavaServer Pages (2.0)规范,并对Tomcat服务器架构在很大程度上做了重新设计和组合。它运行更加稳定,与Tomcat 4.x相比,性能、伸缩性、可靠性、JMX监测、集成的session集群和应用部署等方面都有了提高。
有了最新版的Tomcat和J2SE 5.0的JMX技术,我们就可以通过JMX来使用servlet容器的属性和方法,同时减少与JMX相关的复杂编码。我在本文中将介绍如何在启动Tomcat servlet容器时启用远程JMX监测,以及一个运行在有session复制功能的Tomcat集群上的Web应用示例。最后,我们用JMX客户端查看集群元素和HTTP session的细节。不过在我们深入探讨远程JMX监测之前,还是先看一下构成Tomcat集群的组件类。

集群元素
一个Tomcat集群由六个主要的组件构成:cluster(集群),membership(成员),sender(发送者),receiver(接收者),replication valve(复制阀)和deployer(部署者)。
表1说明了Tomcat中的每个组件是如何完成集群和session复制工作的。
表1 Tomcat集群元素


有关集群元素的详细说明参见Tomcat 5.5的集群文档。

Tomcat 5.5在集群、session复制、服务器监测和管理方面相对以前的版本(Tomcat 4.1 和 5.0)做了一些改进。在Tomcat 4中几个服务器组件(如host、engine和service)可用MBeans来监测,而在Tomcat 5.5中Yoav Shapira、Filip Hanik和其他的Tomcat开发者为监测集群元素编写了JMX实现。

既然我们已经了解了每个Tomcat集群元素的功能,接下来让我们看看各种连接Tomcat服务器集群和监测集群情况的JMX客户端工具。

JMX客户端
JMX客户端是一个用来连接JMX代理(运行在本地或远程)的图形化用户界面(客户机/服务器或瘦客户端)。理想的JMX客户端具备以下特点,能够有效地监测应用服务器而不为其带来额外的负担:
---对系统和网络资源的低占用
---能保持系统的稳定和性能
---少量的或无需特别设置(即使需要设置,也是简单明了而不是编程方式的)
---可提供良好的报告

J2SE 5.0附带了一个称为Jconsole的JMX客户端工具,可用来查看JVM运行时的详细情况。Tomcat的安装中包含了一个叫做JMXProxyServlet的JMX servlet,可用来查看、更新Tomcat MBeans的属性。它是一个能查看、操作运行于Tomcat容器中的MBeans的轻量级代理,通过与命令行脚本共同作用来监测和改变Tomcat的内部运行。JMX Query和Set命令分别用于查询MBeans和修改它们的属性和操作。

除了这两个工具,还有几个第三方开源JMX客户端应用程序(本文的资源部分有与之相关的链接):
---XMOJO
---jManage
---MX4J
---Spring JMX
---JMX-HTML适配器
---MC4J JMX控制台

在本文中我将介绍如何安装和配置MC4J,远程连接到Tomcat Servlet容器,以及监测服务器集群所有的MBeans组件。

用MC4J实现JMX远程监测与管理

MC4J控制台提供了以下功能:
---以树状方式显示MBeans的属性、操作和通知
---设置MBeans属性值
---执行MBeans操作
---连接多个J2EE应用服务器
---图形化显示MBeans属性

我在本文的示例中用的是MC4J 1.2 Beta 9。安装MC4J可从SourceForge下载可执行文件(MC4J-12b9-Windows.exe),然后双击该文件进行安装,安装过程中会提示选择JDK宿主目录和MC4J安装目录(本文是安装在c:\dev\tools目录下)。

为JMX设置系统属性
只有对一些系统属性进行设置后才能使用JMX远程监测,这些属性由一个在JAVA_HOME/lib/management目录下名为management.properties的属性文件设定。表2给出了启用JXM监测所必须设定的属性。
表2 启用JMX监测所需的系统属性


设置密码文件非常重要,特别是在多用户的环境下。我按以下步骤在JAVA_HOME/lib/management目录下建立密码文件:
---用密码模板文件(文件名jmxremote.password.template)拷贝出一个名为jmxremote.password的新文件
---将密码文件的文件权限设置为只有你能读写
---为角色设置密码,如monitorRole 和controlRole
---当启动JVM时系统属性已经设置成表2的样子

Tomcat集群的配置
我采用Tomcat 5.5.9组建Tomcat集群。本文使用的服务器集群由两个Tomcat实例组成,它们共享session状态,通过负载均衡在集群节点间分配处理请求。我的集群配置用到了SimpleTcpCluster 和 DeltaManager选项(使用默认值),在我的系列文章“Tomcat的集群与负载均衡”(ONJava.com,2004年)中对集群的组建有更详细的阐述。

为了能够在启动Tomcat服务器时启用远程JMX监测,要对位于CATALINA_HOME/bin目录下的 Tomcat启动脚本(catalina.bat 或catalina.sh)做如下修改:

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8999

注意:你在对第二个Tomcat实例的jmxremote端口设置时必须指定不同的端口(9999)。
图1 给出了集群的拓扑细节。

图1 Tomcat集群架构示意图。

表3列出了组建Tomcat集群所需的各项配置参数。
表3 集群配置详细说明


以编程的方式连接JMX代理
在探讨如何用MC4J监测Tomcat之前,我们先简略地看一个通过远程JMX API连接远程JMX代理(这里指的是Tomcat servlet容器)的Java应用示例。以启用JMX监控的方式启动Tomcat。
这个JMX远程客户端示例被称为RemoteJMXClient,基本上是一个独立的、起到JMX连接器作用的Java应用程序。该Java类位于Web应用示例的src\com\remotejmx\client目录下,运行这个Java应用程序时要在classpath中添加jmx-remote.jar和jmxri.jar文件。以下步骤说明了如何连接远程JMX服务器:
1.以协议、主机名、远程JMX端口号和凭证哈希表(存有用户名和密码)为参数创建JMXServiceURL对象:
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8999/jmxrmi");

Map map = new HashMap();
String[] credentials = new String[] { "monitorRole" , "QED" };
map.put("jmx.remote.credentials", credentials);


2.用第一步中得到的url和凭证哈希表创建JMXConnector对象,在获得了JMX连接器的引用后,调用getConnectionId()方法来确保得到一个有效的连接ID:
JMXConnector conn = JMXConnectorFactory.connect(url, map);
System.out.println("JMXConnector="+conn.toString());

String id = conn.getConnectionId();
System.out.println("Connection Id=" + id);


3.接下来从JMXConnector对象中获得MBeanserverConnection对象:
mbsc = conn.getMBeanserverConnection();
String domains[] = mbsc.getDomains();
System.out.println("# of domains="+domains.length);
for (int i = 0; i < domains.length; i++) {
System.out.println("Domain[" + i + "] = " + domains[i]);
}


4.在获得MBeanserverConnection对象后,你就可以象调用连接到本地JMX服务器(在同一个JVM虚拟机上)的MBeanserver那样调用MBeans有关的方法。你可以查看JMX服务器上域的数量和类型,还能获取在该服务器上注册的MBeans的数量、属性及操作。下面的代码片断展示了这一过程:
mbsc = conn.getMBeanserverConnection();
String domains[] = mbsc.getDomains();
System.out.println("# of domains="+domains.length);
for (int i = 0; i < domains.length; i++) {
System.out.println("Domain[" + i + "] = " + domains[i]);
}

// Get MBeans count
Integer MBeansCount = mbsc.getMBeansCount();
System.out.println("MBeansCount : " + MBeansCount.intValue());


5.接下来查询服务器上的MBeans,显示它们的属性和操作,检索有关集群对象类型的MBeans细节,就像下面的代码展示的那样。在下一节我们会用MC4J看到同样的集群细节。
Set MBeanset = mbsc.queryMBeans(null, null);
System.out.println("MBeanset.size() : " + MBeanset.size());

Iterator MBeansetIterator = MBeanset.iterator();
while (MBeansetIterator.hasNext()) {
ObjectInstance objectInstance = (ObjectInstance)MBeansetIterator.next();
ObjectName objectName = objectInstance.getObjectName();
String canonicalName = objectName.getCanonicalName();
System.out.println("canonicalName : " + canonicalName);

if (canonicalName.equals("Catalina:host=localhost,type=Cluster"))
{
// Get details of cluster MBeans
System.out.println("Cluster MBeans Details:");
System.out.println("=========================================");
getMBeansDetails(canonicalName);
}

String canonicalKeyPropList = objectName.getCanonicalKeyPropertyListString();
}


6.最后关闭JMX MBeans连接并释放资源:
conn.close();


Web应用示例安装
本节用一个Web应用示例来测试Tomcat集群的宕机(failover)和session复制。我在两个集群节点上部署Web应用,还编写了一个客户端程序,用来做在servlet容器里创建和修改HTTP session的负载测试。

通过以下步骤启动服务器集群及负载均衡:
1.启动两个服务器实例并启用JMX监测功能。
2.启动负载均衡。我用的是Pen-一个简单的、基于TCP协议的负载均衡工具,它基于一些算法来分配负载,比如轮循算法,能自动检测到宕机的服务器并将客户请求转发到集群中其它可用的服务器上。有关安装和配置Pen的详细情况参见Pen的网页。

我用下面的命令启动负载均衡,负载分配算法选项用的是轮循算法:
pen -r -a -f -d localhost:8080 192.168.0.10:9080 192.168.0.20:10080

其中:
---r:用轮循算法处理负载均衡
---a:用ASCII码打印传入/传出数据
---f:前台方式运行
---d:启用Debug模式

3.双击可执行文件(C:\dev\tools\mc4j\MC4J Console 1.2b9.exe)启动MC4J(注:在这个应用示例中,我在同一台机器上运行JMX客户端和Tomcat集群,但在真实的场景中,JMX客户端是在远程机上运行,而不是在应用服务器上),启动后MC4J的控制台应该如图2所示:


图2 MC4J控制台窗口的截图。

控制台启动后,创建一个新的连接绑定到JMX服务器上。用Management菜单的Create Server Connection选项新建一个连接,命名为Tomcat-5.5.9-instance1,该连接的设置如表4所示:
表4 MC4J的Tomcat连接设置


注意:你需要在classPathEntries参数中指定catalina.jar、catalina-cluster.jar和 catalina-optional.jar文件(位于%CATALINA_HOME%\server\lib\目录下)。

当Tomcat服务器群启用了远程JMX,再将配置好的MC4J连接到这些服务器上,我们就可以运行java测试客户端并用Log4J记录sesion的详细情况。在下一节我们将看到测量层的细节以及测试客户端运行时的参数。

测量层
我用多线程模式运行客户端,并指定迭代的次数,每达到100次请求对session复制的详细情况(如在集群中传递session发生变化以及处理请求花费的时间)做一个记录,同时用JMX控制台对session细节进行监测。我们按以下步骤运行测试客户端并监测服务器统计数据:
1.运行客户端:我用SessionReplicationClient仿真对Tomcat服务器群的负载测试,采用了以下设置:
---线程数:2
---迭代次数:1,000
---请求间隔:1,000 毫秒
---测试样本数量:1,000

2.用MC4J控制台监测集群元素:如图3所示,你可以通过Cluster 和 ClusterSender组件来监测集群的细节,比如复制模式(replicationMode)、请求数量(nrOfRequests)以及数据传输总量(totalBytes),都会显示在属性窗口中。

图3 Tomcat集群MBeans的截图。

3.用session管理MBeans检查session细节:图4显示了HTTP session的详细情况,包括session数量、活动session数和超时session数。你还可以从日志文件中了解到session复制需要的时间。

图4 session细节的截图。

至此你已看到了如何通过远程JMX提供的API查看Tomcat服务器集群和session复制的运行时细节,以及如何通过JMX客户端的图形用户界面查看这些细节而无需任何JMX编码。

小结
在本文中你看到了如何运用JMX MBeans技术以及在JMX控制台(MC4J)的帮助下从远程监测Tomcat服务器(特别是集群和session复制模块),你会发现用J2SE 5.0提供的JMX技术监测J2EE应用服务器(或者servlet容器)是多么的方便和强大。

使用JMX技术来监测和管理服务器,开发者、网管和运营部门都可以从中获益。有了远程JMX技术,开发者可以监测他们在服务器上的应用程序,发现J2EE应用中需要调整和优化的瓶颈,从而改善应用的性能和伸缩性。网管可以看到服务器的统计数字,如CPU使用率、线程数、内存使用率,以评估当前和未来的负载量需求。运营部门可以通过远程JMX监测来检查服务器状态和阀值溢出警报,提前发现任何与服务器有关的问题。

在使用JMX监测应用服务器时安全是另一个要考虑的重要因素,特别是在产品环境下。比如必须通过安全可控的方式(使用用户名、密码)访问JMX控制台,只允许经过授权的用户访问、查看和修改MBeans的属性和操作。系统管理员应当在服务器监测控制台上对MBeans属性和操作级别的访问进行细粒度的控制,还要将所有的基于JMX访问用户的活动记录到日志文件中供以后的报告和审计之用。

JMX客户端为远程绑定到各种应用服务器、监测服务器状态以及运行于这些服务器之上的应用提供了一个集中的监测控制台。在企业对其所有的服务器和应用进行生命期管理方面,远程JMX监测是个相当不错的解决方案。

关于作者
Srini Penchikala目前就职于Flagstar Bank,是那里的信息系统主题研究专家。他有10年的IT从业经历,在客户机/服务器和互联网应用领域拥有系统架构、设计和开发经验。从1998年起他就开始了用Java和XML技术进行J2EE应用的设计和开发工作。Penchikala拥有硕士学位(Edwardsville的南伊利诺斯大学)和工程学士学位(印度的Sri Venkateswara大学)。他的主要兴趣是研究新的J2EE技术以及与Web门户相关的框架技术。他喜欢与他的妻子Kavitha和六个月的女儿Srihasa在一起共度时光,还喜欢观看底特律队的比赛。

资源
---下载本文中的代码: