[英]Tomcat session replication issue
TL; DR - 當主節點關閉時,sessionId中的節點名稱未更新為備份中的當前節點名稱。
Tomcat版本 - apache-tomcat-7.0.50
我設置了兩個節點(我的應用程序在2個單獨的tomcats中的2個實例),使用會話復制配置(也使用粘性會話).Below是來自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
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<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="228.0.0.4"
port="4005"
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=""/>
<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>
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
節點2
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node2">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<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="228.0.0.4"
port="4010"
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=""/>
<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>
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
提前致謝!
不確定你是否混淆了一些東西 - 比如你說
用戶登錄時:
Node 1 - Primary - jsessionIdSample.node1 Node 2 - Backup - jsessionIdSample.node1
節點2不應該使用以.node2結尾的會話ID嗎?
使用IMHO的會話ID來自<Engine>
的jvmRoute
屬性並且粘在機器上 - 當節點1配置了<Engine jvmRoute="node1">
,這就是節點1所知道的。 很遺憾,您沒有引用上面的引擎配置。
jvmRoute只是對負載均衡器的一個提示,即哪台機器要路由,因此它必須穩定可靠。 它可能非常簡單,可以額外確保您的Node 2配置了jvmRoute="node2"
。 我從未在tomcat中看到過任何不同的行為。
即使你對問題的更新后我感覺有些奇怪 - 請參閱我的答案中的引用部分,其中節點1和節點2都使用“node1”作為指標。 那可能是罪魁禍首(或者是一個被遺忘的錯字)。 如果您使用Apache httpd,那么工作者必須像他們在workers.properties中的名字一樣命名(至少它們必須是唯一的。請參閱https://tomcat.apache.org/connectors-doc/reference/workers .html )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.