如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块。
本文当采用tomcat默认集群配置(<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>)时,配置的细节实际上被省略了,对于大多数应用而言,使用默认配置已经足够。
下载tomcat 8.0 到本地, 保存为tomcat1, 复制tomcat1 为tomcat2,
修改tomcat2的端口设置,可以参考下面这个链接修改端口。
http://crunchify.com/how-to-run-multiple-tomcat-instances-on-one-server/
在examples目录下创建一个session.jsp文件,用来测试Cluster中两个Tomcat使用的Session是同一个Session,并且当其中一个Tomcat修改Session中的值时,第二个Tomcat会同样得到更新;代码如下:
- <html>
- <head>
- <title></title>
- </head>
- <body>
- <%
- String mydata = request.getParameter("mydata");
- if (mydata != null && mydata.length() != 0) {
- session.setAttribute("mydata", mydata);
- }
- out.println("request.getLocalAddr(): " + request.getLocalAddr());
- out.println("<br/>");
- out.println("request.getLocalPort(): " + request.getLocalPort());
- out.println("<br/>");
- out.println("Session ID: " + session.getId());
- out.println("<br/>");
- out.println("mydata: " + session.getAttribute("mydata"));
- %>
- <form>
- <input type=text size=20 name="mydata">
- <br>
- <input type=submit>
- </form>
- </body>
- </html>
现测试一下不添加cluster配置, 是什么情况。
session的值是不一样的。
接着我们添加cluster配置。
修改tomcat1 和tomcat2 conf/server.xml文件,将其中<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>前后的注释打开保存;
- <Engine name="Catalina" defaultHost="localhost">
- <!--For clustering, please take a look at documentation at:
- /docs/cluster-howto.html (simple how to)
- /docs/config/cluster.html (reference documentation) -->
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
修改tomcat1 和tomcat2 的web.xml
修改其中的WEB-INF/web.xml文件,在其中<display-name>Servlet and JSP Examples</display-name>节点后添加<distributable/>表明此应用与集群服务器复制 Session;
- <description>
- Servlet and JSP Examples.
- </description>
- <display-name>Servlet and JSP Examples</display-name>
- <distributable/>
重启tomcat1, tomcat2
可以看到session同步成功!
原文:http://laravel.iteye.com/blog/2178130