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