2017-06-28 2 views
0

TLDR:Azure Deployment-Slots und Datenbankmigrationen

Wie kann eine Anwendung in einem Staging-Slot ausgeführt werden wissen, dass es in der Inszenierung ist und zu einer Testdatenbank/run-Migrationen auf der Testdatenbank verbinden? Und wie kann dieselbe App im Staging-Slot automatisch erkennen, dass sie in den Live-Produktions-Slot getauscht wurde und nun für den Live-Geschäftsbetrieb verantwortlich ist? (So ​​kann es zur Verwendung von Live-db wechseln, wandern Live db etc.)

Lange Version:

Das Thema teilweise von dieser Frage bedeckt ist: Azure Web App deployment slots with database migration

aber ich habe wirklich nicht meine Antwort bekommen dort ..

Meine App verwendet FluentMigrator, initiiert von einem Ereignis/Code, wenn die App initialisiert wird, um Datenbankmigrationen auszuführen. MSBuild verwendet, es zu tun, aber jetzt bin ich ziemlich sicher, dass es

programmatisch genannt

Es scheint am sinnvollsten für:

  • Produktion ein Slot-basierte App Einstellung zu haben, die den Code an der Produktion db Punkte
  • Inszenierung eine Schlitz-Basis haben App-Einstellung, die den Code an der Inszenierung db Punkte

ich kann keine andere Möglichkeit sehen, für die Produktion funktionsfähig zu bleiben, während Inszenierung bewiesen wird, wenn Staging-Migrationen hat, dass Wrack die DB für Produktion u Verständnis; die zwei DBs müssen getrennt sein

Also, wenn die DBs getrennt sind, ist die einzige (fast) Null Ausfallzeit Weg der Welt auf die Verwendung des Codes in der Staging-Slot ist, wenn der Schalter bewirkt, dass die App sich reinitialisieren und ändert es so, dass es auf den Produktions-DB zeigt, dann kann fluentmigrator (der auch erneut aufgerufen werden sollte) die gleiche Menge von Migrationen auf die Produktion anwenden und der Code im Staging führt das Geschäft für eine Weile auf der Produktions-Datenbank aus.

..Produktion Codebase wird aktualisiert und der Austausch erfolgt. Produktionscode migriert niemals die Produktionsdatenbank, da sie bereits durch den Staging-Code aktualisiert wird, wenn die neue Version in der Produktion startet

Die einzige andere Art, wie ich Dinge vorhersehe, ist zwei DBs, zwei Slots und Sie nie einen Tausch durchführen; Sie implementieren nur die Staging-Datenbank, sie aktualisieren die Staging-Datenbank, Sie testen und beweisen, Sie implementieren in der Produktion, sie aktualisiert die Produktdatenbank, Sie verifizieren die App-Funktion .. und die Welt hat eine geringe Ausfallzeit erlitten, oder eine größere Menge, wenn der Build fehlgeschlagen ist)

Gibt es einen Mechanismus für den ehemaligen? Wie kann die App bei einem Tausch auf eine neue Datenbank verweisen und wie können Migrationen erneut ausgeführt werden?

Wenn letzteres der einzige Weg ist, dann könnten auch Deployment-Slots einfach eine andere Web-App sein, oder? Eine Web-App für die Staging und eine Web-App für prod, um jede Verwirrung Slots zu verursachen, weil sie im Portal vertreten sind.

+0

Am Ende des Tages Slot ist nur eine andere Web-App. Sie können die App-Einstellungen verwenden, um die db an einen bestimmten Steckplatz anzulegen. –

+0

Beantwortet die Frage nicht wirklich - während ich weiß, dass ein Slot nur eine andere Web-App ist, die eine "Click-to-Tausch-Verantwortung" -Rolle mit einer Produktions-App genießt, möchte ich wissen, welche Mechanismen existieren, damit sie ihre beabsichtigte Funktion erfüllt in einem Kontext, in dem Datenbankmigrationen existieren –

Antwort

1

Ich habe kürzlich ein ähnliches Problem gelöst. Meine Situation ist einfacher in der Art und Weise, wie ich nur in contenthaltenden Datenbanken aufstelle, während die Datensammlung beiseite steht und nicht berührt wird (wird schwierig, sobald wir sie aktualisieren müssen).

Wir haben jedoch eine Lösung gefunden, die für uns der beste Ansatz zu sein scheint. Wir stellen Slots bereit, während wir zwei dbs-Sets in einem elastischen Pool haben (was fast keine zusätzlichen Kosten verursacht), während jeder Slot auf einen dbs-Satz zeigt. Wenn wir eine Bereitstellung durchführen, aktualisieren wir Code und die schlitzbezogenen Datenbanken, führen Tests durch, um zu überprüfen, ob alles funktioniert, und führen dann den Swap durch - den Code und die db. Das bedeutet, dass nach dem Austausch der Code im Deployment-Slot aktiv wird und auf die dbs hinweist, auf die wir getestet haben, während der zuvor aktive Code und db-Set nicht offline sind und für eine weitere Bereitstellung bereit sind.

Wir können uns diesen Komfort leisten, da die Daten in der dbs ausschließlich unter unserer Kontrolle stehen und wir daher verhindern können, dass die db zwischen der Bereitstellung und dem Swap geschrieben wird.

Wenn Ihre Datenbank jedoch Daten aus der Live-Anwendung sammelt, sollten Sie die App für die Zeit der Aktualisierung deaktivieren, die Live-Daten mit der Staging-Datenbank zusammenführen, die Staging-Datenbank aktualisieren die neuesten Daten) und mache dann den Swap. Dies scheint mir der sicherste Weg zu sein, Datenverlust zu verhindern. Sie können auch Ihre Staging-Datenbank zuerst migrieren und dann die App ausschalten und die Daten in das neue Schema zusammenführen, hängt vom Charakter Ihrer App ab, ohne Ihre genaue Situation zu kennen, um einen generischen Ratschlag zu geben, ist hier ziemlich kompliziert.

Hoffe, diese Ideen helfen Ihnen zumindest ein bisschen, wenn Sie etwas besseren Ansatz herausgefunden haben, bin ich daran interessiert, davon zu hören.

Verwandte Themen