阅读更多
一、概述
参考Tomcat7的官方文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
Tomcat7 自带的集群功能是通过session复制完成的,现有两个复制方式:
将session复制到所有tomcat节点中,不管是否有相应的应用(it will replicate to all nodes, even nodes that don't have the application deployed.)。缺点是如果集群节点很多,此种方式的系统消耗太大。具体节点多少算多,官方没有给出数量级。
将session复制到一个备份节点中,并且只复制到有相应应用的节点。(This manager only replicates the session data to one backup node, and only to nodes that have the application deployed.)缺点是这种方式没有像DeltaManager一样经过大规模的应用测试。
一个简单的Tomcat集群结构,本篇文档只介绍蓝色部分的配置:
DNS Round Robin
|
Load Balancer
/ \
Cluster1 Cluster2
/ \ / \
Tomcat1 Tomcat2 Tomcat3 Tomcat4
关于Load Balancer可以参见我另两篇文章:
Apache HTTP和Nginx Web服务器Linux系统安装
Tomcat与Web服务器连接和集群配置
Tomcat7中运行session复制,需要完成以下步骤(先有个印象,再看下面的实例):
- session中所有的属性(attributes)必须实现java.io.Serializable
- 去掉配置文件server.xml中cluster元素的注释
- 如果要自定义cluster valves,确认在Cluster元素里定义ReplicationValve。
- 如果Tomcat节点运行在同一台服务器上,确保tcpListenPort属性值唯一。在大多数情况下,Tomcat可以自动检测4000-4100范围内的端口
- 确保应用中web.xml文件有元素
- 如果使用mod_jk,确保设置jvmRoute属性,并且这个属性要和workers.properties相同
- 确保所有节点都有相同的时间。
- 确保loadbalancer被设置为粘性session模式(sticky session)
注意:浏览器会在某些情况下创建新的Session。
jdk1.5以上支持集群。
二、配置
下面详细说明一下:
Cluster元素可以是或者的子元素,如果使用farm war deploy功能,则必须是的子元素。SimpleTcpCluster是官方提供的唯一一个Cluster。channaelSendOptions是设置SimpleTcpCluster.send方法发送消息的方式,默认值是8。参考:http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/tribes/Channel.html
更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster.html
默认的manager。在Tomcat5.x以后每个webapp都可以配自己的manager,但是每个节点上相同的webapp要配置相同的manager。如果中没有manager的配置则使用上面的配置。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-manager.html
Channel元素是Tribes,该元素封装所有沟通和成员逻辑。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-channel.html
通过组播方式建立成员,通过address和port设置一个组播,在相同组播下为同一个集群。Tribes也支持静态成员,通过使用StaticMembershipInterceptor。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-membership.html
在Tribes中,发送(sender)和接收(receiver)是分开的两个组件。每个节点的address和port是不同的(如果节点有不同的IP地址,可以使用"auto",如果节点在同一个IP上,则port必须不同)。这个组件中有一个线程池,可以配置相关信息。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-receiver.html
发送(sender)组件,这个就这么配,没什么贴别特别说明的。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-sender.html
Tribes用堆栈发送信息,在堆栈中的每个元素都要通过interceptor。
TcpFailureDetector - 通过TCP验证成员是否正常。
MessageDispatch15Interceptor - 调度消息到线程(线程池),异步发送消息。
ThroughputInterceptor - 打印出消息流量的简单统计
注意interceptor的配置顺序。
更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-interceptor.html
过滤一些不会修改session的request。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-valve.html
默认的tomcat集群支持Farm部署,通过一个节点,可以部署和卸载应用到其他节点。集群中只设置一个主节点,将watchEnabled设为true,主节点将监听watchDir的变化,先更新本节点的deployDir,之后更新其他节点的deployDir。集群中其他节点的watchEnabled设为false。如果要执行此功能,Cluster必须是Host的子元素。
更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-deployer.html
当使用DeltaManager时,通过ClusterSessionListener接收和传播信息。
更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-listener.html
三、测试
到现在为止我们配置了一个Tomcat,复制这个Tomcat,修改应该修改的部分(如果是同一台机器则需要修改一些端口和jvmRoute,如果不是同一台机器只需修改jvmRoute)。
之后建立一个简单的webapp,记得web.xml中添加元素。如下:
......
Servlet and JSP Examples.
Servlet and JSP Examples
Timing filter
filters.ExampleFilter
attribute
filters.ExampleFilter
......
在项目中添加一个广泛使用的测试jsp:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
Cluster Test
<%
//HttpSession session = request.getSession(true);
System.out.println(session.getId());
out.println("
SESSION ID:" + session.getId()+"
");
// 如果有新的请求,则添加session属性
String name = request.getParameter("name");
if (name != null && name.length() > 0) {
String value = request.getParameter("value");
session.setAttribute(name, value);
}
out.print("Session List:");
Enumeration names = session.getAttributeNames();
while (names.hasMoreElements()) {
String sname = names.nextElement();
String value = session.getAttribute(sname).toString();
out.println( sname + " = " + value+"
");
System.out.println( sname + " = " + value);
}
%>
启动两个Tomcat,用浏览器访问一个Tomcat,设置一些属性到Session中,用相同浏览器代开另一个窗口,访问另一个Tomcat,看到页面中的Session含有之前设置的属性就说明Session复制成功。
参考文档:http://peterwei.iteye.com/blog/757125
四、JMX远程管理
1、修改服务器的jre环境,设置远程连接的用户密码。
复制jre目录中lib/management/jmxremote.password.template文件,在相同目录下,命名为jmxremote.password文件(去掉.template)。
去掉下面两行的注释:
monitorRole QED
controlRole R&D
前面为角色和用户名,后面是密码。修改密码。
角色权限在jmxremote.access文件中定义,默认为以上两个用户,monitorRole是只读用户,controlRole是全功能用户。可以修改。
2、设置服务器tomcat的启动参数
在$CATALINA_HOME/bin目录下,创建一个名为setenv.sh的文件,文件中添加如下内容:
export CATALINA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9797 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.password.file=/usr/java/jdk1.7.0_25/jre/lib/management/jmxremote.password"
修改port为需要的端口,password.file为jre目录中lib/management/jmxremote.password的目录。
详细参考:http://tomcat.apache.org/tomcat-7.0-doc/monitoring.html
3、远程调用
在客户端,运行$JAVA_HOME/bin/jconsole.exe
选择远程进程。
填写远程连接:service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
hostName是服务器地址,portNum是jmx端口。
用户名/密码是服务器中jre/lib/management/jmxremote.password的配置
点击连接按钮,可能会有连接不是SSL的提示,点击忽略。如果看到如下页面就说明连接成功了。
详细参考:http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html
- 大小: 30.1 KB
- 大小: 110 KB