Можно ли настроить Heroku на выполнение плавного развертывания?

Наша команда очень заинтересована в постоянном развертывании в последнее время, но мы столкнулись с небольшим препятствием в отношении того, как на самом деле получить код, развернутый на Heroku, - кажется неизбежным, что должно быть некоторое количество времени простоя для ввода кода в Heroku.

В традиционной среде развертывание кода, вероятно, будет выглядеть примерно так:

  • Нажимайте код до промежуточного каталога где-нибудь (старый код все еще жив)
  • Выполнить миграцию по базе данных (чаще всего безопаснее запускать миграцию заранее, а некоторые из них, которые могут сломать код, могут быть защищены)
  • Извлеките половину (или некоторый процент серверов) из балансировки нагрузки.
  • Разверните код для этих серверов.
  • Если возможно, запустите какой-то автоматический smoke test/выполните серверы так, чтобы они были "горячими"
  • Переключить, какие серверы находятся в балансировщике нагрузки и из него
  • Промыть и повторить.

С Heroku у меня очень мало контроля над двумя критическими шагами:

  • Сначала я не могу выполнить миграцию базы данных. Один из способов, которым я решил обойти это, - сохранить разветвления баз данных разветвленными отдельно и перенести их на герою в первую очередь - что в то время как болезненно, решит проблему - но только усугубит...
  • Время разворота Dyno может занять довольно много времени - очевидно, это скорее вина Rails, чем Heroku, но ключевая проблема заключается в том, что я не могу сделать что-то вроде балансировки нагрузки, перетасованной выше, чтобы убедиться, что мой приложение готово и загружено до того, как вновь развернутый сервер вернется в балансировщик нагрузки. Вместо этого у меня практически нет выбора, кроме как предоставить пользователям 10-15-секундный экран загрузки и надеяться на лучшее (и сделать это TWICE, если я использую стратегию развертывания базы данных сверху).

В настоящее время мы используем экран обслуживания, но он не будет масштабируемым решением, если мы перейдем к полному непрерывному развертыванию (у нас, вероятно, будет около 10-20 развертываний в день и 10-20 * 30 секунд обслуживания экран начинает складываться)

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

Ответы

Ответ 1

Что касается времени разгона динамиков, у Heroku есть бета-функция, которая может решить именно это:

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

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

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

Ответ 2

В Heroku мы вышлем SIGTERM на ваш dyno при перезапуске. Через некоторое время, если процесс не прекратится, они будут убиты. Это должно позволить вам достаточно времени для плавного перезапуска, когда вы не выполняете миграции.

Вы всегда можете выталкивать код в промежуточное приложение, которое указывало на вашу производственную БД и выполняло миграцию оттуда. Педро написал хорошее сообщение в блоге о запуске нулевой миграции простоя, которая также должна помочь: http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

Надеюсь, это поможет некоторым.