TL - 기본 노드가 다운 될 때 sessionId의 노드 이름이 백업의 현재 노드 이름으로 업데이트되지 않습니다.Tomcat 세션 복제 문제
톰캣 버전 - 아파치 - 톰캣-7.0.50 2012-06-14 - Tor 0.2.2.36 Tor
나는 두 개의 노드로 설정, (2 별도의 TOMCATS에서 내 응용 프로그램의 두 인스턴스)가 세션 복제 설정 (또한 끈적 끈적한 세션을 사용). 아래는 engine 태그 안에있는 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.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>
, 내가 세션 볼 수 있습니다 : 그것은 포트 번호를 제외하고 두 노드 모두에서 유사하다 : 로그인시 기본 노드에서 생성되는 (예 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
그러나 무슨 일이 일어나고 있는지 :
1) sessionid를가 업데이트되어야한다는 나의 이해가 :
Node 1 - - jsessionIdSample.node1 (NODE DOWN)
Node 2 - Backup - jsessionIdSample.node1
나는이 개 질문이 기본 노드가 올바르게 작동 한 후 바로 백업 하시겠습니까? 나는 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>
미리 감사드립니다!
안녕하세요, 응답 해 주셔서 감사합니다. 엔진 설정으로 질문을 업데이트하십시오. jvmRoute 속성은 다음과 같습니다. 노드 1 - node1, 노드 2 - 노드 2 – bub
안녕하세요 @Olaf, 질문에 server.xml의 전체 엔진 구성을 추가했습니다. 내 아파치 worker.properties에서 끈적 세션을 사용하고 있습니다. 사용자가 로그인하면 그의 요청은 Node1로 보내지며 모든 추가 요청은 노드 1에서 계속 제공됩니다. jsessionid가 node1에서 작성되면 node2 (jsessionIdSample.node1)에 복제됩니다. 나는 또한 앱을 배포하지 않고 이것을 시도했다. Tomcat 관리자에 로그인하여 세션 ID를 기본 노드 (jsessionIdSample.node1)의 jvmroute로 복제했음을 확인했습니다. 이 일이 일어나지 않아야합니까? – bub
jvmroute를 jsessionid에서 chnge로 확장하고 있는데, node1이 다운되면/멀티 캐스트 구성원을 잃을 때입니다. 이 경우 node2는 1 차가되고 jsessionid는 jsessionIdSample.node2로 변경됩니다. 이것은 발생하지만 첫 번째 요청이 처리 된 후에 만 발생합니다. 전의. node1이 다운되면 다음 요청이 session id가 jsessionIdSample.node1 (세션 시간 초과가 발생 함) 인 node2로 보내지지만이 reqst가 제공 될 때까지 세션 ID가 jsessionIdSample.node2로 변경됩니다. node1이 멀티 캐스트 그룹의 멤버쉽을 잃자 마자이 변경 사항을 수행하도록했습니다. – bub