Сетевая изоляция кластера Tomcat
Я играю с кластером Tomcat из 2 узлов ( A и B ).
Я настроил 2 сервера Tomcat для репликации их сеансов с помощью
org.apache.catalina.ha.session.DeltaManager
и все работает нормально, даже когда я выключаю один сервер / завершаю работу одного экземпляра Tomcat.
В своих тестах я попробовал следующий сценарий: я вошел в распространяемое приложение, и сеанс был создан на A , который пометил его как основной, а B реплицировал сеанс, пометив его как резервный.
Текущая ситуация
Затем я отключил сеть на A , изолировав этот узел от другого.
Узел B (ранее резервный) отмечает a
MemberDisappeared
и преобразовать его сеанс в первичный. Между тем A не может отправить свое сердцебиение по многоадресному адресу, регистрируя:
java.io.IOException: Network is unreachable (sendto failed)
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:693)
at org.apache.catalina.tribes.membership.McastServiceImpl.send(McastServiceImpl.java:514)
at org.apache.catalina.tribes.membership.McastServiceImpl.send(McastServiceImpl.java:491)
at org.apache.catalina.tribes.membership.McastServiceImpl.stop(McastServiceImpl.java:335)
at org.apache.catalina.tribes.membership.McastServiceImpl$RecoveryThread.stopService(McastServiceImpl.java:636)
at org.apache.catalina.tribes.membership.McastServiceImpl$RecoveryThread.run(McastServiceImpl.java:661)
Проблема возникает, когда я включил сеть для A , он снова присоединился к кластеру, но мой сеанс (тот же идентификатор) помечен как основной в обоих Tomcat Manager.
Разделенный мозг
В других случаях я пробовал этот эксперимент, иногда два узла могут найти сделку с одним узлом в качестве основного для этого сеанса, а другой - в качестве резервного. Иногда они не могут, и я видел, что сеанс иногда частично разрушался после синхронизации, иногда они считали себя одновременно Первичным ...
Это типичное состояние расщепления мозга, и мне интересно, какой план восстановления я могу сделать, чтобы его решить.
PS Я поискал в исходном коде Tomcat и обнаружил, что
DeltaManager
запрашивать весь сеанс при запуске этого компонента, и мне интересно, могу ли я принудительно выполнить какое-то восстановление сеанса после того, как он выполнил процесс восстановления с кластером. Возможно ли, или мне нужно жестко закодировать эту функцию?
PPS Извините за мой английский:]