TL; DR - имя узла в sessionId не обновляется до текущего имени узла в резервной копии при переходе основного вниз.
Версия Tomcat - apache-tomcat-7.0.50
У меня установлено два узла (2 экземпляра моего приложения в 2 отдельных котиках) с конфигурацией репликации сеанса (также используется липкий сеанс). конфигурация кластера из 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) Насколько я понимаю, идентификатор сеанса должен быть обновлен в резервной копии вскоре после первичной узел выходит из строя правильно? Я прочитал документацию по tomcat, и мне кажется, что она должна.
2) Если нужно, не могли бы вы помочь мне с конфигурацией, чтобы все заработало?
Я пробовал решать другие вопросы по SO, но, похоже, ни одно из них не помогло.
Заранее спасибо!
1) Насколько я понимаю, что идентификатор сессии должен быть обновлен в резервной копии вскоре после того, как основной узел выйдет из строя? Я прочитал документы tomcat, и кажется, что так и должно быть.
Ответ: Нет, когда первичный узел падает, он падает. нет времени на то, чтобы поместить что-либо в резервную копию узла "I'm gonna crush". в документе Tomcat сказано, что он будет реплицировать кластер узлов сеанса. для той части, которая упомянула обновление, это значит, что он будет обновляться на всех узлах.(а не на том, который уже был раздавлен).
2) Если это необходимо, не могли бы вы помочь мне с конфигурацией, чтобы это заработало?
Ответ: N/A