Wie können Sie Ihr Produktionscodebasis- / Datenbankschema aktualisieren, ohne Ausfallzeiten zu verursachen?

42

Was sind einige Techniken zum Aktualisieren des Codebasis- / Datenbankschemas eines Produktionsservers, ohne Ausfallzeiten zu verursachen?

Olivier Lalonde
quelle
1
Gute Frage, weil ich sehe, dass so viele Leute das übersehen. Zeit ist Geld und Ausfallzeiten sehen für Endbenutzer nie gut aus, egal aus welchem ​​Grund.
Dan McGrath
@Dan McGrath: Ich arbeite für ein System, das (normalerweise) nur viermal im Jahr (vierteljährlicher Ausfall) und höchstens 15 Minuten lang (während dieser Zeit ist der Datenverkehr in der Warteschlange) ausfällt. .. Datenbankänderungen werden intensiv geprüft :)
Matthieu M.
2
Dies wäre eine großartige Frage für dba.stackexchange.com , die in wenigen Stunden in die öffentliche Beta geht.
Larry Coleman

Antworten:

20

Im Allgemeinen waren die Websites, an denen ich gearbeitet habe, alle hinter Load Balancern oder hatten separate Failover-Standorte. In diesem Beispiel gehe ich davon aus, dass Sie einen einzelnen Load Balancer, 2 Webserver (A & B) und 2 Datenbankserver (M & N) haben - normalerweise sind DB-Server über Protokollversand miteinander verbunden - zumindest in der SQL Server-Welt ).

  1. Webserver A muss vom Load Balancer getrennt werden (damit der gesamte eingehende Datenverkehr an B weitergeleitet wird).
  2. Der Protokollversand wird gestoppt (DB Server M wird zuerst aktualisiert).
  3. Aktualisieren Sie Webserver A. Richten Sie die Konfiguration auf DB Server M.
  4. Testen Sie und überprüfen Sie, ob das Update funktioniert hat (in der Regel treffen die Leute die IP-Adresse direkt).
  5. Stellen Sie den Lastenausgleich so ein, dass vorhandene Sitzungen weiterhin mit B fortfahren. Neue Sitzungen mit A fortfahren.
  6. Warten Sie, bis alle Sitzungen von B abgelaufen sind (möglicherweise dauert es eine halbe Stunde oder länger, normalerweise beobachten wir den Datenverkehr und planen eine Pause von 1 Stunde).
  7. Update B und N.
  8. Testen und überprüfen Sie, ob das Update funktioniert hat.
  9. Richten Sie den Protokollversand erneut ein und testen Sie, ob er funktioniert.
  10. Stellen Sie den Load Balancer auf Normalbetrieb ein.

In sehr komplizierten Webanwendungen können die Schritte 1 bis 5 die ganze Nacht dauern und eine 50-seitige Excel-Tabelle mit Zeiten und Notrufnummern sein. In solchen Situationen ist die Aktualisierung der Hälfte des Systems für 18.00 bis 06.00 Uhr geplant, während das System den Benutzern zur Verfügung steht. Die Aktualisierung für die DR-Site wird normalerweise für die folgende Nacht geplant - hoffe nur, dass am ersten Tag nichts kaputt geht.

Wenn Betriebszeiten erforderlich sind, werden Patches zuerst in der QS-Umgebung getestet, die im Idealfall die gleiche Hardware wie die Produktion ist. Wenn sie keine Störung aufweisen, können sie nach dem regulären Zeitplan angewendet werden, der normalerweise am Wochenende ist.

Tangurena
quelle
7
Wie schlagen Sie vor, neue Daten aus DB M und DB N zusammenzuführen? Beide haben neue, aktualisierte und gelöschte Datensätze, die der andere nicht hat.
Sixtyfootersdude
@ Tangurena, kannst du den obigen Kommentar beantworten?
Sino
9

Für typische Datenbanken (z. B. Oracle) ist es möglich, das Datenbankschema zu ändern, während weiterhin Abfragen parallel ausgeführt werden. Es erfordert jedoch einige Vorausplanung.

