В базовом стеке LAMP, по крайней мере, с нашими серверами RHEL5 / 6, мы можем применять скользящие обновления кода в нашей системе управления документами через веб-серверы с балансировкой нагрузки, не прерывая подключения пользователей (и, возможно, загрузки документов), используя apachectl graceful
и apachectl graceful-stop
. Мы переходим на приложение на основе веб-сервера Tomcat, и мы хотели бы иметь такую возможность в нашей новой системе, но я не могу найти какой-либо эквивалентной функциональности с tomcat6. Есть ли такая возможность с tomcat6?
Короткий ответ
Если у вас есть экземпляры tomcat с балансировкой нагрузки, а ваш балансировщик нагрузки поддерживает липкие сеансы и динамическую конфигурацию, то вы можете добиться того типа скользящих и прозрачных обновлений, о которых вы говорите (в некоторой степени), вращая экземпляры tomcat 1 на 1.
Длинный (эр) ответ
Что касается других ответов, правильное описание tomcat как сервера приложений по сравнению с httpd и связанных проблем, на самом деле существует несколько способов получить то, что вы хотите, а именно прозрачный перезапуск конечного пользователя.
Учитывая, что Tomcat часто занимает 30 секунд или больше в зависимости от того, насколько чудовищно и раздуто ваше приложение для развертывания из холодного состояния, обычно полезно иметь возможность сделать это прозрачно.
Дополнительным преимуществом этого метода, о котором я расскажу, является то, что он обнадеживает, имея возможность проверить новое приложение в рабочей среде перед тем, как представить его своим клиентам.
Так... Apache's плавный перезапуск советует своим потомкам выйти после завершения их текущего запроса и заменяет их новыми порожденными процессами / потоками, которые перечитали новый файл конфигурации. Следовательно, долго работающие соединения могут завершить загрузку, а новые запросы получат новый контент. Фактически существует 2 версии приложения, работающие во время плавного перехода на перезапуск, управляемого apache, старая и новая.
К сожалению, с котом если установлено autodeploy = true, любое изменение файлов конфигурации или содержимого war вызывает довольно некрасивое повторное развертывание контекста, и я предполагаю, что веб-контейнер Catalina ждет в течение определенного времени, прежде чем убить все невыполненные потоки и запросы. Это не очень прозрачно, и вы в конечном итоге будете обслуживать ужасные 500 ошибок, пока приложение не вернется на ноги :-(
Следовательно, чтобы обеспечить прозрачность взаимодействия с конечным пользователем, вам необходимо иметь 2 версии вашего приложения, работающие одновременно в течение короткого периода времени, одну для старых подключений и одну для новых. (Есть ряд предостережений по поводу этих подходов, о которых я расскажу ниже ...)
В самый простой способ, заключается в наличии внешнего балансировщика нагрузки, такого как apache, haproxy или Cisco CSM, с двумя или более экземплярами tomcat, где балансировщик нагрузки поддерживает закрепленные сеансы и развертывание конфигурации горячей балансировки нагрузки.
например, tomcat1, tomcat2 и балансировщик
Обратите внимание, что это изменение уровень предпочтения узла, а не, падение node позволит балансировщику нагрузки изящно управлять переходом подключений к новому веб-приложению.
Очевидно, что если у вас есть только 1 сервер и, следовательно, только 1 кот, вы можете придумать что-то подобное, но это потребует умного наименования для вашего веб-приложения. Мне никогда не приходилось развертывать в продакшене на одном tomcat, но я бы сделал это с двумя версиями моего веб-приложения с разными именами войны и путями к документам, установленными на том же tomcat6, вот так;
/var/lib/tomcat6/webapps/mywebapp_0_1.war => http://localhost:8080/mywebapp_0_1
/var/lib/tomcat6/webapps/mywebapp_0_2.war => http://localhost:8080/mywebapp_0_2
И сделайте изменение прозрачным, используя apache mod_proxy или haproxy для изящного переноса соединений между двумя приложениями.
т.е. я бы установил apache httpd И tomcat6 вместе в одном и том же окне, с httpd mod_proxy, указывающим так;
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
<Proxy balancer://cluster>
BalancerMember http://localhost:8080/webapp_0_1
BalancerMember http://localhost:8080/webapp_0_2
</Proxy>
<Location />
ProxyPass balancer://cluster/webapp stickysession=JSESSIONID
</Location>
Предостережение, если вам нужно обновить схемы базы данных, тогда, если вы не хотите начать какое-то сумасшедшее именование и связывание дерьма с вашими базами данных, например database_0_1, тогда вам придется отсосать некоторое время простоя.
Если у ваших пользователей действительно длинные сеансы, то tomcat6 поддерживает кластеризация сеансов используя различные бэкенды
Для Tomcat такой функции нет.
Помните, что Tomcat - это сервер приложений, а не веб-сервер, и он должен загружать что-то при запуске и, возможно, корректно завершать работу после завершения работы.