Tomcat 会话复制问题

Tomcat 会话复制问题

TL;DR - 当主服务器发生故障时,sessionId 中的节点名称不会更新为备份中的当前节点名称。

Tomcat 版本 - apache-tomcat-7.0.50

我设置了两个节点(我的应用程序的两个实例位于两个独立的 tomcat 中),并配置了会话复制配置(也使用粘性会话)。以下是 server.xml 中的集群配置,位于 Engine 标记内。除了端口号外,两个节点的配置类似:

<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="4050"
        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"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>\
</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>

从 tomcat 管理器中,我可以看到会话(例如:D042A0C5E380EB9E500224C87233119C.myNode1)在登录时在主节点中创建,并在备份中正确复制。

但是,一旦主节点发生故障,我希望备份节点中的 sessionId 将使用当前节点名称进行更新,即:D042A0C5E380EB9E500224C87233119C.myNode2

例子 :

当用户登录时:

Node 1 - Primary - jsessionIdSample.node1 
Node 2 - Backup - jsessionIdSample.node1 

当一个节点 1 发生故障时(预期的)

Node 1 - - jsessionIdSample.node1 (NODE GOES DOWN) 
Node 2 - Primary - jsessionIdSample.node2 

但实际发生的情况是:

Node 1 - - jsessionIdSample.node1 (NODE DOWN) 
Node 2 - Backup - jsessionIdSample.node1

我有两个问题:

1) 我的理解是,在主节点关闭后,应该立即在备份中更新 sessionID,这是否正确?我阅读了 tomcat 文档,似乎应该如此。

2) 如果可以的话,您能帮我进行配置以使其正常工作吗?

我尝试过 SO 上其他问题的解决方案,但似乎都没有用。

提前致谢!

答案1

1) 我的理解是,在主节点关闭后,应该立即在备份中更新 sessionID,这是否正确?我阅读了 tomcat 文档,似乎应该如此。

回答:不,当主节点宕机时,它就宕机了。它没有时间将任何内容发布到备份节点“我要崩溃了”。Tomcat 文档在这里说,它将跨节点集群复制会话。对于提到更新的部分,它的意思是,它将在所有节点上更新。(不是已经被压垮的节点)。

2) 如果可以的话,您能帮我进行配置以使其正常工作吗?

回答:不适用

相关内容