`

多个tomcat之间的session复制

阅读更多

用tomcat做负载集群时, 经常会用到session复制(Session Replication), 很多例子会告诉我们要配置apache或者其他的Web Server. 而事实上, 单纯从session复制的角度讲, 是不需要Web Server的.

 

tomcat的session复制分为两种, 一种是全局试的(all-to-all), 这意味着一个node(tomcat实例)的session发生变化之后, 它会将这些变更复制到其他所有集群组的成员;另一种是局部试的, 它会用到BackupManager, BackupManager能实现只复制给一个Buckup Node, 并且这个Node会部署相同的Web应用, 但是这种方式并没用经过很多的测试(来自官方说明..).

 

tomcat的session复制是基于IP组播(multicast)来完成的, 详细的IP组播介绍可以参考这里.

简单的说就是需要进行集群的tomcat通过配置统一的组播IP和端口来确定一个集群组, 当一个node的session发生变更的时候, 它会向IP组播发送变更的数据, IP组播会将数据分发给所有组里的其他成员(node).

 

配置如下(这里所有的tomcat都在不同的物理主机, 如果在同一台主机上需要改tomcat的tcpListenPort)

 

<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="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <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"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

 

然后新建一个web应用, 我们这里叫TomcatClusterDemo, web context与名称一致.

新建一个jsp, 这个jsp复制向session里创建/更新属性, 并将session里的所有属性显示在网页上. 

当然, 为了验证我们的session是同步的, 我们还将session ID显示了出来, 代码如下:

 

 

  <%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<html><head><title>Tomcat Cluster Demo</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
  out.println("<br> ID " + session.getId()+"<br>");
  
  String dataName = request.getParameter("dataName");
  if (dataName != null && dataName.length() > 0) {
     String dataValue = request.getParameter("dataValue");
     session.setAttribute(dataName, dataValue);
     System.out.println("application:" + application.getAttribute(dataName));
     application.setAttribute(dataName, dataValue);
  }
  out.print("<b>Session List</b>");
  Enumeration<String> e = session.getAttributeNames();
  while (e.hasMoreElements()) {
     String name = e.nextElement();
     String value = session.getAttribute(name).toString();
     out.println( name + " = " + value+"<br>");
         System.out.println( name + " = " + value);
   }
%>
  <form action="test.jsp" method="POST">
    Name:<input type=text size=20 name="dataName">
     <br>
    Value:<input type=text size=20 name="dataValue">
     <br>
    <input type=submit>
   </form>
</body>
</html>

 

同时, 在web.xml里增加<distributable/>描述

 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<display-name>TomcatClusterDemo</display-name>
	<distributable/>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>test.jsp</welcome-file>
	</welcome-file-list>
</web-app>
 

现在将TomcatClusterDemo部署到两个tomcat上(直接将war包或者部署文件拷贝到webapps下, 或者通过Tomcat Web Application Manager部署), 依次启动两个tomcat.

 

先访问第一台tomcat(下面的9.119.84.68)的test.jsp, 并添加几个session.

然后访问第二台tomcat(下面的9.119.84.88)的test.jsp, 为了告诉tomcat我们要用那个session访问, 我们需要在URL后面加上 ;jsessionid=SESSION_ID 

SESSION_ID可以从第一个test.jsp页面上获得.

 

看看效果, 两个在不同server上的tomcat实现了session复制!

 


 

 

 

  • 大小: 80.7 KB
分享到:
评论
4 楼 zwfflying 2016-09-01  
试过了,确实不停的变,有没有解决办法
3 楼 carlos 2016-01-02  
Aceslup 写道
<distributable/>位置很重要。

2 楼 Aceslup 2015-09-09  
<distributable/>位置很重要。
1 楼 Aceslup 2015-09-08  
试过,不行,还是不停的变。

相关推荐

    tomcat7通过memcache 实现 session共享

    通过memcache实现tomcat7的session共享,目前生产环境用的不多了,但自己某个小需求用到,版本冲突好几次,分享给大家,这3个包复制到tomcat的 lib目录下 还有两个包需要 maven引入自己的项目中 &lt;!-- memcache ...

    qikenet-tomcat-session-manager:tomcat redis session共享

    除了下载qikenet-tomcat-session-manager jar包之外,还需要这两个: jedis-2.5.2.jar(redis Java版客户端) commons-pool2-2.2.jar(连接池) 新增特性 1.添加了tomcat8.0.x支持 2.移除多余引用和无效的代码 3.添加了...

    性能调优 海量并发 系统架构

    Nginx+tomcat集群Memcached+Session复制 高性能高并发服务器架构 基于nginx的tomcat负载均衡和集群 实现多服务器负载均衡 系统性能优化 数据库 Nginx+Squid负载均衡 配置好的集群 总共三十个文档"&gt;Apache+Tomcat+...

    Nginx+Tomcat负载均衡

    1. 使用tomcat自带的cluster方式,多个tomcat见自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。 2. 利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一...

    APACHE 2.2.9+TOMCAT6.0.18配置负载均衡

    3、测试Session复制 访问url: http://localhost/examples/servlet/SessionExample 可以得到一个关于session的例子,我们用它来测试集群的错误恢复能力。 测试步骤如下: 关闭tomcat1和tomcat2; 启动tomcat1 在...

    tomcat 采用msm连接memcached缓存session所需要的所有jar包下载

    memcachedNodes 多个节点之间可以用空格分开,如n1:localhost:11211 n2:localhost:11212 我memcached的机子是安装在192.168.1.65 而且只配置一台 把下面对应的jar包复制到apache-tomcat-6.0.37\lib即可 msm要用的...

    catalina-tribes.jar

    负载均衡和session复制的文档网上一大堆,但是在一台windows服务器上配置(小弟比较穷,没那么多神机),负载均衡很容易实现了,但是始终无法达到session复制的目的,即每次请求测试页打印session id都不同。...

    Nginx安装包

    随后打开我们上次配置好的nginx,进入登录界面,进行登录步骤,我们就可以看到我们可能在tomcat1登录,进入tomcat2的个人中心,当然可能反之,刷新时个人中心页面,会看见两个tomcat的页面在间隔得显示,测试成功。...

    基于javatcpsocket通信的拆包和装包源码-distributed:分散式

    一个业务拆分成多个子系统,部署在不同的服务器上(相互调用)。 去IOE IBM小型机 、 Oracle Rac、 EMC存储设备 PC mysql maria db 2013年5月17号,最后一台IMB小型机下线 单机计算机的架构-&gt;分布式计算机架构 2、...

    完全免费的Java/jsp开发编辑工具FirstJava2

    12.在编辑jsp页面时,在之间,输入"out.","session.","application.", 就会显示编辑辅助对话框中,来显示类型的所有相关公共的函数和属性; 二.Eclipse和Jbuild开发的工程很容易移到这个工具下,只需直接复制src,来代替...

    FirstJava2完全教材

    12.在编辑jsp页面时,在之间,输入"out.","session.","application.", 就会显示编辑辅助对话框中,来显示类型的所有相关公共的函数和属性; 二.Eclipse和Jbuild开发的工程很容易移到这个工具下,只需直接复制src,来代替...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    java面试题

    37. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 18 38. 比较truncate和delete 命令 18 39. 解释$ORACLE_HOME 和$ORACLE_BASE的区别? 19 40. session与cookie的区别和联系? 19 41. ...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    JAVA上百实例源码以及开源项目

    第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码...

    JAVA上百实例源码以及开源项目源代码

    第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码...

    Java面试宝典2010版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2、Java有没有goto? 3、说说&和&&的区别。 4、在JAVA中如何跳出当前的多重嵌套循环? 5、switch语句能否作用在byte上,能否作用在long上...

    最新Java面试宝典pdf版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    Java面试笔试资料大全

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

Global site tag (gtag.js) - Google Analytics