`

多个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  
试过,不行,还是不停的变。

相关推荐

    tomcat5 session 复制

    如果有多个网络接口,可以添加 `mcastBindAddress="127.0.0.1"` 来指定绑定的 IP 地址,`mcastAddr` 和 `mcastPort` 用于多播通信,`mcastFrequency` 和 `mcastDropTime` 控制多播的频率和丢包时间。 2. **配置...

    nginx实现多个tomcat7直接session共享所需jar包

    标题中的“nginx实现多个tomcat7直接session共享所需jar包”指的是在分布式系统环境中,使用Nginx作为反向代理服务器,将用户请求分发到多个Tomcat7应用服务器上,同时实现用户会话(Session)在这些服务器之间的...

    Tomcat之间Session共享

    Tomcat 之间的 Session 共享是指在分布式 Tomcat 环境中,多个 Tomcat 实例之间共享 Session 数据,以确保用户登录状态的一致性。在使用 Nginx+Tomcat 进行负载均衡时,使用轮询方式进行负载可能会导致用户退出登录...

    tomcat集群实现session复制

    然而,在分布式环境中,如多个Tomcat实例组成的集群中,这种存储方式会导致会话数据的不一致性,因为用户的后续请求可能被不同的服务器处理,而这些服务器之间并不共享内存。为了解决这个问题,Session复制技术...

    一台xp机器实现apache+tomcat session复制.docx

    **LoopbackMode**是一种模式,它允许在同一台机器上的多个Tomcat实例之间进行通信,而无需通过网络接口。在配置`workers.properties`时,如果所有服务器都在同一台机器上,可能需要启用此模式以提高性能。 总的来说...

    tomcat redis session.rar

    7. **优点**:使用Redis同步Session可以避免Session复制带来的网络开销,提高响应速度,同时增强了系统的可扩展性和可用性。 8. **挑战与注意事项**:需要注意Redis的高可用性(如主从复制、哨兵系统或Cluster),...

    nginx tomcat集群 session复制

    为了保证用户体验的连续性,Session复制技术用于在多个Tomcat实例之间共享用户会话状态。本文将详细介绍如何在Nginx和Tomcat集群中实现Session复制。 ### 一、测试环境搭建 1. **软件列表**: - Nginx - PCRE ...

    linux下用memcache做tomcat集群session复制

    Memcached是一种分布式内存对象缓存系统,它可以存储包括session在内的临时数据,使得多个服务器实例间可以共享这些数据。下面将详细阐述如何在Linux上配置和使用Memcached以及如何在Tomcat集群中实现session复制。 ...

    Tomcat memcached Session依赖jar包

    在Tomcat中集成memcached作为Session管理器,可以将Session数据分布在网络中的多个节点上,实现Session复制和高可用性。 为了在Tomcat中使用memcached进行Session管理,你需要以下关键的依赖jar包: 1. **...

    tomcat-session共享

    然而,当部署多个Tomcat实例时,由于每个实例都有自己的Session存储,导致Session无法跨实例共享,用户在切换服务器时可能会失去登录状态。 **3. 解决方案:Nginx + Tomcat的Session共享** 为了解决这个问题,通常...

    tomcat集群session共享解决方案

    然而,当多个Tomcat实例组成一个集群时,session(用户会话)共享成为一个挑战,因为每个实例都有自己的内存空间,无法直接访问其他实例中的session数据。本篇文章将深入探讨Tomcat集群中session共享的解决方案,...

    Tomcat5集群中的Session复制

    Session复制是指在多个服务器节点之间复制和同步Session数据,以确保在服务器故障或重启时,Session数据不丢失。这种机制可以提供高可靠性、可扩展性和高性能的Web应用程序。 在Tomcat5中,Session复制可以通过IP...

    apache的tomcat负载均衡(两个tomcat)和集群配置(session复制)

    本文将深入探讨如何配置两个Tomcat实例实现负载均衡,并通过session复制来确保用户会话在集群中的无缝切换。 **一、负载均衡** 负载均衡是将网络请求分发到多个服务器上的技术,以防止单一服务器过载并提高服务的...

    tomcat7集群实现session共享

    当我们谈论“Tomcat7集群实现session共享”时,我们关注的是如何在多个Tomcat实例之间有效地同步用户会话信息,以便在集群环境中提供高可用性和负载均衡。 首先,理解session共享的重要性。在Web应用中,session是...

    tomcat 做session共享所需jar包压

    在分布式系统中,Session共享是一个常见的需求,尤其是在多个Tomcat服务器之间。这通常是由于负载均衡、高可用性或扩展性的需要。"Tomcat做session共享所需jar包"指的是实现这一功能所需的Java档案(JAR)文件。在这...

    Memcached-Session-Manager多tomcat实现session共享配置

    在分布式系统中,尤其是在使用了多个Tomcat实例作为Web服务器的集群环境中,确保用户会话(Session)在各个节点之间共享是至关重要的。Memcached-Session-Manager是解决这个问题的一个优秀解决方案,它允许我们将...

    Tomcat8 session同步测试,配置好的Tomcat

    总的来说,Tomcat8的session同步是通过集群配置实现的,涉及通道、管理器、部署器和阀门等多个组件。理解并正确配置这些部分对于构建高可用性和高扩展性的分布式Web服务至关重要。在测试过程中,要确保所有节点都能...

    tomcat-session同步所需jar.rar_session集群共享_tomcat session

    这涉及到多个知识点,包括session的基本概念、session复制、粘滞会话、以及可能涉及的相关jar文件。 首先,session是一个Web服务器为每个用户浏览器创建的存储用户状态的数据结构。它通常用于在多个请求之间保持...

Global site tag (gtag.js) - Google Analytics