У нас есть приложение, которое сочетает в себе как быструю (<1 секунда), так и медленную миграцию базы данных (> 30 секунд). Прямо сейчас мы выполняем миграцию базы данных как часть CI, но затем наш инструмент CI должен знать все строки подключения к базе данных для нашего приложения (в разных средах), что не идеально. Мы хотим изменить этот процесс, чтобы приложение запускало собственные миграции базы данных при запуске.
Вот ситуация:
У нас есть несколько экземпляров этого приложения - около 5 в производстве. Давайте позвоним им node1, ..., node5
. Каждое приложение подключается к одному экземпляру SQL Server, и мы не используем скользящее развертывание (насколько я знаю, все приложения развертываются одновременно)
Проблема: скажем, у нас длительная миграция. В этом случае node1
запускается, а затем начинается выполнение миграции. Теперь node4
запускается, и длительная миграция еще не завершена, поэтому node4
также запускается миграция -> возможно ли повреждение данных? Как бы вы предотвратили эту проблему или эта проблема настолько важна, чтобы о ней беспокоиться?
Я думал о решении этой проблемы с распределенной блокировкой (используя etcd
или что-то в этом роде). По сути, все приложения пытаются получить блокировку, только одно из них получает ее и выполняет миграции, а затем разблокирует. Когда остальные приложения запускаются и входят в критическую секцию, все миграции уже выполнены, поэтому скрипт миграции просто завершается.
Тем не менее, моя интуиция говорит: «Это излишне, должно быть более простое решение», поэтому я подумал, что попрошу здесь, чтобы узнать, есть ли у кого-нибудь еще идеи получше.