Ich versuche, Bereitstellungen ohne Ausfallzeiten zu erreichen, damit ich weniger während der Ausfallzeiten und mehr während der "langsameren" Stunden bereitstellen kann - oder theoretisch zu jeder Zeit.
Mein aktuelles Setup, etwas vereinfacht:
- Webserver A (.NET App)
- Webserver B (.NET App)
- Datenbankserver (SQL Server)
Mein aktueller Bereitstellungsprozess:
- Beenden Sie die Sites auf Webserver A und B
- Aktualisieren Sie das Datenbankschema für die Version der App, die bereitgestellt wird
- Webserver aktualisieren A
- Aktualisieren Sie den Webserver B
- Alles wieder online bringen
Aktuelles Problem
Dies führt zu einer geringen Ausfallzeit pro Monat - etwa 30 Minuten. Ich mache das außerhalb der Geschäftszeiten, es ist also kein großes Problem - aber es ist etwas, von dem ich wegkommen möchte.
Auch - es gibt keinen Weg, wirklich "zurück" zu gehen. Ich erstelle im Allgemeinen keine Rollback-DB-Skripte, sondern nur Upgrade-Skripte.
Den Load Balancer nutzen
Ich würde gerne einen Webserver auf einmal aktualisieren können. Nehmen Sie Webserver A aus dem Load Balancer heraus, aktualisieren Sie ihn, stellen Sie ihn wieder online und wiederholen Sie den Vorgang für Webserver B.
Das Problem ist die Datenbank. Jede Version meiner Software muss für eine andere Version der Datenbank ausgeführt werden - ich stecke also irgendwie fest.
Mögliche Lösung
Eine aktuelle Lösung, die ich in Betracht ziehe, ist die Annahme der folgenden Regeln:
- Löschen Sie niemals eine Datenbanktabelle.
- Löschen Sie niemals eine Datenbankspalte.
- Niemals eine Datenbankspalte umbenennen.
- Ordnen Sie niemals eine Spalte neu an.
- Jede gespeicherte Prozedur muss versioniert werden.
- Bedeutung - 'spFindAllThings' wird zu 'spFindAllThings_2', wenn es bearbeitet wird.
- Dann wird es 'spFindAllThings_3', wenn es erneut bearbeitet wird.
- Dieselbe Regel gilt für Ansichten.
Dies scheint zwar ein bisschen extrem - ich denke, es löst das Problem. Jede Version der Anwendung wird die DB auf eine nicht unterbrechende Weise treffen. Der Code erwartet bestimmte Ergebnisse von den Ansichten / gespeicherten Prozeduren - und dies hält diesen "Vertrag" gültig. Das Problem ist - es sickert nur schlampig. Ich weiß, dass ich alte gespeicherte Prozeduren bereinigen kann, nachdem die App für eine Weile bereitgestellt wurde, aber es fühlt sich nur schmutzig an. Auch - es hängt von allen Entwicklern ab, die diese Regel befolgen, was meistens passieren wird, aber ich stelle mir vor, dass jemand einen Fehler machen wird.
Endlich - meine Frage
- Ist das schlampig oder abgedreht?
- Macht es sonst noch jemand so?
- Wie lösen andere Leute dieses Problem?
quelle
Antworten:
Dies ist ein sehr pragmatischer Ansatz für datenbankgestützte Software-Upgrades. Es wurde beschrieben von Martin Fowler und Pramod Sadalage in den Jahren 2003 und anschließend geschrieben in Evolutionary Datenbank - Design: Refactoring Datenbanken .
Ich kann sehen, was Sie meinen, wenn Sie sagen, dass es schlampig erscheint, aber wenn Sie dies absichtlich und mit Bedacht tun und sich die Zeit nehmen, ungenutzte Strukturen aus der Codebasis und der Datenbank zu refaktorisieren, wenn sie nachweislich nicht mehr verwendet werden, ist es viel robuster als Einfachere Lösungen basierend auf Upgrade- und Rollback-Skripten.
quelle
"Keine Ausfallzeit" ist nur einer von vielen möglichen Gründen für diese Vorgehensweise. Wenn Sie ein Datenmodell auf diese Weise abwärtskompatibel halten, können Sie viele verschiedene Probleme lösen:
Wenn Sie über eine Vielzahl von Softwarepaketen verfügen, die auf Ihre Datenbank zugreifen, müssen Sie diese nicht alle überprüfen, wenn sie von einer Schemaänderung betroffen sind (in größeren Organisationen mit mehreren Teams, die Programme schreiben, die alle auf dieselbe Datenbank zugreifen, können Schemaänderungen sehr schwierig werden)
Wenn Sie müssen, können Sie eine ältere Version eines Ihrer Programme auschecken und es wird höchstwahrscheinlich auf einer neueren Datenbank ausgeführt (sofern Sie nicht erwarten, dass das alte Programm neuere Spalten korrekt verarbeitet).
Der Import / Export von archivierten Daten in die aktuelle Datenbankversion ist wesentlich einfacher
Hier ist eine zusätzliche Regel für Ihre Liste
(Dies stellt sicher, dass auch ältere Programme, die die neuen Spalten nicht kennen, nichts kaputt machen, wenn sie neue Datensätze in Ihrer Datenbank erstellen.)
Natürlich hat dieser Ansatz einen echten Nachteil: Ihre Datenmodellqualität kann sich mit der Zeit verschlechtern. Wenn Sie die vollständige Kontrolle über alle Anwendungen haben, die auf Ihre Datenbank zugreifen, und Sie alle diese Anwendungen einfach umgestalten können, wenn Sie beispielsweise eine Spalte umbenennen, sollten Sie die Dinge möglicherweise auf eine sauberere Weise umgestalten.
quelle
Es ist von Bereitstellung zu Bereitstellung unterschiedlich.
Sicher, Sie könnten niemals eine Tabelle oder eine Spalte löschen. Sie können niemals etwas ändern, das die Schnittstellenkompatibilität beeinträchtigt. Sie können jederzeit eine Abstraktionsebene hinzufügen. Aber dann müssen Sie diese Abstraktion und die Version die Versionierung versionieren.
Die Frage, die Sie sich stellen müssen, lautet: Ändert jede einzelne Version das Schema so, dass es nicht abwärtskompatibel ist?
Wenn nur sehr wenige Releases das Schema auf diese Weise ändern, ist das Datenbankproblem stummgeschaltet. Führen Sie einfach eine rollierende Bereitstellung der Anwendungsserver durch.
Die beiden Dinge, die mir bei der Bereitstellung mit minimalen Ausfallzeiten am meisten geholfen haben, sind:
Hoffentlich kann der Rest Ihrer Bereitstellungen für Wartungsfenster gespeichert werden.
Weitere Ideen zur Bewältigung der wenigen Bereitstellungen, für die Ausfallzeiten erforderlich sind:
quelle
Sie könnten es möglicherweise für ein bisschen mehr Aufwand so machen.
Natürlich benötigen die Web-Updates neue Konfigurationseinträge, um auf das neue Db-Schema zu verweisen. Wenn Sie Releases einmal im Monat durchführen und es ein kleines Team ist, wie viele DB-Änderungen nehmen Sie wirklich vor, die nicht abwärtskompatibel sind? Wenn Sie dies durch Testen kontrollieren können, können Sie eine automatisierte Bereitstellung ohne Ausfallzeit oder im schlimmsten Fall nur 5 Minuten Ausfallzeit anstreben.
quelle