tomcat中的会话复制和集群?

Hum*_*ing 2 java tomcat session-replication load-balancing cluster-computing

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

Load Balancing工作正常,Clustering(session replication)不起作用.

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
Run Code Online (Sandbox Code Playgroud)

而且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>
Run Code Online (Sandbox Code Playgroud)

在我server.xmlTomcat one,

<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>
Run Code Online (Sandbox Code Playgroud)

在我server.xmlTomcat two,

       <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="192.168.0.1"
                  port="4100"
                  autoBind="100"
                  selectorTimeout="5000"
                  maxThreads="6" />
Run Code Online (Sandbox Code Playgroud)

但仍有问题.

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

希望我们的堆栈成员能帮助我.

肯定赞赏好的答案.

San*_*osh 5

一些意见/建议

  • 您提到的配置纯粹是负载平衡.我假设您在HttpServer后面使用Tomcat(在Tomcat中使用AJP连接器).
  • HttpServer只会将请求转发给Tomcat服务器.它本身不维护用户的会话.
  • 会话在Tomcat维护,因此您应该为会话群集配置Tomcat.
  • 有关Tomcat群集,请参阅特定于tomcat的文档.这是Tomcat 6.0会话群集的链接.
  • 一旦Tomcat服务器被适当地集群,会话将被复制,并且每个服务器将识别其他服务器的用户的会话.

编辑:

在您的配置中,您提到了

worker.balancer.sticky_session =True
Run Code Online (Sandbox Code Playgroud)

这将使HttpServer将所有请求发送到第一次创建会话的tomcat(会话停留在该服务器上,因此名称为粘性会话).这会破坏会话群集的目的.请将此设置为false.