Es gibt einige Einschränkungen für die Änderung:

  • Es sollte mit dem vorhandenen Code funktionieren, dh, der Code sollte sowohl die alte als auch die neue Version des Schemas verarbeiten
  • Die Datenbank sollte nicht so stark belastet werden, dass Transaktionen zum Stillstand kommen (ich sehe Sie an CREATE INDEX).
  • Es sollte keinen Datenverlust geben (Sie können keine Tabelle löschen und neu erstellen).

Damit das Schema abwärtskompatibel ist, können Sie normalerweise eine Spalte HINZUFÜGEN oder ÄNDERN. Sie können nur dann einen DROP ausführen, wenn der vorhandene Code ihn nicht mehr verwendet.

Wenn Ihr Code die Änderung nicht transparent verarbeiten kann, ändern Sie den Code, bevor Sie die Datenbank ändern.

Einfacher Hinweis zur Vorausplanung: Geben Sie die Spaltennamen in Ihren DB-Anfragen immer explizit an (nicht verwenden SELECT * FROM). Auf diese Weise werden in alten Anforderungen keine neuen Spalten angezeigt.

Matthieu M.
quelle
1
Um eine Vorausplanung und Anpassungsfähigkeit zu gewährleisten, ist die Auswahl * von unendlich besser als die manuelle Auflistung von Spalten. Die Verwendung expliziter Spaltennamen führt in den meisten Fällen zu einer hohen technischen Verschuldung. Wenn Ihr Code von neuen Spalten abweicht, ist Ihr Code bereits fehlerhaft.
Morg.
@Morg .: Nicht wirklich. Aus Sicherheitsgründen müssen Sie Bind - Variablen verwenden, die im Rahmen I Verwendung (mindestens) erfordert die Variablen zu schreiben bereitstellt, und es genau sein muss , so viele Variablen wie dort Ausgabespalten sind, so select *bedeutet , dass der Code bricht , wenn ein Es wird eine neue Spalte hinzugefügt (da keine Variable zum Schreiben vorhanden ist). Dies kann natürlich das Ergebnis einer stark typisierten Sprache sein.
Matthieu M.
Ja, es gibt keine zusätzliche Sicherheit beim Vermeiden von select *. Es hat nichts mit stark getippten Sprachen zu tun und alles mit sehr schlechtem Design. Wenn Ihr Framework nicht nahtlos mit Änderungen umgehen kann, ist dies nutzlos. Wenn ich eine Spalte ändere, funktioniert meine Anwendung immer wieder. Wenn du es tust, bricht es. Ich glaube nicht, dass es eine Frage gibt, welche zuverlässiger oder sicherer ist.
Morg.
@Morg .: Ich verstehe nicht, wie select *zuverlässiger und sicherer ist. Wenn Sie früher hatten, haben select one, two from ...Sie nur oneund verwendet two; Wenn thirdder Tabelle hinzugefügt wird, haben Sie (hier) keine Verwendung dafür, sodass es keinen Grund gibt, sie abzurufen. Und wenn Sie es plötzlich verwenden müssen, ändern Sie den Code, sodass Sie die Abfrage an dieser Stelle genauso gut ändern können!
Matthieu M.
@Morg .: Nun, es scheint, wir reden aneinander vorbei, wahrscheinlich weil sich unsere Erfahrungen unterscheiden. Ich arbeite an Produkten, bei denen Leistung von höchster Wichtigkeit ist. Dies bedeutet, selectdass ich so selektiv wie möglich sein muss (und durch einen Index abgedeckt bin). Es tut mir leid zu sagen, aber der Ansatz, den Sie beschreiben, war ein völliger Fehler bei diesen Produkten.
Matthieu M.
5

Nicht alle Systeme können, es muss in einer Weise eingerichtet werden, die es unterstützt.

Beispielsweise sollte eines unserer wichtigsten Systeme, an deren Upgrade ich vor einigen Jahren mitgewirkt habe, rund um die Uhr verfügbar sein. Es bestand aus mehreren Ebenen, einschließlich einer reinen Kommunikationsebene zwischen der externen Benutzerschnittstellenebene und der Business-Ebene. Aufgrund der Art und Weise, wie die Kommunikationsschicht codiert wurde, können zukünftige Änderungen an der Business-Schicht oder dem DB-Schema ohne einen echten Ausfall implementiert werden. Im schlimmsten Fall tritt bei einem Benutzer eine Pause von 10 bis 30 Sekunden auf, während die Änderungen wirksam werden.

