Wir haben eine Anwendung, die eine Mischung aus schnellen (<1 Sekunde) und langsamen Datenbankmigrationen (> 30 Sekunden) bietet. Momentan führen wir Datenbankmigrationen als Teil von CI durch, aber dann muss unser CI-Tool alle Datenbankverbindungszeichenfolgen für unsere App (in mehreren Umgebungen) kennen, was nicht ideal ist. Wir möchten diesen Prozess so ändern, dass die Anwendung beim Start ihre eigenen Datenbankmigrationen ausführt.
Hier ist die Situation:
Wir haben mehrere Instanzen dieser Anwendung - ungefähr 5 in der Produktion. Nennen wir sie node1, ..., node5
. Jede App stellt eine Verbindung zu einer einzelnen SQL Server-Instanz her, und wir verwenden keine fortlaufenden Bereitstellungen (soweit ich weiß, werden alle Apps gleichzeitig bereitgestellt).
Problem: Angenommen, wir haben eine lange laufende Migration. In diesem Fall wird node1
die Migration gestartet und anschließend ausgeführt. Startet jetzt node4
und die lang laufende Migration ist noch nicht abgeschlossen. Startet also node4
auch die Migration -> mögliche Datenbeschädigung? Wie würden Sie dieses Problem verhindern oder ist das Problem überhaupt wichtig genug, um sich Sorgen zu machen?
Ich dachte daran, dieses Problem mit einer verteilten Sperre zu lösen (mit etcd
oder etwas in dieser Richtung). Grundsätzlich versuchen alle Apps, die Sperre zu erlangen. Nur eine von ihnen erhält sie und führt die Migrationen aus und entsperrt sie dann. Wenn der Rest der Apps gestartet wird und in den kritischen Bereich wechselt, wurden bereits alle Migrationen ausgeführt, sodass das Migrationsskript nur beendet wird.
Mein Bauch sagt jedoch: "Das ist übertrieben, es muss eine einfachere Lösung geben." Also dachte ich mir, ich würde hier fragen, ob jemand andere bessere Ideen hat.