3.1 Engine配置
修改前,Xml代码:<Engine name="Catalina" defaultHost="localhost">
修改后,Xml代码:<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1" >
具体tomcat中jvmRoute的值根据在workers.properties的配置,注意IP地址、tomcat实例名称和jvmRoute值必须一一对应。
3.2 Connector配置
修改前,Xml代码:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改后,Xml代码:<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
这里tomcat的port值必须与在workers.properties中的port值一致。
3.3 Cluster配置
修改前,Xml代码
-
<!--
-
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" >
-
-->
修改后,去掉注释并添加一些内容如下,Xml代码:
-
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
-
<Manager className="org.apache.catalina.ha.session.DeltaManager"
-
expireSessionsOnShutdown="false"
-
notifyListenersOnReplication="true"/>
-
-
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
-
<Membership className="org.apache.catalina.tribes.membership.McastService"
-
address="228.0.0.4"
-
port="45564"
-
frequency="500"
-
dropTime="3000"/>
-
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
-
address="auto"
-
port="4001"
-
autoBind="100"
-
selectorTimeout="5000"
-
maxThreads="6"/>
-
<!-- timeout="60000"-->
-
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
-
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
-
</Sender>
-
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
-
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
-
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
-
</Channel>
-
-
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
-
filter=""/>
-
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
-
-
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
-
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
-
</Cluster>
上述配置跟tomcat官方建议的配置,去掉了Xml代码:
-
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
-
tempDir="/tmp/war-temp/"
-
deployDir="/tmp/war-deploy/"
-
watchDir="/tmp/war-listen/"
-
watchEnabled="false"/>
如果不去掉这部分,则tomcat启动会报"FarmWarDeployer can only work as host cluster subelement!."
3.4 session复制配置,tomcat集群中的session管理,主要有两种方式:
1).粘性session
表示从同一窗口发来的请求都将有集群中的同一个tomcat进行处理。配置方式是在上面workers.properties文件中.Xml代码:
-
worker.lbcontroller.sticky_session=True
粘性session的好处在不会在不同的tomcat上来回跳动处理请求,但是坏处是如果处理该session的tomcat崩溃,那么之后的请求将由其他tomcat处理,原有session失效而重新新建一个新的session,这样如果继续从session取值,会抛出nullpointer的访问异常。
2).session复制
session复制是指tomcat彼此之间通过组播方式将session发到各个tomcat实例上,如果其中一个访问出错,则另外tomcat仍然具有有效的session内容,从而能正常接管其session。坏处是当tomcat实例很多,或者用户在session中有大量操作时,组播发送的信息量十分惊人。session复制配置则是在发布的web应用程序中的web.xml中添加Xml代码,此外,session复制所需的JDK必须是JDK 5.0及其以上版本。
4.测试
1) 先启动apache服务器httpd
2) 启动名为tomcat2的服务器 此处使用的tomcat7,新建的webapps功能里面即 test里面要带WEB-INF/classes 否则启动报错;
创建session.jsp文件:
-
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
-
pageEncoding="ISO-8859-1"%>
-
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-
<title>session-test</title>
-
</head>
-
<body>
-
<%
-
String s=session.getId();
-
out.println("session id="+s);
-
System.out.println("session id="+s);
-
-
-
%>
-
</body>
-
</html>
在浏览器中输入访问地址http://localhost/test/session.jsp查看输出,可以看到请求被转发到了tomcat2进行处理。
3)启动tomcat 1
可以发现,tomcat1启动后搜索到了tomcat2实例,并进行了session复制。在tomcat2的控制台也可以找到如下输出
4)关闭tomcat 2,后继续刷新url访问。tomcat1控制台中输出的session 依然与之前tomcat2中的一致,并且在session中保存的属性值仍然有效。
(责任编辑:最模板) |