Um eine neue Version unserer Website bereitzustellen, gehen wir wie folgt vor:
- Komprimieren Sie den neuen Code und laden Sie ihn auf den Server hoch.
- Löschen Sie auf dem Live-Server den gesamten Live-Code aus dem IIS-Website-Verzeichnis.
- Extrahieren Sie die neue Code-Zip-Datei in das jetzt leere IIS-Verzeichnis
Dieser Vorgang ist vollständig skriptgesteuert und erfolgt recht schnell. Es kann jedoch zu einer Ausfallzeit von 10 bis 20 Sekunden kommen, wenn die alten Dateien gelöscht und die neuen Dateien bereitgestellt werden.
Irgendwelche Vorschläge zu einer 0-Sekunden-Ausfallzeitmethode?
asp.net
iis
deployment
redundancy
Karl Glennon
quelle
quelle
Antworten:
Sie benötigen 2 Server und einen Load Balancer. Hier ist in Schritten:
Selbst in diesem Fall kommt es immer noch zu einem Neustart der Anwendung und zum Verlust von Sitzungen, wenn Sie "Sticky Sessions" verwenden. Wenn Sie Datenbanksitzungen oder einen Statusserver haben, sollte alles in Ordnung sein.
quelle
Das Microsoft Web Deployment Tool unterstützt dies bis zu einem gewissen Grad:
Es scheint, dass die Transaktion für die gesamte Synchronisierung gilt. Außerdem ist TxF eine Funktion von Windows Server 2008, sodass diese Transaktionsfunktion mit früheren Versionen nicht funktioniert.
Ich glaube, es ist möglich, Ihr Skript für 0-Ausfallzeiten mithilfe von Ordnern als Versionen und der IIS-Metabasis zu ändern:
Diese Methode bietet folgende Vorteile:
quelle
Sie können eine Bereitstellung ohne Ausfallzeiten auf einem einzelnen Server erreichen, indem Sie das Anwendungsanforderungsrouting in IIS als Softwarelastausgleich zwischen zwei lokalen IIS-Standorten an verschiedenen Ports verwenden. Dies wird als blaugrüne Bereitstellungsstrategie bezeichnet, bei der jeweils nur einer der beiden Standorte im Load Balancer verfügbar ist. Stellen Sie die Bereitstellung auf der Site bereit, die "down" ist, wärmen Sie sie auf und bringen Sie sie in den Load Balancer (normalerweise durch Bestehen einer Integritätsprüfung für Application Request Routing). Nehmen Sie dann die ursprüngliche Site, die aktiv war, aus dem "Pool" (erneut) indem der Gesundheitscheck fehlschlägt).
Ein vollständiges Tutorial finden Sie hier.
quelle
Ich habe dies kürzlich durchlaufen und die Lösung, die ich gefunden habe, bestand darin, zwei Standorte in IIS einzurichten und zwischen ihnen zu wechseln.
Für meine Konfiguration hatte ich ein Webverzeichnis für jede A- und B-Site wie folgt: c: \ Intranet \ Live A \ Schnittstelle c: \ Intranet \ Live B \ Schnittstelle
In IIS habe ich zwei identische Sites (dieselben Ports, Authentifizierung usw.) mit jeweils einem eigenen Anwendungspool. Eine der Sites läuft (A) und die andere wird gestoppt (B). Der Live-Host hat auch den Live-Host-Header.
Wenn es um die Bereitstellung zum Leben geht, veröffentliche ich einfach am Standort der STOPPED-Site. Da ich über den Port auf die B-Site zugreifen kann, kann ich die Site vorwärmen, damit der erste Benutzer keinen Anwendungsstart verursacht. Dann kopiere ich mit einer Batch-Datei den Live-Host-Header nach B, stoppe A und starte B.
quelle
Mit der ServerManager-Klasse von Microsoft.Web.Administration können Sie Ihren eigenen Bereitstellungsagenten entwickeln.
Der Trick besteht darin, den PhysicalPath des VirtualDirectory zu ändern, was zu einem atomaren Online-Wechsel zwischen alten und neuen Web-Apps führt.
Beachten Sie, dass dies dazu führen kann, dass alte und neue AppDomains parallel ausgeführt werden!
Das Problem ist, wie Änderungen an Datenbanken usw. synchronisiert werden.
Durch Abfragen der Existenz von AppDomains mit alten oder neuen PhysicalPaths kann festgestellt werden, wann die alten AppDomains beendet wurden und ob die neuen AppDomains gestartet wurden.
Um das Starten einer AppDomain zu erzwingen, müssen Sie eine HTTP-Anforderung stellen (IIS 7.5 unterstützt die Autostart-Funktion).
Jetzt benötigen Sie eine Möglichkeit, Anforderungen für die neue AppDomain zu blockieren. Ich verwende einen benannten Mutex, der vom Bereitstellungsagenten erstellt wird und dessen Eigentümer ist, auf den Application_Start der neuen Webanwendung wartet und der dann vom Bereitstellungsagenten freigegeben wird, sobald die Datenbankaktualisierungen vorgenommen wurden.
(Ich verwende eine Markierungsdatei in der Web-App, um das Mutex-Warteverhalten zu aktivieren.) Sobald die neue Web-App ausgeführt wird, lösche ich die Markierungsdatei.
quelle
OK, da alle die Antwort ablehnen, die ich 2008 geschrieben habe * ...
Ich werde Ihnen sagen, wie wir es jetzt im Jahr 2014 machen. Wir verwenden keine Websites mehr, da wir jetzt ASP.NET MVC verwenden.
Wir brauchen dafür sicherlich keinen Load Balancer und zwei Server. Das ist in Ordnung, wenn Sie 3 Server für jede Website haben, die Sie pflegen, aber es ist für die meisten Websites ein totaler Overkill.
Außerdem verlassen wir uns nicht auf den neuesten Assistenten von Microsoft - zu langsam, zu viel versteckte Magie und zu anfällig für Namensänderungen.
So machen wir das:
Wir haben einen Post-Build-Schritt, der generierte DLLs in einen 'bin-pub'-Ordner kopiert.
Wir verwenden Beyond Compare (was ausgezeichnet ist **), um geänderte Dateien (über FTP, da dies weitgehend unterstützt wird) bis zum Produktionsserver zu überprüfen und zu synchronisieren
Wir haben eine sichere URL auf der Website, die eine Schaltfläche enthält, die alles in 'bin-pub' nach 'bin' kopiert (zuerst ein Backup erstellen, um ein schnelles Rollback zu ermöglichen). Zu diesem Zeitpunkt startet sich die App neu. Dann prüft unser ORM, ob Tabellen oder Spalten hinzugefügt werden müssen, und erstellt sie.
Das sind nur Millisekunden Ausfallzeit. Der Neustart der App kann ein oder zwei Sekunden dauern, aber während des Neustarts werden Anforderungen gepuffert, sodass praktisch keine Ausfallzeiten auftreten.
Der gesamte Bereitstellungsprozess dauert zwischen 5 Sekunden und 30 Minuten, je nachdem, wie viele Dateien geändert und wie viele Änderungen überprüft werden müssen.
Auf diese Weise müssen Sie nicht eine gesamte Website in ein anderes Verzeichnis kopieren, sondern nur den Ordner bin. Sie haben auch die vollständige Kontrolle über den Prozess und wissen genau, was sich ändert.
** Wir werfen immer einen kurzen Blick auf die Änderungen, die wir bereitstellen - als Last-Minute-Überprüfung, damit wir wissen, was zu testen ist, und wenn etwas kaputt geht, sind wir bereit. Wir verwenden Beyond Compare, weil Sie damit problemlos Dateien über FTP unterscheiden können. Ich würde das niemals ohne BC tun, Sie haben keine Ahnung, was Sie überschreiben.
* Scrollen Sie nach unten, um es zu sehen :( Übrigens würde ich Websites nicht mehr empfehlen, da sie langsamer zu erstellen sind und mit halb kompilierten temporären Dateien schwer abstürzen können. Wir haben sie in der Vergangenheit verwendet, weil sie Datei für Datei agiler waren Bereitstellung. Sehr schnell, um ein kleines Problem zu beheben, und Sie können genau sehen, was Sie bereitstellen (wenn Sie natürlich Beyond Compare verwenden - ansonsten vergessen Sie es).
quelle
Die einzige Methode ohne Ausfallzeiten, die ich mir vorstellen kann, ist das Hosting auf mindestens 2 Servern.
quelle
Ich würde Georges Antwort für einen einzelnen Server ein wenig wie folgt verfeinern:
In Schritt 4 wird der IIS-Arbeitsprozess recycelt.
Dies ist nur dann keine Ausfallzeit, wenn Sie keine InProc-Sitzungen verwenden. Verwenden Sie stattdessen den SQL-Modus, wenn Sie können (noch besser, vermeiden Sie den Sitzungsstatus vollständig).
Natürlich ist es etwas komplizierter, wenn es mehrere Server und / oder Datenbankänderungen gibt ....
quelle
Um die Antwort von sklivvz zu erweitern, die auf einer Art Load Balancer (oder nur einer Standby-Kopie auf demselben Server) beruhte.
Es ist möglich, ein bisschen Rauch zu testen, indem Sie einen Datenbank-Snapshot / eine Datenbank-Kopie erstellen. Dies ist jedoch nicht immer möglich.
Verwenden Sie nach Möglichkeit und Bedarf "Routing-Unterschiede", z. B. unterschiedliche Mieter-URLs (customerX.myapp.net) oder unterschiedliche Benutzer, um sie zuerst für eine unwissende Gruppe von Meerschweinchen bereitzustellen. Wenn nichts fehlschlägt, geben Sie es an alle weiter.
Da es sich um Datenbankmigrationen handelt, ist ein Zurücksetzen auf eine frühere Version häufig nicht möglich.
Es gibt Möglichkeiten, Anwendungen in diesen Szenarien besser zu spielen, z. B. die Verwendung von Ereigniswarteschlangen und Wiedergabemechanismen. Da es sich jedoch um die Bereitstellung von Änderungen an etwas handelt, das gerade verwendet wird, gibt es wirklich keinen narrensicheren Weg.
quelle
So mache ich es:
Absolute Mindestsystemanforderungen:
1 Server mit
(oder sogar nur zwei Reverse-Proxy-Anwendungen auf 2 verschiedenen TCP-Ports ohne Sandbox)
Arbeitsablauf:
Starten Sie die Transaktion myupdate
quelle
Ich würde vorschlagen, die alten Dateien dort zu belassen und sie einfach zu überschreiben. Auf diese Weise ist die Ausfallzeit auf Überschreibzeiten für einzelne Dateien beschränkt, und es fehlt immer nur eine Datei.
Ich bin mir nicht sicher, ob dies in einer "Webanwendung" hilft (ich glaube, Sie sagen, dass Sie das verwenden), weshalb wir immer "Websites" verwenden. Auch bei der Bereitstellung von "Websites" wird Ihre Website nicht neu gestartet und alle Benutzersitzungen werden gelöscht.
quelle