Назад | Перейти на главную страницу

Развертывание веб-приложений Python (Tornado) на нескольких серверах

У нас есть 4 сервера приложений и баланс нагрузки, на котором запущено одно из наших приложений Python. Каждый из серверов приложений имеет 32 гиперпоточных ядра, поэтому руководства по развертыванию Tornado предлагают запускать 64 потока на каждом. Мы также используем supervisord для управления всеми потоками. Это работает нормально, проблема заключается в том, что когда нам нужно развертывать обновления, текущий процесс развертывания новых приложений - это сценарий оболочки, который выполняет следующие действия;

Это ужасно неэффективно и занимает в общей сложности около 20 секунд. Перезапуск отдельных потоков торнадо занимает около секунды, но проблема в том, что если мы внесем какие-либо большие изменения, балансировщик нагрузки будет переключаться между старым и новым приложением в зависимости от того, на каком этапе перезагрузки выбирается поток (всего 256 возможных экземпляров, к которым может подключиться балансировщик нагрузки), поэтому нам приходится отключать сайт на 30 секунд, а иногда и дольше, чтобы получить правильные версии приложения.

Есть ли лучшие способы сделать это? Я слышал о Fabric и некоторых других инструментах, которые можно использовать, но являются ли они более эффективными, чем то, как мы это делаем сейчас? В идеале нам нужно перезагрузить все потоки до новой версии в течение 5 секунд, даже если это связано с временным отключением сайта.

Информация (если она вообще пригодится);
Все серверы - RHEL 5.5, балансировщик нагрузки - Barracuda 640.

Следующая последовательность должна сделать то, что вы хотите, если вы можете использовать API балансировщика нагрузки в вашем сценарии развертывания:

  1. Удалите часть ваших потоков из балансировщика нагрузки
  2. Обновите эти темы
  3. Удалите активные потоки из балансировщика нагрузки
  4. Добавьте обновленные потоки обратно в балансировщик нагрузки
  5. Обновить оставшиеся темы
  6. Добавьте оставшиеся потоки обратно в балансировщик нагрузки

Таким образом, у вас есть только одна версия кода, работающая в любой момент, и время простоя должно быть ограничено секундой или двумя, пока изменения пула вступят в силу.

Отказ от ответственности: Это предполагает, что балансировщик нагрузки Barracuda имеет достойный API. Я не мог найти документацию с помощью быстрого Google. Выкройка должна работать. Я делал это в аналогичной ситуации с балансировщиком нагрузки Cisco.

Почему бы не сделать это ..

Выполните развертывание в 2 части .. Вы подключаетесь к 2 узлам, чтобы отключить веб-сервер. Балансировщик нагрузки перестанет отправлять туда трафик. Разверните приложение. Поднимите веб-серверы, одновременно отключив другие 2 .. развертывание приложений .. запуск серверов.

Этот метод не очень хорошо масштабируется.

Варианты 2

Ваш LB делает липкие сессии? В таком случае включите их за час до развертывания. Выключите по одному серверу за раз для развертывания. Когда он будет запущен, одни пользователи увидят новый сайт, а другие - старый.

Итак, вы делаете по одному .. затем удаляете липкие сеансы из LB.