Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Як запускати міграції під час деплою на кілька серверів?

Міграції виконуються один раз на базу, а не на кожному сервері.

Як цього досягти:

  • окремий крок деплою (job у CI, init-контейнер, release-фаза) замість migrate у старті кожного контейнера;
  • якщо запускають з кожного сервера - php artisan migrate --isolated --force: перший бере атомарне блокування в кеші, інші тихо завершуються. Кеш має бути спільним;
  • --force потрібен, щоб команда не питала підтвердження на продакшені.

Сумісність схеми й коду. Під час rolling-деплою одночасно працюють стара й нова версії коду, тож міграція має підходити обом:

  1. Розширення: додати нову колонку (nullable чи з дефолтом), код пише в обидві.
  2. Перенесення даних фоново порціями.
  3. Перемикання коду на нову колонку.
  4. Звуження: видалити стару колонку окремим наступним релізом.

Що ще враховують:

  • довгі блокування на великих таблицях: instant() на MySQL, online() для індексів на PostgreSQL, нічні вікна для важкого;
  • PostgreSQL обгортає міграцію в транзакцію, а CREATE INDEX CONCURRENTLY у транзакції не працює;
  • сідери довідників - окремо від міграцій і ідемпотентні.

Докладніше в документації: Ізоляція виконання міграцій

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання