tomcat集群(共享session)

标签: tomcat 集群 共享 | 发表时间:2013-12-24 11:17 | 作者:jontan
出处:http://www.iteye.com

其实就是上述这样的一个架构,下面是原理
1)  Apache装有一个模块,这个模块叫mod_jk
2)  Apache通过80端口负责解析任何静态web内容
3)  任何不能解析的内容,用表达式告诉mod_jk,让mod_jk派发给相关的app server去解释。

通过上述的文字描述我们可以得知:
1) 我们需要在Apache中先装一个mod_jk
2) 我们需要在httpd.conf中写点表达式

下面来实现。
1)  把mod_jk.so手工copy进我们的Apache安装目录的modules目录下
下载地址  http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/

2)   用ultraedit打开httpd.conf文件,跑到文件最后面加入以下几行:

 

    ####### Apache整合Tomcat start #######

    #此处mod_jk的文件为你下载的文件
    LoadModule jk_module modules/mod_jk.so
    #指定tomcat监听配置文件地址
    JKWorkersFile conf/workers.properties
    #指定日志存放位置
    JkLogFile logs/mod_jk.log
    JkLogLevel info

    <VirtualHost localhost>
        ServerAdmin localhost
        DocumentRoot "D:\www"
        ServerName localhost
        
        SetEnv force-proxy-request-1.0.1
        SetEnv proxy-nokeepalive 1
        
        DirectoryIndex index.html index.htm index.jsp index.action
        ErrorLog logs/shsc-error_log.txt
        CustomLog logs/shsc-access_log.txt common
        JkMount /*WEB-INF ajp13
        JkMount /*j_spring_security_check ajp13
        JkMount /*.action ajp13
        JkMount /servlet/* ajp13
        JkMount /*.jsp ajp13
        JkMount /*.do ajp13
        JkMount /*.action ajp13
        JkMount /*fckeditor/editor/filemanager/connectors/*.* ajp13
        JkMount /fckeditor/editor/filemanager/connectors/* ajp13
    </VirtualHost>

    ####### Apache整合Tomcat end #######
 

 

Apache conf目录下 建个 workers.properties 文件 内容如下:

 

    ps=\
    worker.list=ajp13 #模块版本
    worker.ajp13.port=8009 #工作端口,若没占用则不用修改
    worker.ajp13.host=localhost #本机,若上面的Apache主机不为localhost,作相应修改
    worker.ajp13.type=ajp13 #类型
    #worker.ajp13.lbfactor=1 #代理数,不用修改
 

 


集群配置 tomcat6

第一种,simple tcp cluster (tomcat5以上版本自带的基于tcp广播技术的集群,这种方法比较简单,只需修改server.xml配置文件即可)
在<Engine></Engine>添加如下配置代码,多台机器,只需修改第二个 address (本机地址)和port 即可。

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">

  <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6" />
  <!--
    <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="   192.168.67.143" port="   4001" selectorTimeout="100" 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" />
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" />
  </Channel>

  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" />
  <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" />

 

 

 

 

  注意:在 Tomcat的集群复制中,分为DeltaManager和BackupManager两种,前者适合于小型系统,任何情况下,均进行Session复 制,消耗大量资源。所以,我们应该采用BackupManager,仅在需要的时候(Tomcat挂掉的时候)进行Session复制。如果是在同一台机器上配置多个tomcat实例来进行集群的测试,那么请一定要注意tomcat实例运行的端口和 集群所监听的端口是否冲突!

最后修改web应用WEB-INF目录下的 web.xml文件 在 </web-app>前加 <distributable />
   标签(这个是tomcat进行session复制所必须的,否则session不能进行复制!)
   或者 改变Tomcat的content.xml配置文件,修改 <Context distributable="true">

   tomcat的集群部署修改动作都比较简单,但实际在运行过程中会出现一系列的问题,我这里列举我在配置后使用过程中出现的一些问题和要点,供大家参考:

1、用户存入SESSION中的数据的问题

      使用tomcat集群进行SESSION复制,必须要保证你的session中存放的所有对象都是实现了java.io.Serializable接口 的,因为session复制就是序列化对象到其他WEB应用服务器上的,所以如果没有实现该接口,那么SESSION同步将会失败。另外一点,就是如果要 同步的机器比较多的话,那么要注意保证SESSION中存放的数据比较小,不要什么都存放到SESSION中,因为复制SESSION也是需要开销的,数 据越大开销也越大。

2、Tomcat执行SESSION复制的触发条件

      我们在tomcat的server.xml文件中集群部分cluster标签中可以看到属性:useDirtyFlag, 如果这个设置为true(默认的),那么只有当使用setAttribute往session中设置数据的时候才会同步其他WEB服务器的 SESSION,如果为false,那么每一次请求的sesison都会被同步到其他服务器上。因此在操作SESSION的时候要特别注意,避免出现 SESSION无法同步的问题。

 

      举个简单的例子,比如我们在单机应用情况下修改SESSION中用户的某一个数据,那么通常就是:

 

  1. User user = (User)request.getSession().getAttribute(“user”);
  2. User.setName(“my name”);

 

      这样我们就是直接存取出来,然后进行修改,虽然在单机情况下没有问题,但是在集群条件下,这样就导致了多台WEB服务器上的SESSION不同步的问 题,因为SESSION并没有改变,Tomcat无法监视session中某个数据的值是否发生了变化。因此,我们还需要执行如下操作以保证 SESSION的同步:

 

  1. request.getSession().setAttribute(“user”, user);

 

      所以,我们在操作SESSION的时候要特别注意!另外的建议就是,我们应该尽可能的不要修改SESSION中的数据。

3、Linux下的组播问题

      因为Tomcat的SESSION复制通信是通过组播功能来实现不同服务器之间的交互的,所以需要在服务器上开通组播功能,windows默认情况下是开通组播服务的,而Linux系统下默认是没有开通的,我们需要通过如下命令来开通其组播功能:

 

  1. route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

 

    如果需要服务器启动时即开通组播需在/etc/sysconfig/static-routes文件内加入eht0 net 224.0.0.0 netmask 240.0.0.0。具体组播概念请查阅CCNP相关内容。

可以通过netstate -g 来查看组播状态,也可以在route -e 命令中看到
 


 
第二种,使用memcached共享session
memcached-session-manager 配置
让tomcat 调用memcached 来存储session 早就是一个很成熟的解决方案了,开源的msm 就可以解决这个问题。
官方给出的4 种序列化方案,其中kryo 是效率最高的,具体比较看官方地址:
http://code.google.com/p/memcached-session-manager/wiki/SerializationStrategies
下载地址:
http://code.google.com/p/memcached-session-manager/downloads/list
本次实验用的tomcat版本为6.0.18,以下为我用包,,谁有需要可以联系我,(高版本的自己测试如果不报错,,就可以直接用)
kryo-1.03.jar
reflectasm-0.9.jar
minlog-1.2.jar
kryo-serializers-0.8.jar
memcached-2.5.jar
memcached-session-manager-tc7-1.5.1.jar
msm-kryo-serializer-1.5.1.jar
memcached-session-manager-1.5.1.jar
把以上8个包丢在tomcat的lib文件夹
修 改Tomcat的配置文件context.xml,调整成新的session存储方式,在配置文件中<context>标签内加入一下代码 (如果memcached跟tomcat不在同一台机器,修改127.0.0.1为memcached所在机器的IP):
 
 
 
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

在tomcat/conf/logging.properties 文件中添加de.javakaffee.web.msm.level=FINE , 就可以在
catalina.out 的日志中看到详细的session 存取情况。
 
一般前边还有Nginx做转发,分发给不同机器的tomcat上面,, tomcat集群(共享session)



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [tomcat 集群 共享] 推荐:

tomcat集群(共享session)

- - 研发管理 - ITeye博客
其实就是上述这样的一个架构,下面是原理. 1)  Apache装有一个模块,这个模块叫mod_jk. 2)  Apache通过80端口负责解析任何静态web内容. 3)  任何不能解析的内容,用表达式告诉mod_jk,让mod_jk派发给相关的app server去解释. 通过上述的文字描述我们可以得知:.

Nginx+Tomcat+Memcached共享session集群配置

- ENOCH - ITeye论坛最新讨论
2、memcached共享session. 3、tomcat集群配置(3台CentOS 6). (172.18.188.64): 操作系统CentOS 6; 安装nginx、memcached和tomcat 6. (172.18.188.76): 操作系统CentOS 6; 安装tomcat 6. (172.18.188.78): 操作系统CentOS 6; 安装tomcat 6.

tomcat集群配置

- - 互联网 - ITeye博客
OS环境:windows XP 32位. 服务器集群会比单机的TPS提高不少,也提高了系统的可用性,避免单机宕机影响整个系统不能运行,所以集群会比单机有众多优点. Apache的安装过程略. mod_jk.so使用的是tomcat-connectors-1.2.39-windows-i386-httpd-2.2.x版本,从名字可知,这个tomcat的connectors会对应多个Apache 2.2不同的版本.

tomcat的集群配置

- - CSDN博客推荐文章
配置环境需要:1.Apache服务器,下载地址: http://httpd.apache.org/download.cgi#apache22.  2.tomcat6.0或者tomcat7.0,(集群中tomcat不能既有tomcat6又有tomcat7,否则虽能够负载均衡,但不能进行session复制,下载地址: http://tomcat.apache.org/.

solrCloud+tomcat+zookeeper集群配置

- - 研发管理 - ITeye博客
     SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心.    上面也说了  SolrCloud是基于Solr和Zookeeper的分布式搜索方案,所有要部署solrCloud+tomcat+zookeeper的集群,必须先安装zookeeper.

Apache整合Tomcat、集群

- - ITeye博客
Apache 整合 Tomcat 、集群. 1.1     使用mod_proxy整合. 1.2     使用mod_jk整合. 1.3.1    Tomcat集群配置. 1.3.2    mod_proxy进行负载均衡. 1.3.3    mod_jk进行负载均衡.        Apache整合Tomcat主要有两种方式,通过mod_proxy整合和通过mod_jk整合.

nginx+tomcat+redis完成session共享

- - 企业架构 - ITeye博客
本文记录nginx+redis+tomcat实现session共享的过程. nginx安装: http://blog.csdn.net/grhlove123/article/details/47834673. redis安装: http://blog.csdn.net/grhlove123/article/details/47783471.

Apache+Tomcat+Memcached共享Session的构架设计

- - CSDN博客架构设计推荐文章
一、       方案目标. 实现互动留言系统、后台发布系统的高可用性,有效解决高并发量对单台应用服务器的冲击,确保应用服务器单点故障不影响系统正常运行. 二、       部署架构. 采取Tomcat集群的部署方式,Apache通过proxy_module代理方式对用户的请求进行负载均衡,转发至tomcat集群中的某一实例进行处理,tomcat集群之间通过Memcached高性能缓存集群共享持久Session.

集群session共享机制

- - 企业架构 - ITeye博客
        现在集群中使用的Session共享机制有两种,分别是session复制和session粘性.        该种方式下,负载均衡器会根据各个node的状态,把每个request进行分发,使用这样的测试,必须在多个node之间复制用户的session,实时保持整个集群中用户的状态同步.

apache与tomcat负载集群的3种方法

- dongsheng - BlogJava-首页技术区
花了两天时间学习apache与tomcat的集成方法,现在把学习成果记录下来. apache与tomcat负载集群集成方法有3种jk、jk_proxy、http_proxy. 本次测试是1个apache集成两个tomcat. 安装apache http server省略,访问地址为http://127.0.0.1:8081.