2010-04-01 5 views
33

Плохая сторона нажатия на Heroku заключается в том, что я должен нажать код (и сервер перезагрузится автоматически) перед запуском миграции db.Горячее развертывание на Heroku без простоя

Возможно, это вызвало около 500 ошибок для пользователей, перемещающихся с веб-сайта с новым кодом без новых таблиц/атрибутов: решение, предлагаемое Heroku, заключается в использовании режима обслуживания, но я хочу, чтобы метод, работая каждый раз!

Есть ли способ? Например, с Капистранно:

  • готовит код для развертывания в новой директории
  • Я бег (назад) миграции и старый код продолжать работать отлично
  • я выключтель экземпляр ублюдка на новый каталог и перезапустите сервер

... и у меня нет простоев!

ответ

0

Heroku не может развертывать capistrano. Вы блокируете инструмент, выпущенный герокой.

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

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

+1

Привет shingara, мне очень жаль, но я не согласен с вами. Я не хочу использовать балансировку нагрузки для этого: одна из великих особенностей Heroku - это «прозрачная» облачная сила по необходимости, и я хочу использовать эту функцию ... Чтобы загрузить баланс в Heroku, я должен использовать два разные приложения и только чтение базы данных могут вызвать проблемы для моих пользователей. И никакой системы простоя никогда не бывает невозможным. Я использую систему, объясненную без простоя. В случае больших изменений без возможности ретро-совместимой схемы db я могу использовать страницу обслуживания: но это 5% всех моих случаев ... – zetarun

+0

Вы можете избежать проблемы, описанной в этом ответе, используя CouchDB, например. – iconoclast

5

Единственный способ улучшить процесс - это то, что предлагает этот парень. Это еще не горячий развернуть сценарий, хотя:

http://casperfabricius.com/site/2009/09/20/manage-and-rollback-heroku-deployments-capistrano-style/

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

21

Вы можете настроить второе приложение Heroku, которое указывает на тот же БД, что и ваше основное производственное приложение, и использовать вторичное приложение для запуска миграции базы данных без прерывания производства (при условии, что миграция не нарушит предыдущую версию вашего приложения) ,

Давайте называть Heroku приложения ПРОДАКШН и STAGING.

Ваша последовательность развертывания стала бы что-то вроде:

  1. Deploy новый код в STAGING
    git push heroku staging
  2. миграции базы данных Запуск на STAGING (обновить PROD дБ)
    heroku run -a staging-app rake db:migrate
  3. Развернуть новый код до ПРОДУКЦИЯ
    git push heroku production

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

Удачи вам!

+0

У вас все еще будет время простоя с шагом 3 вправо? – andrewrk

+0

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

+2

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

9

Если вы можете жить одновременно с двумя версиями одного и того же приложения, Heroku теперь имеет функцию предварительной загрузки.

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

+0

Правильная ссылка сейчас: https://devcenter.heroku.com/articles/preboot –

3

Вы на самом деле будет иметь некоторое время простоя, когда Heroku перезапускает приложение. Они имеют новую функцию под названием Preboot, начинающийся новые динамометрические стенды, прежде чем принимать старые: https://devcenter.heroku.com/articles/labs-preboot/

Как для миграции баз данных, что в статье ссылка на этот о том, как иметь дело с этим вопросом: http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

1

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

git commit -m 'added migration' -- db/migrate/2012-your-migration.rb 
Смежные вопросы