Что произойдет, если я буду запускать миграции django несколько раз параллельно?

#django

#django

Вопрос:

Итак, я часто работаю с проектами, в которых за балансировщиком нагрузки будет несколько dockerized серверов приложений django, и часто мне нужно будет выполнять развертывание на них. Я часто использую сторожевую башню для развертывания на основе извлечения. Я создаю новый образ, отправляю его в dockerhub, а watchtower отвечает за перенос этих образов на серверы и замену запущенных контейнеров. Все это работает довольно хорошо.

Я хотел бы начать автоматизировать выполнение миграций django. Один из способов, которым я мог бы добиться этого, — просто добавить запуск manage.py migrate в точку входа, и каждый контейнер автоматически попытается выполнить миграцию, когда контейнер подключится к сети. Это сработало бы, и это позволило бы избежать необходимости придумывать способ проведения локаута или выборов лидера; но без какого-либо способа предотвращения многократных запусков существует риск одновременного запуска нескольких экземпляров миграции. Если бы я пошел по этому пути, есть ли вероятность, что одновременное выполнение нескольких миграций может вызвать проблемы? Должен ли я искать какой-то другой способ запустить эти миграции один и только один раз?

Комментарии:

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

2. Не уверен. В итоге я добавил крошечный одноэлементный сервер, который просто выполняет миграции и другие разовые задачи при запуске. Это тот же образ, что и в основном приложении, но настроенный с другим набором переменных среды. проще, чем беспокоиться о том, были ли миграции чистыми

Ответ №1:

Одновременное выполнение миграций параллельно небезопасно. Я протестировал это, запустив команду migrate параллельно при переносе данных, и Django запустит миграцию дважды. Это добавит 2 строки в таблицу django_migrations. Ознакомьтесь с этим сообщением Google Groups, в котором обсуждается проблема, и этой статьей о выполнении миграций в контейнере statup .