当前页面位置: » 丰搜网 » 文档中心 » 详细内容
用mc4j远程监测tomcat集群-jmx技术助力tomcat
用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的安装中包含了一个叫做jmxproxy
servlet的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的集群与负载均衡”(on
java.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在一起共度时光,还喜欢观看底特律队的比赛。
资源
---下载本文中的代码:
[下载文件]
---远程jmx api:
http://www.jcp.org/en/
jsr/detail?id=160
---jmx最佳实践(sun developer
.network)
http://www.
java.sun.com/products/
javamanagement/best-practices.
html ---mc4j 1.2 beta 9:
https://sourceforge
.net/projects/mc4j/
---mc4j管理控制台
http://mc4j.sourceforge
.net ---mc4j与
tomcat集成:
http://mc4j.sourceforge
.net/usage
tomcat.
html ---“用jconsole监测应用”,mandy chung(sun developer
.network,2004年12月)
http://www.
java.sun.com/developer/technicalarticles/
j2se/jconsole.
html ---
javax.management.remote.rmi类包:
http://
java.sun.com/
j2se/1.5.0/jcp/beta1/apidiffs/
javax/management/remote/rmi/package-summary.
html---srini penchikala有关集群和session复制的文章:
o “
tomcat 5的集群与负载均衡,第一部分”(on
java.com, 2004年3月)
http://www.on
java.com/pub/a/on
java/2004/03/31/clustering.
html o “
tomcat 5的集群与负载均衡,第二部分”(on
java.com, 2004年4月):
http://www.on
java.com/pub/a/on
java/2004/04/14/clustering.
html o “
tomcat 5集群的session复制,第一部分”(on
java.com, 2004年11月):
o http://www.on
java.com/pub/a/on
java/2004/11/24/replication1.
html o “
tomcat 5集群的session复制,第二部分”(on
java.com, 2004年12月):
http://www.on
java.com/pub/a/on
java/2004/12/15/replication2.
html---xmojo:
http://www.xmojo.org/products/xmojo/index.
html ---jmanage:
http://jmanage.sourceforge
.net/
---mx4j:
http://mx4j.sourceforge
.net/
---
spring jmx:
http://opensource.atlassian.com/confluence/
spring/display/doc/
spring+jmx
---jmx
html适配器:
http://www.
servletsuite.com/jmx/jmx-
html.htm
---mc4j:
http://sourceforge
.net/projects/mc4j/
---pen:
http://siag.nu/pen/
---srini penchikala的另一篇文章:“
j2ee对象缓存
框架” (
javaworld,2004年5月):
http://www.
javaworld.com/
javaworld/jw-05-2004/jw-0531-cache.
html ---浏览
javaworld主
索引的
java应用服务器部分以获得更多有关
应用服务器的文章:
http://www.
javaworld.com/channel_content/jw-appserv-index.s
html ---浏览
javaworld主
索引的企业级
java部分以获得更多有关
java在企业中应用的文章:
http://www.
javaworld.com/channel_content/jw-enterprise-index.s
html ---浏览
javaworld主
索引的开发工具部分以获得更多有关
java开发工具的文章:
http://www.
javaworld.com/channel_content/jw-tools-index.s
html