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) 如果可以的话,您能帮我进行配置以使其正常工作吗?
回答:不适用