Облачный запуск с миграцией базы данных - PullRequest
3 голосов
/ 15 января 2020

Я хотел бы запустить миграцию БД в точке входа в облачный запуск (например, php artisan migrate), чтобы избежать необходимости использовать внешний инструмент для их запуска перед продвижением ревизии.

В kubernetes эта функция может быть достигается благодаря наличию контейнера init в развертывании, который запускает миграцию и устанавливает максимальный всплеск равным 1, гарантируя, что только один модуль пытается выполнить миграцию перед развертыванием в другие контейнеры.

Определена ли где-нибудь стратегия развертывания CloudRun? Было бы неплохо, если бы CloudRun ожидал исправности одного контейнера в ревизии, прежде чем сокращать оптовую продажу, что соответствовало бы этой цели (хотя это не так уж плохо для проблемы с postgres транзакционным DDL, если несколько контейнеров пытаются выполнить миграцию). Я думаю, что такое поведение я наблюдаю, но не уверен.

Есть ли лучший / не требующий обслуживания способ запуска миграций, чем запуск в каждой точке входа?

Ответы [ 2 ]

2 голосов
/ 16 января 2020

В kubernetes эта функциональность может быть достигнута, если во время развертывания запустить контейнер init при развертывании и установить максимальное увеличение до 1, гарантируя, что только один модуль попытается выполнить миграцию перед развертыванием в другие контейнеры.

В целом, это не очень хорошая практика, даже в Kubernetes.

В идеале ваш код переноса БД должен быть idempotent . Особенно в безсерверном мире вы обнаружите, что отсутствие этих примитивов удивительно, если вы не поменяете мышление и не задумаетесь об этих концепциях.

Стратегия развертывания Cloud Run заключается в настройке ручного трафика traffi c split - который маршрутизирует traffi c между ревизиями на основе заданного вами процента.

Вы можете разработать новую ревизию службы облачного запуска, получая 0% трафика c.

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

Используя этот трюк, вы можете выполнить миграцию БД (обратите внимание на " «Ограничения» в разделе документации по таймаутам запуска) до прослушивания номера порта. Но вам нужно написать какую-то логи c (или использовать внешний механизм блокировки / синхронизации), чтобы гарантировать, что путь к коду не будет выполняться снова и снова в будущем (или одновременно во время миграции).

1 голос
/ 15 января 2020

На Cloud Run нет проверки готовности. При развертывании новой ревизии:

  • Контейнер загружен
  • Контейнер запущен
    • Если запуск контейнера не удался -> Сообщение об ошибке
    • Иначе, переключите конфигурацию traffi c на новую ревизию

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

Это простая версия. В случае устойчивого трафика c, с несколькими параллельными экземплярами, это более сложно.

Надеюсь, что эти входные данные помогут вам!

...