Ausführen von Datenbankmigrationen in einer automatisch skalierten Gruppe

8

Wir sind gerade dabei, von einer monolithischen Architektur zu einer automatisch skalierten Gruppe überzugehen, und ich bin mir nicht sicher, wie ich meine Datenbankmigrationen (Laravel) ausführen soll.

Ich denke, dass ein Skript ausgeführt wird, wenn eine neue Box online geht. Dadurch wird mein neuester Code heruntergezogen. Sollte dieses Skript auch meine Datenbankmigration ausführen? Ich bin nicht sicher, wie ich es auf nur einer Box zum Laufen bringen kann?

Mick
quelle
Ich gehe davon aus, dass Sie sich beim Übergang von monolithisch zu automatisch skaliert speziell auf Ihre Datenbank beziehen. Verwenden Sie AWS RDS? Wenn nicht, haben Sie sich darum gekümmert? aws.amazon.com/blogs/database/…
PrestonM
1
Ja, wir verwenden RDS. Nein, ich skaliere und verteile die EC2-Instanzen, in denen die Anwendung ausgeführt wird.
Mick
1
Eine Lösung besteht darin, Flyway oder Liquibase zu verwenden, mit denen idempotente Updates für die Datenbank ausgeführt werden können. Auf diese Weise kann jeder startende Knoten versuchen, die Datenbank zu aktualisieren, und nichts unternehmen, wenn die Migration bereits stattgefunden hat.
Tensibai
Faire Warnung: Flyway markiert Migrationen erst dann als abgeschlossen, wenn sie ausgeführt wurden. Wenn Sie Flyway gleichzeitig von mehreren Knoten aus starten, besteht eine gute Chance, dass diese versuchen, dieselbe Migration gleichzeitig durchzuführen, was zu Problemen führen kann.
Maplebird

Antworten:

1

Wie machst du deine Bereitstellungen? Nuke + erstellt die ASG neu (ob jeweils ein Knoten oder durch Ersetzen der gesamten Gruppe auf einmal), oder haben Sie ein Skript, das alle Ihre aktiven Knoten neu bereitstellt?

Und wie lösen Sie Ihre Bereitstellungen aus?

Idealerweise möchten Sie Bereitstellungen von einer Art CI-Server wie Bamboo oder Jenkins ausführen / auslösen. In diesem Fall können Sie Ihre DB-Migrationen vom Build-Server (oder seinen Komponenten-Build-Agent-Instanzen) ausführen.

Dies würde Ihnen eine bessere Kontrolle über Ihre Umgebung ermöglichen, da Sie beispielsweise die Datenbank aus dem Snapshot wiederherstellen könnten, wenn die Bereitstellung fehlschlägt.

Maplebird
quelle
Im Moment setzen wir einfach SSH auf die Produktionsbox und ziehen den Code. In Wirklichkeit denke ich, dass wir die meiste Zeit nur einen Knoten haben werden. Ich dachte, wir würden Code Deploy verwenden. Wir haben noch nicht viel Erfahrung mit AWS / Devops und versuchen nur, einen einfachen Weg zu finden, um mit einem Lastausgleich und ASG zu beginnen.
Mick
AWS CodeDeploy ist großartig und lässt sich langfristig skalieren, sobald Sie größer werden und mehr Server verwenden. Wenn Sie momentan manuell SSHing für die Bereitstellung verwenden, können Sie jederzeit über ein separates Skript verfügen, mit dem DB-Migrationen ausgeführt werden. Das heißt, Sie würden das normale Bereitstellungsskript über CodeDeploy und die Datenbankmigration manuell von einem Knoten ausführen. Wenn Sie keinen CI-Server erstellen, auf dem Liquibase bald ausgeführt werden kann, können Sie sich auch andere Software wie Datical ansehen: aws.amazon.com/blogs/devops/…
maplebird
1

Der Migrationsstatus vieler Orms in der Datenbank selbst, aber wenn Sie dies manuell tun, ist es auch nicht schwer, sich selbst zu erstellen. Haben Sie einfach eine "Migrationsstatus" -Tabelle, in der alle ausgeführten Migrationen gespeichert sind. Auf diese Weise kann ein Knoten, wenn er online geht, diese Tabelle einfach mit seinem lokalen Ordner "Migrationen" vergleichen und ausführen, was fehlt. Dies sollte dazu führen, dass nur Ihr erster Knoten nach einem Versionsstoß die Migrationen ausführt.

Als Randnotiz: CloudFoundry löst dieses Problem, indem jede Instanz (jeder Knoten) in Ihrem Skalensatz auf ihre Kennung zugreifen kann. Der erste erhält 0, der nächste 1 usw. Auf diese Weise weiß ein Knoten, ob er der erste ist, und kann Migrationen ausführen. Ich denke nicht, dass ASGs dasselbe haben.

Trondh
quelle