Подтвердить что ты не робот

Нулевой простоя на Heroku

Возможно ли сделать что-то вроде развертывание нулевого простоя Github на Heroku с использованием Unicorn на стеке Cedar?

Я не совсем уверен, как перезагрузка работает на Heroku и какой контроль над процессами перезапуска, но мне нравится возможность нулевого времени простоя развертывания и до сих пор, от что Я читал, это невозможно

Есть несколько вещей, которые потребуются для этого.

  • Прежде всего, нам нужны обратные совместимые миграции. Я оставляю это для нашей команды, чтобы понять.
  • Во-вторых, мы хотим перенести db сразу после нажатия, но до перезапуска (при условии, что наши миграции полностью обратно совместимы, это ничего не должно влиять)
  • В-третьих, мы хотели бы поручить Unicorn запустить новый мастер-процесс и разблокировать некоторые рабочие, затем поменять PID и изящно закрыть старый процесс/работников

Я просмотрел документы, но я не могу найти ничего, что указывало бы, что это возможно на Heroku. Любые мысли?

4b9b3361

Ответ 1

Я не могу адресовать миграции, но часть о перезапуске процессов и об отсутствии времени ожидания:

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

https://devcenter.heroku.com/articles/labs-preboot/

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

http://ylan.segal-family.com/blog/2012/08/27/deploy-to-heroku-with-near-zero-downtime/

Ответ 2

Вам может быть интересна их функция, называемая preboot.

Взято из их документации:

Эта функция обеспечивает плавное развертывание путем загрузки веб-динамиков с новым кодом перед тем, как убить существующие веб-диноды.

Некоторым приложениям требуется много времени для загрузки, и это может привести к недопустимым задержкам в обслуживании HTTP-запросов во время развертывания.

Есть несколько предостережений:

  • Для использования этой функции у вас должно быть как минимум два веб-динамика. Если тип вашего веб-процесса масштабируется до 1 или 0, предварительная загрузка будет отключена.
  • Тот, кто выполняет развертывание, должен будет подождать несколько минут, прежде чем новый код начнет обслуживать пользовательские запросы; это происходит позже, чем без предварительной загрузки (но в то же время запросы пользователей по-прежнему обслуживаются старыми динамиками).
  • Будет короткий период (минута или две), где heroku ps показывает статус нового кода, но пользовательские запросы все еще обслуживаются старым кодом.

Об этом гораздо больше информации, поэтому обратитесь к документации.

Ответ 3

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

  • Загрузите новый код
  • Запуск любых миграций баз данных
  • Синхронизировать активы

Загрузка кода и перезагрузка довольно проста, основная проблема кроется в двух других, но путь вокруг них примерно одинаковый.

По существу вам необходимо:

  • Сделайте код совместимым с миграцией, которую необходимо выполнить
  • Запустите миграцию и удалите любой код, написанный специально для него

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

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

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

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

Ответ 4

Нет - в настоящее время невозможно использовать Единорог на кедрах Героку. Я уже несколько недель прогонял Heroku.

Вот ответ поддержки Heroku на мой адрес 8 марта 2012 года:

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

Мы определенно знаем, что это боль, и мы работаем над тем, чтобы предлагать развертывание в режиме roll/zero-downtime в будущем. У нас нет ETA для анонса.