`
tmj_159
  • 浏览: 707143 次
  • 性别: Icon_minigender_1
  • 来自: 永州
社区版块
存档分类
最新评论

tomcat session共享

 
阅读更多

          强大的订票网站12306.cn给了我们一个教训,如果不想自己做的网站遇到用户多的情况就频繁崩溃,除了要好好的设计自己网站之外,还应该考虑点架构的问题了,所以先看下负载均衡的内容。

         负载均衡,想想其实很简单,就是一个tomcat忙不过来了,就让多个tomcat来做,可是请求来了到底应该用哪个tomcat来处理呢,这时候需要一个分发任务的tomcat,所以我们引入了apache 服务器。

我们引入的apache应该要有如下功能:

       1.能够分发请求到N个tomcat中

       2.能够尽量让每个tomcat工作量基本平均

       3.某个tomcat离开了,apache就不要请求分给他了,而是分给其它人。

 

       对于TOMCAT呢,除了正常功能外,需要哪些额外的功能呢?

       1.客户端应该不能感觉到请求分到不同tomcat时的差异

 

         废话就写这么多,希望给不理解负载均衡的人一些提示吧。

 

        接下来做个简单的例子,从最熟悉的tomcat说起,我们把这个系统分成几部分:

        一、tomcat session共享

        二、apache 请求分发

//TODO

 

      Tomcat session共享

       tomcat 官方文档中有这方面的介绍,我们下载tomcat目录下/webapps/docs就有html 格式的文档。如果没有怎么办,很简单下个有的吧。

       cluster-howto.html这个文件有很详细的解释了,考虑到是E文,我就做简单的解释吧,不过我E文也很烂,翻译基本靠“有道”,你懂的。

 

       实现session共享你有两个文件需要修改,考虑到不同版本的tomcat可能配置信息不一样,目前我试验的tomcat版本为:7.0.26

       1.修改catalina_home/conf/server.xml

       你应该能在配置文件里面发现这样的代码

 <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->

       你可以去掉注释然后再里面加入接下来的内容,可以不动他,完全拷贝如下配置信息到上续代码下面

 

 

<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>

 如果在一台机器上测试,端口需要保证唯一,我把可能需要改的都用黄色警示下,除了修改新加入的部分,还要修改默认的配置,为了初学者方便我也给标出来,这里只给出要修改的

<Server port="8006" shutdown="SHUTDOWN"> 

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

 

 

官网上有如下一段话

To run session replication in your Tomcat 7.0 container, the following steps should be completed:

  • All your session attributes must implement java.io.Serializable
  • Uncomment the Cluster element in server.xml
  • If you have defined custom cluster valves, make sure you have the ReplicationValve defined as well under the Cluster element in server.xml
  • If your Tomcat instances are running on the same machine, make sure the tcpListenPort attribute is unique for each instance, in most cases Tomcat is smart enough to resolve this on it's own by autodetecting available ports in the range 4000-4100
  • Make sure your web.xml has the <distributable/> element
  • If you are using mod_jk, make sure that jvmRoute attribute is set at your Engine <Engine name="Catalina" jvmRoute="node01" > and that the jvmRoute attribute value matches your worker name in workers.properties
  • Make sure that all nodes have the same time and sync with NTP service!
  • Make sure that your loadbalancer is configured for sticky session mode.
  • 解释如下.
  • 所有session属性必须实现java.io.Serializable接口
  • 在server.xml中去掉"Cluster"元素的注释
  • 如果你定义了集群阀门(什么东西?),确定你在Cluster元素中有ReplicationValve定义
  • 如果你tomcat运行在同一台机器上,请确保端口唯一
  • 确定你web.xml 中有<distributable/>的元素(节点吧,不习惯元素这个说法)
  • 如果你使用mod_jk,设置 <Engine name="Catalina" jvmRoute="node01" >,
  • jvmRoute这个属性,并且保证唯一吧,因为接下来你负载均衡会用到。
  • 时间保持一致
  • 确保你的负载均衡配置了粘性会话模式

         好了,一个配置文件已经修改完了,剩下一个,项目的配置文件web.xml

        2、修改catalina_home/webapps/你的项目/WEB-INF/web.xml

       很简单,添加一行即可<distributable/>

 

添加一个测试的jsp到你的项目中去,testCluster.jsp,直接拷贝吧,我也是拷贝网上的

    <%@ page contentType="text/html; charset=GBK" %>  
    <%@ page import="java.util.*" %>  
    <html><head><title>Cluster Test</title></head>  
    <body>  
    <%  
      //HttpSession session = request.getSession(true);  
      System.out.println(session.getId());  
      out.println("<br> SESSION ID:" + session.getId()+"<br>");    
      // 如果有新的请求,则添加session属性  
      String name = request.getParameter("name");  
      if (name != null && name.length() > 0) {  
         String value = request.getParameter("value");  
         session.setAttribute(name, value);  
      }    
        out.print("<b>Session List:</b>");    
        Enumeration<String> names = session.getAttributeNames();  
        while (names.hasMoreElements()) {  
            String sname = names.nextElement();   
            String value = session.getAttribute(sname).toString();  
            out.println( sname + " = " + value+"<br>");  
            System.out.println( sname + " = " + value);  
       }  
    %>  
      <form action="testCluster.jsp" method="post">  
        名称:<input type=text size=20 name="name">  
         <br>  
        值:<input type=text size=20 name="value">  
         <br>  
        <input type=submit value="提交">  
       </form>  
    </body>  
    </html>  

 测试逻辑是这样的,访问tomcatA,提交一个键值对到session中,访问tomcatB,看是否看到这个键值对,修改也一样,图就不截了。

 

我的问题:

       在一台机器测试的时候两个tomcat,session可以同步,不在一台机器的时候session不能同步,据说跟"<Membership> 和 <Receiver>有关系,因为 membership是广播地址。。。。具体怎么解决还不知道,如果你知道麻烦提示下。
顺便说下,这种集群不要大于4台(官网也这么推荐的),否则网络带宽被大量的占用,广播嘛每个人都到处发。已经下班了,OY!

 

 

 

 

分享到:
评论
5 楼 shiyanshiyan 2016-04-23  
爱笑的freeze 写道
我也是这个问题,纠结了一个礼拜,

解决了吗 少年
4 楼 shiyanshiyan 2016-04-23  
解决不同机器上的 session同步了吗?我也很纠结啊
3 楼 wenwxy418 2015-05-06  
wenwxy418 写道
tomcat不在同一台电脑时,修改配置使membership和receiver中的address保持一致就可以了。

上面说错了,勿怪
2 楼 wenwxy418 2015-05-06  
tomcat不在同一台电脑时,修改配置使membership和receiver中的address保持一致就可以了。
1 楼 爱笑的freeze 2015-02-13  
我也是这个问题,纠结了一个礼拜,

相关推荐

    Memcached+tomcat session共享jar 和tomcat xml配置

    在分布式系统中,Session共享是一个常见的挑战,尤其是在多个服务器之间,比如使用Tomcat作为Web容器的环境。Memcached,一个高性能、分布式的内存对象缓存系统,被广泛用于解决这个问题。本篇将深入探讨如何使用...

    redis linux(集群&单机) + Tomcat Session共享

    本资料包提供了从单机到集群的Redis部署教程,以及与Tomcat应用服务器Session共享的解决方案。 1. **Redis单机安装**:在Linux环境下,Redis的安装通常通过编译源码或者使用包管理器如`apt`或`yum`进行。单机安装...

    tomcat session共享负载

    【标题】:“Tomcat Session共享负载” 在分布式系统中,Session共享是一个常见的需求,尤其是在多台服务器组成的集群环境中。Tomcat作为广泛使用的Java Web服务器,提供了多种方式来处理Session的共享,以实现负载...

    tomcat session共享 redis

    tomcat session共享 redis

    kryo方式实现tomcat Session共享所需jar包

    以下将详细介绍使用Kryo方式实现Tomcat Session共享所需的知识点。 首先,理解Session共享的背景。在Web应用集群中,当用户在一台服务器上登录并创建Session后,如果该用户的后续请求被路由到另一台服务器,由于...

    memcached tomcat session 共享所需jar

    本篇将详细讲解如何利用Memcached来实现Tomcat容器中的session共享,并介绍相关的jar文件及其作用。 标题中的"memcached tomcat session 共享所需jar"是指在Tomcat服务器中集成Memcached作为session存储,以实现在...

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

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

    memcached-session-manager 实现 tomcat session共享

    标题 "memcached-session-manager 实现 tomcat session共享" 指的是在分布式环境中,通过 memcached-session-manager 这个工具来实现 Tomcat 应用服务器之间的 Session 共享。Session 是 Web 应用中用于存储用户状态...

    配置好的tomcat session共享(附件2个tomcat和测试demo)

    配置好的tomcat session共享 (附件2个tomcat和测试demo) 测试demo在apache-tomcat-6.0.35目录下logintest。 配置好jdk环境变量,把2个tomcat解压到D盘根目录后,即可分别启动tomcat。 访问...

    linux.redis+tomcat实现session共享

    linux.tomcat-session共享.redis.安装包

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    本篇文章将探讨如何利用Redis、Tomcat和Nginx来实现Session共享,以便在分布式环境中保持用户状态的一致性。 首先,让我们了解一下Session的概念。Session是Web服务器用来跟踪用户状态的一种机制。当用户登录后,...

    SN1997#Zjyc-document#TomcatSession共享方案1

    Tomcat Session共享方案使用Tomcat内置的Session复制方案​ 项目web.xml文件中添加节点2.使用Redis实现session共享to

    基于redis实现tomcat session共享与集群

    接下来,我们将介绍如何配置Tomcat以使用Redis进行Session共享: 1. 安装Redis:在所有参与集群的服务器上安装并启动Redis服务,确保它们可以通过网络互相通信。 2. 添加Redis Session Manager:在Tomcat的web应用...

    tomcat8集群实现session共享,内含session共享包

    在这个场景中,我们关注的是如何在Tomcat集群环境中实现Session共享,以便提高应用程序的可扩展性和可用性。标题和描述提到的“session共享包”是解决这一问题的关键。 **什么是Session?** 在Web应用中,Session是...

    nginx+Redis+tomcat实现session共享jar

    包含的jar包如下: commons-pool2-2.0.jar jedis-2.5.2.jar tomcat-juli-adapters.jar tomcat-juli.jar tomcat-redis-session-manager1.2.jar

    tomcat session共享的依赖包

    -- tomcat-redis-session共享配置 --&gt; &lt;Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /&gt; &lt;Manager className="com.orangefunction.tomcat.redissessions....

    nginx+tomcat shiro实现多tomcat下session共享

    "nginx+tomcat shiro实现多tomcat下session共享"这一主题,就是探讨在这样的架构中,如何有效管理和共享session。 1. **Nginx的作用**: Nginx是一个高性能的HTTP和反向代理服务器,常用于负载均衡,可以将用户的...

    tomcat 做session共享所需jar包压缩包

    标题中的“tomcat 做session共享所需jar包压缩包”指的是在多个Tomcat服务器之间实现Session共享所需的Java归档(JAR)文件集合。Session共享是解决在集群环境中用户会话一致性问题的关键技术,特别是在高可用性和...

    Nginx 集群 tomcat session 共享配置有源码

    为解决这个问题,我们可以利用Redis作为中央session存储,实现Nginx和Tomcat集群间的session共享。 首先,让我们理解Nginx、Tomcat和Redis的角色: 1. Nginx:作为前端反向代理服务器,负责接收用户的请求,并根据...

Global site tag (gtag.js) - Google Analytics