Das Erreichen einer Bereitstellung ohne Ausfallzeiten hat das gleiche Problem angesprochen, aber ich benötige einige Ratschläge zu einer Strategie, die ich in Betracht ziehe.
Kontext
Eine webbasierte Anwendung mit Apache / PHP für die serverseitige Verarbeitung und MySQL DB / Dateisystem für die Persistenz.
Wir bauen derzeit die Infrastruktur. Die gesamte Netzwerkhardware ist redundant, und alle Hauptnetzwerkkabel werden aus Gründen der Fehlertoleranz paarweise miteinander verbunden. Server werden als Hochverfügbarkeitspaare konfiguriert, um Hardwarefehlertoleranz zu gewährleisten. Sie werden sowohl hinsichtlich der Fehlertoleranz der virtuellen Maschine als auch hinsichtlich der allgemeinen Leistung im Lastenausgleich ausgeführt.
Es ist meine Absicht, dass wir Updates ohne Ausfallzeit auf die Anwendung anwenden können. Ich habe große Anstrengungen unternommen, um die Infrastruktur so zu gestalten, dass eine 100% ige Verfügbarkeit gewährleistet ist. Es wäre äußerst enttäuschend, wenn jedes Mal, wenn ein Update angewendet wird, eine Ausfallzeit von 10 bis 15 Minuten auftreten würde. Dies ist besonders wichtig, da ein sehr schneller Release-Zyklus angestrebt wird (manchmal können eine oder mehrere Releases pro Tag erreicht werden).
Netzwerktopologie
Dies ist eine Zusammenfassung des Netzwerks:
Load Balancer
|----------------------------|
/ / \ \
/ / \ \
| Web Server | DB Server | Web Server | DB Server |
|-------------------------|-------------------------|
| Host-1 | Host-2 | Host-1 | Host-2 |
|-------------------------|-------------------------|
Node A \ / Node B
| / |
| / \ |
|---------------------| |---------------------|
Switch 1 Switch 2
And onward to VRRP enabled routers and the internet
Anmerkung: DB-Server verwenden die Master-Master-Replikation
Vorgeschlagene Strategie
Um dies zu erreichen, denke ich derzeit daran, die DB-Schema-Upgrade-Skripte in zwei Teile zu unterteilen. Das Upgrade würde folgendermaßen aussehen:
- Der Webserver auf Knoten A wird offline geschaltet. Der Datenverkehr wird weiterhin vom Webserver auf Knoten B verarbeitet.
- Übergangsschemaänderungen werden auf DB-Server angewendet
- Webserver Eine Codebasis wird aktualisiert, die Caches werden gelöscht und alle anderen Upgrade-Aktionen werden ausgeführt.
- Webserver A wird online geschaltet und Webserver B wird offline geschaltet.
- Die Codebasis von Webserver B wird aktualisiert, die Caches werden gelöscht und alle anderen Aktualisierungsaktionen werden ausgeführt.
- Webserver B wird online geschaltet.
- Die endgültigen Schemaänderungen werden auf die Datenbank angewendet
"Übergangsschema" soll eine versionsübergreifende kompatible Datenbank erstellen. Dies würde hauptsächlich Tabellenansichten verwenden, die das alte Versionsschema simulieren, während die Tabelle selbst in das neue Schema geändert würde. Dadurch kann die alte Version wie gewohnt mit der Datenbank interagieren. Die Tabellennamen würden Schemaversionsnummern enthalten, um sicherzustellen, dass keine Unklarheiten darüber bestehen, in welche Tabelle geschrieben werden soll.
'Letztes Schema' würde die Abwärtskompatibilität aufheben und das Schema aufräumen.
Frage
Kurz gesagt, wird das funktionieren?
genauer:
Wird es Probleme geben, da möglicherweise gleichzeitig Schreibvorgänge zum bestimmten Zeitpunkt der Änderung des Übergangsschemas ausgeführt werden? Gibt es eine Möglichkeit, sicherzustellen, dass die Gruppe von Abfragen, die die Tabelle ändern und die abwärtskompatible Ansicht erstellen, nacheinander ausgeführt wird? Das heißt, alle anderen Abfragen werden im Puffer gehalten, bis die Schemaänderungen abgeschlossen sind. Dies dauert in der Regel nur Millisekunden.
Gibt es einfachere Methoden, die diesen Grad an Stabilität bieten und gleichzeitig Updates ohne Ausfallzeiten ermöglichen? Es ist auch vorzuziehen, die "evolutionäre" Schemastrategie zu vermeiden, da ich nicht an die Abwärtsschemakompatibilität gebunden sein möchte.