Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Развертывание (одного узла) веб-приложения Django с практически нулевым временем простоя на EC2

Автор вопроса: rburhumОтветов: 4

Вопрос: Каковы хорошие стратегии для достижения нулевого (или максимально близкого к нулю) времени простоя при использовании Django?

В большинстве ответов, которые я читал, говорится "использовать юг" или "использовать ткань", но это очень расплывчатый ответ ИМХО. На самом деле я использую оба, и все еще задаюсь вопросом, как добиться нулевого времени простоя, насколько это возможно.

Некоторые подробности:

У меня есть приложение Django приличного размера, которое я размещаю на EC2. Я использую South для переноса схемы и данных, а также fabric с boto для автоматизации повторяющихся задач развертывания/резервного копирования, которые запускаются набором Jenkins (сервер непрерывной интеграции). База данных, которую я использую, представляет собой стандартный экземпляр PostgreSQL 9.0.

У меня есть...

  1. Промежуточный сервер, который постоянно редактируется нашей командой со всем новым контентом и загружается последним и лучшим кодом и...

  2. действующий сервер, на котором постоянно меняются учетные записи и пользовательские данные - все это записано в PostgreSQL.

Текущая стратегия развертывания:

При развертывании нового кода и контента создаются два моментальных снимка EC2 обоих серверов (действующий и промежуточный). Прямая трансляция переключается на страницу "Обновление нового контента"...

Начинается простой.

Сервер живого клонирования переносится на ту же версию схемы, что и промежуточный сервер (с использованием юга). Создается дамп только тех таблиц и последовательностей, которые я хочу сохранить в реальном времени (в частности, учетных записей пользователей вместе с их данными). Как только это будет сделано, дамп загружается на сервер промежуточного клонирования. Таблицы, которые были сохранены в реальном времени, усекаются, и данные вставляются. По мере роста данных на моем рабочем сервере это время, очевидно, продолжает увеличиваться.

После завершения загрузки эластичные ips живого сервера заменяются на промежуточный клон (и, таким образом, он становится новым живым сервером). Живой экземпляр и экземпляр живого клона завершаются.

Время простоя заканчивается.

Да, это работает, но по мере роста данных мое "виртуальное" нулевое время простоя становится все дальше и дальше. Конечно, мне пришло в голову каким-то образом использовать репликацию и начать изучать репликацию PostgreSQL и "в конечном счете согласованные" подходы. Я знаю, что есть некоторая магия, которую я мог бы сделать с балансировщиками нагрузки, но проблема с учетными записями, созданными в то же время, делает это сложным.

Что бы вы посоветовали мне посмотреть?

Обновление:

У меня есть типичное приложение Django с одним узлом. Я надеялся найти решение, которое будет более подробно решать специфические проблемы django. Например, идея использования поддержки Django для нескольких баз данных с пользовательскими маршрутизаторами наряду с репликацией. пришло мне в голову. Есть вопросы, связанные с тем, что, я надеюсь, коснется ответа.

djangopostgresqldeploymentamazon-ec2django-south

Ответы

Ответ 1 · рейтинг 4 · Wesley

На что может быть интересно взглянуть, так это на технику под названием Канарское высвобождение. Я видел великолепную презентацию Джеза Хамбла в прошлом году на конференции по программному обеспечению в Амстердаме; речь шла об релизах с низким уровнем риска, слайды находятся здесь.

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

Ответ 2 · рейтинг 2 · kd4ttc

Живой сервер не должен быть перенесен. Этот сервер должен быть доступен с двух промежуточных серверов, server0 и server1. Изначально server0 активен, и изменения вносятся в server1. Если вы хотите сменить программное обеспечение, переключитесь на живые серверы. Что касается нового контента, то его не должно быть на промежуточном сервере. Это должно быть на живом сервере. Добавьте в свои таблицы столбец с номером версии для таблиц содержимого и измените базу кода, чтобы использовать правильный номер версии содержимого. Разработайте программное обеспечение для копирования старых версий в новые строки с обновленными номерами версий по мере необходимости. Поместите номер текущей версии в файл settings.py на серверах server0 и server1, чтобы у вас было центральное место для программного обеспечения, на которое можно было бы ссылаться при выборе данных, или создайте приложение для доступа к базе данных, которое можно обновлять для получения правильных версий контента. Конечно, для файлов шаблонов они могут быть на каждом сервере и будут уместны.

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

Ответ 3 · рейтинг 1 · mpessas

Если я правильно понимаю, проблема, похоже, в том, что ваше приложение не работает, а данные восстанавливаются в новую базу данных вместе со схемой.

Почему вы создаете новый сервер в первую очередь? Почему бы не мигрировать базу данных на месте (конечно, после тщательного тестирования миграции) и, как только это будет сделано, обновить код и "перезапустить" ваши процессы (например, пушка может принять сигнал HUP, который сделает он перезагружает приложение, не сбрасывая соединения в очереди).

Многие миграции вообще не должны блокировать таблицы базы данных, так что это безопасно. Для остальных есть другие способы сделать это. Например, если вы хотите добавить новый столбец, который должен быть заполнен правильными данными, вы можете сделать это, выполнив следующие действия (кратко):

  1. Добавьте столбец как принимающий значения NULL и заставьте django начать запись в этот столбец, чтобы новые записи имели правильные данные.
  2. Заполните существующие записи.
  3. Заставьте django также начать чтение с нового столбца.

Ответ 4 · Nikolay Fominyh

Для достижения нулевого времени простоя у вас должно быть как минимум 2 сервера + балансировщик. И обновлять их последовательно. Если вы хотите обновить как базу данных, так и приложение, и иметь 0 простоев, у вас должно быть 2 сервера базы данных. Ни чудес, ни серебряной пули, и django не выберешься из проблем развертывания.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы