Tomcat中的会话复制和集群?

3
我已配置HttpServer2.2,以实现我的Java应用程序的负载均衡集群。但是负载均衡运行良好,集群(会话复制)没有生效。
我的worker.propertiesHttpServer中如下:
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 将是这样的:

<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文件中,
<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 2server.xml 文件中,

       <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不知道当前用户状态及其存储的应用程序会话对象。

希望我们的堆栈成员能够帮助我解决这个问题。

非常感谢好的答案。

2个回答

5
一些评论/建议
- 您提到的配置纯粹是负载均衡。我假设您正在使用带有AJP连接器的Tomcat在HttpServer后面。 - HttpServer只会将请求转发到Tomcat服务器。它本身不维护用户的会话。 - 会话在Tomcat中维护,因此您应该为会话集群配置Tomcat。 - 对于Tomcat Clustering,请参阅特定于Tomcat版本的文档。这是链接Tomcat 6.0 session clustering。 - 一旦Tomcat服务器适当地集群,会话将被复制,并且每个服务器都将识别其他服务器用户的会话。
编辑:
在您的配置中,您提到
worker.balancer.sticky_session =True

这将使HttpServer将所有请求发送到第一次创建会话的Tomcat上(该会话被捆绑在该服务器上,因此称为粘性会话)。这会破坏您进行会话集群的目的。请将其设置为false。


谢谢您的回复...我尝试了您的答案并更新了我的问题。请检查它并让我知道需要做哪些修改。 - Human Being
请检查两台服务器的启动日志,看是否有任何与集群设置相关的日志。无论您所做的配置对我来说都是正确的。 - Santosh
所有其他资源都告诉我要保持 worker.balancer.sticky_session =True,还有更多的建议吗? - Human Being

2
作为一种不错的选择,基于 Redis 的 Tomcat 会话集群可以被使用。它需要更少的配置工作。
首先,在您的 context.xml 文件中添加会话管理器:
<Manager className="org.redisson.tomcat.RedissonSessionManager" 
         configPath="${catalina.base}/redisson.yaml" 
         readMode="MEMORY" updateMode="DEFAULT"/>

第二步,创建redisson.yaml配置文件:
singleServerConfig:
    address: "redis://my-redis:6379"

第三步,将Redisson项目中的两个jar包复制到TOMCAT_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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接