首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tomcat中的会话复制和集群?

tomcat中的会话复制和集群?
EN

Stack Overflow用户
提问于 2013-05-09 19:29:15
回答 2查看 6.9K关注 0票数 3

我已经配置了HttpServer2.2来实现我的java应用程序的load balancingClustering

但是Load Balancing工作正常,而Clustering(session replication)不工作。

我在HttpServer中的worker.properties将是,

代码语言:javascript
复制
workers.java_home=C:/Program Files/Java/jdk1.6.0_25

#worker.list=worker1,worker2
worker.list=balancer

worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1

worker.worker2.port=8019
worker.worker2.host=192.168.100.84
worker.worker2.type=ajp13
worker.worker2.lbfactor=1

worker.balancer.type=lb
worker.balancer.balance_workers=worker1,worker2
worker.balancer.method=B
# Specifies whether requests with SESSION ID's 
# should be routed back to the same #Tomcat worker.
worker.balancer.sticky_session =True

httpd.conf将会是,

代码语言:javascript
复制
<IfModule jk_module>

JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info

JkMount /CustomerChat_V1.02.00 balancer
JkMount /CustomerChat_V1.02.00/* balance

</IfModule>

在我的Tomcat one server.xml中,

代码语言:javascript
复制
<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.8"

            port="45564"
            frequency="500"
            dropTime="3000" />

        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="auto"
              port="4200"
              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=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;" />

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

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

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

在我的Tomcat two server.xml中,

代码语言:javascript
复制
       <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="192.168.0.1"
                  port="4100"
                  autoBind="100"
                  selectorTimeout="5000"
                  maxThreads="6" />

但仍然存在问题。

当我关闭Tomcat one时,新请求将自动发送到tomcat two。但是Tomcat two并不知道应用程序的当前用户状态和他存储的会话对象。

希望我们的堆栈成员能在这方面帮助我。

好的答案肯定是值得欣赏的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-09 20:28:28

一些评论/建议

  • 您提到的配置纯粹是负载均衡的。我假设您在HttpServer后面使用Tomcat (在Tomcat中使用AJP连接器)。
  • HttpServer将只通过将请求转发到Tomcat服务器。它本身并不维护用户的会话。Tomcat
  • 会话是在Tomcat维护的,因此您应该为会话集群配置Tomcat。对于

Tomcat集群,请参阅tomcat版本特定文档。这里是Tomcat 6.0 session clustering的链接。

  • 一旦Tomcat服务器被适当地集群,会话将被复制,并且每个服务器将识别其他服务器的用户的会话。

编辑:

在配置中,您提到了

代码语言:javascript
复制
worker.balancer.sticky_session =True

这将使HttpServer将所有请求发送到首次创建会话的tomcat (会话被固定在该服务器上,因此名称为粘滞会话)。这违背了会话集群的目的。请将其设置为false。

票数 5
EN

Stack Overflow用户

发布于 2021-08-02 11:51:20

作为一个很好的替代方案,可以使用基于Redis的Tomcat Session clustering。配置它所需的工作量要少得多。

First,添加会话管理器您的context.xml文件:

代码语言:javascript
复制
<Manager className="org.redisson.tomcat.RedissonSessionManager" 
         configPath="${catalina.base}/redisson.yaml" 
         readMode="MEMORY" updateMode="DEFAULT"/>

第二个,创建redisson.yaml配置文件:

代码语言:javascript
复制
singleServerConfig:
    address: "redis://my-redis:6379"

第三个,将Redisson项目中的两个jars拷贝到с_BASE/lib目录中:

redisson-all-3.16.1.jar

对于Tomcat 7.x - redisson-tomcat-7-3.16.1.jar

对于Tomcat 8.x - redisson-tomcat-8-3.16.1.jar

对于Tomcat 9.x - redisson-tomcat-9-3.16.1.jar

对于Tomcat 10.x - redisson-tomcat-10-3.16.1.jar

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16460716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档