现在 我们来介绍如何配置tomcat 的session共享
以下是详细配置:
1. 修改tomcat7/conf/server.xml, 我们采用的是默认的配置,在<Engine>节点下添加:
1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
2. channelSendOptions="8">
3.
4. <Manager className="org.apache.catalina.ha.session.DeltaManager"
5. expireSessionsOnShutdown="false"
6. notifyListenersOnReplication="true"/>
7.
8. <Channel className="org.apache.catalina.tribes.group.GroupChannel">
9. <Membership className="org.apache.catalina.tribes.membership.McastService"
10. address="228.0.0.4"
11. port="45564"
12. frequency="500"
13. dropTime="3000"/>
14. <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
15. address="auto"
16. <!—tcpListenPort如果是同一机器部署两个tomcat7应用,则修改tomcat7_b为4001,以免冲突. 不同机器下,不用更改此项。—>
17. port="4000"
18. autoBind="100"
19. selectorTimeout="5000"
20. maxThreads="6"/>
21.
22. <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
23. <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
24. </Sender>
25. <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
26. <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
27. </Channel>
28.
29. <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
30. filter=""/>
31. <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
32.
33. <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
34. tempDir="/tmp/war-temp/"
35. deployDir="/tmp/war-deploy/"
36. watchDir="/tmp/war-listen/"
37. watchEnabled="false"/>
38.
39. <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
40. <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
41. </Cluster>
2. <Connector port="8081" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443" /> 修改,仅为了调试方便。
3. Tomcat7\webapps\consolidation\WEB-INF\web.xml中加入<distributable/>
4. <Engine name="Catalina"defaultHost="localhost" jvmRoute="tomcat7_a">,添加jvmRoute属性,此项为后面apache负载均衡用到。
复制一份tomcat7_a应用,改名为tomcat7_b,这个只是为了方便,注意以下几点配置就ok.
1. 修改tomcat7_a/conf/server.xml中的Serverport属性<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />,因为是同一台机器两个tomcat应用,所以改一下。
2. 修改<connector port="8082" protocol="HTTP/1.1"onnectionTimeout="20000" edirectPort="8443" />,同理,为了避免同一台机器端口号冲突。部置在不同的机器是不用管的。
3. 修改<Enginename="Catalina"defaultHost="localhost" jvmRoute="tomcat7_b">,此项为后面apache负载均衡用到。
4. 修改<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"address="auto" port="4001"autoBind="100"selectorTimeout="5000" maxThreads="6"/>
5. tomcat7_b\webapps\consolidation\WEB-INF\web.xml中加入<distributable/>
6.详细配置还可参照tomcat7\webapps\docs\cluster-howto.html 或者http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
至此集群配置完成,此种集群方式是采用session复制模式
利用Tomcat session复制的机制使得所有session在所有Tomcat节点中保持一致。当一个节点修改一个session数据的时候,该节点会把这个 session的所有内容序列化,然后广播给所有其它节点。这样当下一个用户请求被负载均衡器分配到另外一个节点的时候,那个节点上有完备的 session信息可以用来服务该请求。这种做法的问题是对session哪怕有一点点修改,也要把整个sessions数据全部序列(serialize),还要广播给集群中所有节点,不管该节点到底需不需要这个session。这样很容易会造成大量的网络通信,导致网络阻塞。一般采用这种方式,当Tomcat节点超过4个时候,整个集群的吞吐量就不能再上升了。
接下来就是测试阶段
1.便于更明显的看到集群效果,在tomcat7_a和tomcat7_b的webapps目录下建立一个简单的工程test,然后在工程下分别添加测试文件:test2.jsp
Java代码
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
这里是TOMCAT1 </br>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
// 如果有新的 Session 属性设置
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.println("<b>Session 列表</b><br>");
System.out.println("============================");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test2.jsp" method="POST">
名称:<input type=text size=20 name="dataName">
<br>
值:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
需要注意的是这个jsp的代码 可以由咱们自己更改一下文本 例如TOMCAT1、TOMCAT2之类的 以便区分
然后分别开启两个tomcat
然后就可以看到这个结果
网页上两个ID 是一样的 唯一区别就是后面的“.tomcat1”与“.tomcat2”
当然了 如果在session中输入一组名称和值
然后刷新另外一个网页 该值会显示出来 那就是对了!~