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?