Может ли репликация сеанса произойти без липкой сеанса?
-
28-10-2019 - |
Вопрос
В контексте Tomcat может пройти репликация сеанса без включения липкого сеанса?
Я понимаю, что цель липкой сеанса - иметь клиент «палки» до 1 сервера на протяжении всего сеанса. С репликацией сеанса взаимодействие клиента с сервером воспроизводится по всему кластеру (многие веб -серверы).
В приведенном выше случае может ли репликация сеанса? Сессия клиента IE распространяется, хотя и выходит на веб -серверы, и каждое взаимодействие с любым одним веб -сервером реплицируется, что позволяет беспрепятственно взаимодействовать.
Решение
AFAIK, Clustering Tomcat не поддерживает нелейные сессии. Из Tomcat Docs:
Убедитесь, что ваш LoadBalancer настроен для режима липкого сеанса.
Но есть решение (я создал, так что вы знаете, что я предвзят :-)) Memcached-Session-Manager (МСМ), который также поддерживает нелейные сеансы. МСМ использует мемкахед (или любая бэкэнд, говорящий о протоколе Memcached) в качестве бэкэнда для резервного копирования/хранения сеанса.
В немаловатных режимах сеансы хранятся только в Memcached и больше не в Tomcat, как в случае с неприминными сеансами, сеанс-магазин должен быть внешним (чтобы избежать устаревших данных).
Он также поддерживает блокировку сеансов: с неопытными сессиями несколько параллельных запросов могут попасть в разные Tomcats и могут изменить сеанс параллельно, чтобы некоторые изменения сеанса могли перезаписаны другими. Блокировка сеанса позволяет синхронизировать параллельные запросы, идущие в разные Tomcats.
А MSM Home Page В основном описывает подход к липкому сеансу (как он начался только с этого), для получения подробной информации относительно неприбывших сессий, которые вы можете искать или спросить о список рассылки.
Подробности и примеры, касающиеся конфигурации, можно найти в MSM Wiki (SetupandConfiguration).
Просто чтобы дать вам представление о сложности: вам нужен один или несколько мемкахед Серверы, работающие (или S.Th. Аналогичный разговор Memcached) и обновленный контекст Tomcat.xml
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:host1.domain.com:11211,n2:host2.domain.com:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="auto"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
/>
</Context>
Ваше балансир нагрузки не нуждается в специальной конфигурации, поэтому, как только у вас появятся эти вещи, вы сможете начать тестирование вашего приложения.
Другие советы
Отличная статья об этой теме здесь:
Терракота, который они упоминают, имеет упрощенное руководство здесь:
Terracotta работает на Tomcat, но вы должны обратить внимание на проверку, какие кусочки терракотты бесплатны, а какие коммерческие. Пару лет назад их избыточный магазин был оплачен, и я не помню, чтобы это решение было отдельным продуктом.
Я на самом деле нашел обратный к этому вопросу. Репликация сеанса для меня (Tomcat7) с опциями OOTB работает только правильно без липкого сеанса. После переворачивания журнала я обнаружил, что с помощью JVMroutes мой идентификатор сеанса перешел от A123456789 до A123456789.01 - суффикс с jvmroute. Этот сеанс успешно воспроизведен из узла 01 в кластере до узла 02, но использует тот же идентификатор (A123456789.01). Когда я вынимаю узел 01 из кластера, трафик начинает придерживаться узела 02 - и теперь он смотрит на сеанс A123456789.02, которого, конечно, не существует. .01 есть, но в основном сидит на холостом ходу, пока не истекает. Если я подведу другой сервер, а сеансы воспроизводятся, а затем сниму 02, я получаю еще страшное поведение, потому что сеанс поднимается там, где он остановился.
Для меня, до сих пор, репликация сеанса без липких сессий (только обычный RR среди узлов в кластере) - единственное, что сработало.