Нулевой простоя на Heroku
Возможно ли сделать что-то вроде развертывание нулевого простоя Github на Heroku с использованием Unicorn на стеке Cedar?
Я не совсем уверен, как перезагрузка работает на Heroku и какой контроль над процессами перезапуска, но мне нравится возможность нулевого времени простоя развертывания и до сих пор, от что Я читал, это невозможно
Есть несколько вещей, которые потребуются для этого.
- Прежде всего, нам нужны обратные совместимые миграции. Я оставляю это для нашей команды, чтобы понять.
- Во-вторых, мы хотим перенести db сразу после нажатия, но до перезапуска (при условии, что наши миграции полностью обратно совместимы, это ничего не должно влиять)
- В-третьих, мы хотели бы поручить Unicorn запустить новый мастер-процесс и разблокировать некоторые рабочие, затем поменять PID и изящно закрыть старый процесс/работников
Я просмотрел документы, но я не могу найти ничего, что указывало бы, что это возможно на Heroku. Любые мысли?
Ответы
Ответ 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 для анонса.