В настоящее время у нас есть следующая настройка.
TA и TB отстают от LB.
На данный момент это довольно сложная и ручная работа, чтобы извлечь Box A или Box B из LB, чтобы выполнить развертывание с нулевым временем простоя.
Думаю сделать что-то вроде этого:
В основном LB теперь будет направлять трафик между NA и NB. На каждом из Nginx у нас будут TA1, TA2 и TB1, TB2, настроенные как восходящие серверы. Когда одна из страниц проверки работоспособности вышестоящего сервера перестает отвечать (отключается), трафик переходит на другую (модуль HttpHealthcheckModule на Nginx).
Итак, процесс развертывания прост.
Скажем, TA1 активен с версией 0.1 приложения. Проверка работоспособности TA1 в порядке. Мы запускаем TA2 с Healthcheck как ERROR. Так что Nginx с ним не разговаривает. Развертываем версию приложения 0.2 на TA2. Убедитесь, что это работает. Теперь мы переключаем Healthcheck на TA2 на OK, переключаем Healthcheck на TA1 на ERROR. Nginx начнет обслуживать TA2 и удалит TA1 из ротации. Готово! А теперь то же самое с другой коробкой.
Хотя это звучит круто и красиво, как нам «морить голодом» Nginx? Допустим, у нас есть ожидающие подключения, некоторые пользователи используют TA1. Если мы просто отключим его, сеансы будут прерваны (у нас есть сеансы на основе файлов cookie). Не хорошо. Есть ли способ ограничить трафик на один из вышестоящих серверов с помощью Nginx?
Спасибо!
Я считаю, что если вы готовы установить такую сложную настройку, чтобы получить нулевое время простоя, вам следует вместо этого вкладывать свое время в улучшение балансировщика нагрузки. Идя по пути, который вы предлагаете, вы торгуете простотой ради минимальной экономии, которая всегда в конечном итоге обходится вам дороже, чем вы ожидаете.
Вам понадобится время простоя для реализации предлагаемого вами решения с нулевым временем простоя. Используйте это время простоя, чтобы вместо этого выяснить, как использовать существующий балансировщик нагрузки, или заменить его на что-то получше.
Не могли бы вы реализовать Spring Session, поддерживаемый реплицированным кластером redis на узлах A и B?
Если вы затем сконфигурируете оба экземпляра nginx для балансировки нагрузки по всем 4 экземплярам tomcat, вы можете в любой момент выключить или аварийно завершить работу любого сервера tomcat, и nginx просто будет использовать следующий сервер для обслуживания вашего запроса? Предполагается, что узлы A и B могут подключаться ко всем 4 экземплярам tomcat.
Я выполняю в основном то, что вы ищете, используя HAProxy в качестве моего балансировщика нагрузки и заставляя его часто проверять html-страницу "проверки работоспособности". В моей конфигурации nginx на внутренних веб-серверах эта страница физически не существует. Во время развертывания я создаю файл на внутреннем сервере с именем offline.html. В nginx, если этот файл существует при запросе «check.html», он обслуживает его, в противном случае он обслуживает настоящую страницу проверки работоспособности.
Во время развертывания я касаюсь файла offline.html, жду несколько секунд, пока балансировщик нагрузки не отключит сервер, развернется и затем удалит файл.
Сайт запускается, балансировщик нагрузки добавляет сервер обратно в пул, и все работает отлично ...
Боковое примечание, я бы попытался избавиться от привязки к сеансу, если вы можете ...