Wenn es sich bei den Änderungen lediglich um Codeänderungen in der Business-Schicht handelte, konnten sie mit einer Verzögerung von nur Millisekunden in die Warteschlange gestellt und "eingezykliert" werden.

Es könnte dies tun, weil:

  • Die Kommunikationsschicht könnte Nachrichten enthalten. Auf diese Weise konnten wir einen tatsächlichen Ausfall auf einer anderen Ebene als der UI-Ebene feststellen, ohne dass die UI heruntergefahren werden musste.
  • Die Business-Schicht, die von der MVDB mit dem Namen UniData verwaltet wird . Dies hält den gesamten Code im Speicher. Nach dem Kompilieren des Codes können Sie einen Befehl verwenden, um den neuen Objektcode in den Speicher zu zwingen und den alten zu ersetzen.

Andere Techniken umfassen die Replikation von Transaktionen auf einen anderen Spiegel des vorhandenen Systems. Durch Anwenden des Updates auf eins, Umschalten und Wiederholen aller Transaktionen, die zwischen dem Update und dem Wechsel durchgeführt wurden. YMMV abhängig von Ihren Systemen.

Dan McGrath
quelle
1

Hier ist eine andere Perspektive aus der Welt der eingebetteten Datenbanksysteme und eingebetteten Systeme. Eingebettete Systeme umfassen verschiedene Geräte für die Netzwerk- / Telekommunikationsinfrastruktur und sprechen in diesem Bereich häufig von einer Verfügbarkeit von 99,999% (fünf Neuner).

Wir (McObject) sind der Anbieter der eXtremeDB-Produktfamilie eingebetteter Datenbanksysteme, einschließlich eXtremeDB High Availability.

Verstehen Sie zunächst, dass "eingebettete Datenbank" bedeutet, dass das Datenbanksystem eine Bibliothek ist, die kompiliert und mit Ihrem Anwendungscode verknüpft ist. In diesem Sinne ist es in Ihre Anwendung "eingebettet".

Mit eXtremeDB High Availability gibt es eine MASTER-Instanz Ihrer Anwendung (bei der es sich um einen oder mehrere Prozesse handeln kann) und eine oder mehrere REPLICA-Instanzen Ihrer Anwendung. Wenn ein Replikat eine Verbindung zum Master herstellt, erhält es eine Kopie der Master-Datenbank über einen Prozess namens "Initial Synchronisation". Dies kann erfolgen, während die Master-Anwendung ihre Arbeit fortsetzt. Einmal synchronisiert, empfängt es die Transaktionen des Masters durch Replikation. Aus diesem Grund verfügt ein Replikat immer über aktuelle Daten und kann diese (durch einen als Failover bezeichneten Prozess) übernehmen, falls der Master ausfällt.

Ein Merkmal der anfänglichen Synchronisation heißt "Evolution des binären Schemas". Im Klartext bedeutet dies, dass beim Auffüllen der Datenbank des Replikats Unterschiede zwischen dem Datenbankschema des Replikats und dem Datenbankschema des Masters berücksichtigt werden.

In der Praxis bedeutet dies, dass Sie eine neuere Version Ihrer Anwendung erstellen können (mit neuen / gelöschten Tabellen, neuen / gelöschten / geänderten Feldern, neuen / gelöschten Indizes), diese neue Version Ihrer Anwendung an einen Master anhängen und dies dann veranlassen können Ein neues Replikat wird zum neuen Master (dh ein Failover zum neuen Replikat wird erzwungen, sodass es zum Master wird und der alte Master sich selbst herunterfährt). Voila, Sie haben Ihre Anwendung von Version N auf N + 1 migriert, ohne die Verfügbarkeit Ihres Systems zu unterbrechen. Jetzt können Sie den alten Master und alle anderen Replikate auf Version N + 1 aktualisieren.


quelle