Was sind einige Techniken zum Aktualisieren des Codebasis- / Datenbankschemas eines Produktionsservers, ohne Ausfallzeiten zu verursachen?
Was sind einige Techniken zum Aktualisieren des Codebasis- / Datenbankschemas eines Produktionsservers, ohne Ausfallzeiten zu verursachen?
Antworten:
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 ).
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.
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:
CREATE INDEX
).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.
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.
select *
zuverlässiger und sicherer ist. Wenn Sie früher hatten, haben select one, two from ...
Sie nur one
und verwendet two
; Wenn third
der 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!
select
dass 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.
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:
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.
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.