Frage

Um eine neue Version unserer Website setzen wir wie folgt vor:

  1. Zip den neuen Code auf, und laden Sie sie auf dem Server.
  2. Auf dem Live-Server, löschen Sie alle Live-Code aus der IIS-Website-Verzeichnis.
  3. Extrahieren Sie den neuen Code zipfile in das nun leere IIS-Verzeichnis

Dieser Prozess wird alle vorbereitet, und passiert recht schnell, aber es kann immer noch eine 10 bis 20 Sekunden Ausfallzeiten, wenn die alten Dateien gelöscht werden, und die neuen Dateien eingesetzt werden.

Irgendwelche Vorschläge auf 0 Sekunden Ausfallzeit Methode?

War es hilfreich?

Lösung

Sie müssen 2-Server und einen Load Balancer. Hier ist in den Schritten:

  1. Schalten Sie den gesamten Datenverkehr auf Server 2
  2. Bereitstellen auf Server 1
  3. Test Server 1
  4. Schalten Sie den gesamten Datenverkehr auf Server 1
  5. Bereitstellen auf Server 2
  6. Test Server 2
  7. Schalten Verkehr auf beiden Servern

Das Ding ist, auch in diesem Fall werden Sie noch Anwendung neu gestartet und den Verlust von Sitzungen, wenn Sie „Sticky Sessions“ verwenden. Wenn Sie Datenbanksitzungen oder einen Zustand Server haben, dann sollte alles in Ordnung sein.

Andere Tipps

Das Microsoft Web Deployment Tool dies zu einem gewissen Grad unterstützt:

  

Ermöglicht Windows Transactional Datei   System (TxF) Unterstützung. Wenn TxF Unterstützung   aktiviert ist, Dateioperationen sind   Atom; das heißt, gelingt es ihnen, entweder   oder ganz ausfallen. Dadurch wird sichergestellt, Daten   Daten oder Dateien Integrität und verhindert   von bestehenden in einer „auf halbem Wege“ oder   beschädigter Zustand. In MS Deploy, TxF ist   standardmäßig deaktiviert.

Es scheint, die Transaktion für die gesamte Sync ist. Auch TxF ist ein Feature von Windows Server 2008, so dass diese Transaktion Feature wird nicht mit früheren Versionen arbeiten.

Ich glaube, es ist möglich, das Skript zu ändern, für die 0-Ausfallzeiten mithilfe von Ordnern als Versionen und die IIS-Metabasis:

  • für einen vorhandenen Pfad / url:
  • Kopieren Sie neue (oder geändert) Website-Server unter
    • \ web \ app \ v2.1 \
  • Ändern IIS-Metabasis auf der Website Pfad zu ändern
    • \ web \ app \ 2.0 \
    • \ web \ app \ v2.1 \

Dieses Verfahren bietet folgende Vorteile:

  • Sollte eine neue Version ein Problem hat, können Sie leicht zu v2.0 Rollback
  • auf mehrere physische oder virtuelle Server bereitstellen, können Sie Ihr Skript für die Datei Bereitstellung verwenden. Sobald alle Server die neue Version haben, können Sie gleichzeitig alle metabases Server ändern, um die Microsoft Web Deployment Tool.

Sie können durch die Verwendung von Routing von Anwendungsanforderungen in IIS als Software-Load-Balancer zwischen zwei lokalen IIS-Websites auf verschiedene Ports ohne Ausfallzeiten Einsatz auf einem einzigen Server erreichen. Dies ist bekannt als blau grün Einsatzstrategie , wo nur eine der beiden Standorte in dem Load-Balancer zu einem bestimmten Zeitpunkt zur Verfügung steht. Bereitstellen auf die Website, die „down“, warm es oben ist, und bringen sie in den Load-Balancer (in der Regel durch eine Anwendung anfordern vorbei Gesundheits-Check-Routing), dann die Original-Website nehmen, das oben war, aus dem „Pool“ (wieder durch seine Gesundheitscheck machen scheitern).

Eine vollständige Anleitung finden Sie hier.

Ich war vor kurzem durch diese und die Lösung war ich kam mit zwei Standorten in IIS eingerichtet haben und zwischen ihnen zu wechseln.

Für meine Konfiguration hatte ich ein Web-Verzeichnis für jedes A und B Seite wie folgt aus: c: \ Intranet \ leben ein \ Interface c: \ Intranet \ Live-B \ Interface

In IIS, ich habe zwei identische Sites (gleiche Ports, Authentifizierung usw.), die jeweils mit ihren eigenen Anwendungspool. Eine der Seiten läuft (A) und der andere angehalten ist (B). die Live hat man auch die Live-Host-Header.

Wenn es um zu Leben zu entfalten kommt, habe ich einfach in die gestoppten Website Standort veröffentlichen. Weil ich die B-Stelle mit seinem Port zugreifen kann, kann ich die Website Vorwärmung so der erste Nutzer keine Anwendung Start verursachen. Dann mit einer Batch-Datei, die ich die Live-Host-Header kopiere nach B, A zu stoppen und B beginnen.

Microsoft.Web.Administration der Servermanager-Klasse verwenden Sie können Ihre eigenen Entfaltungsmittel entwickeln.

Der Trick ist, die PhysicalPath des Virtual zu ändern, die zwischen alten und neuen Web-Anwendungen in einem Online-Atom-Schalter führt.

Beachten Sie, dass diese in den alten und neuen AppDomains Ausführung parallel zur Folge haben kann!

Das Problem ist, wie sich Änderungen an Datenbanken synchronisieren etc.

Durch die Abfrage für die Existenz von AppDomains mit altem oder neuem PhysicalPaths ist es möglich, zu erkennen, wenn die alte AppDomain wird (n) beendet, und wenn die neue AppDomain wird (n) in Betrieb genommen.

Um eine AppDomain zwingen starten Sie eine HTTP-Anforderung machen muss (IIS 7.5 unterstützt Autostart-Funktion)

Jetzt müssen Sie einen Weg, Anfragen für den neuen AppDomain zu blockieren. Ich benutze einen benannten Mutex - die durch die Implementierungsagenten erstellt wird und im Besitz, wartete auf der Application_Start des neuen Web-App, und dann durch die Implementierungsagenten freigegeben, sobald das Datenbank-Updates vorgenommen wurde

.

(Ich benutze eine Marker-Datei im Web-App das Mutex wartet Verhalten zu aktivieren) Sobald die neuen Web-App läuft ich die Marker-Datei löschen.

OK so, da jeder Downvoting die Antwort ich im Jahr 2008 zurück, schrieb * ...

Ich werde Ihnen sagen, wie wir es jetzt tun im Jahr 2014. Wir verwenden nicht mehr Webseiten, weil wir jetzt ASP.NET MVC verwenden.

Wir haben es sicherlich keinen Load Balancer und zwei Server müssen tun, das ist in Ordnung, wenn Sie 3-Server für jede Website, die Sie pflegen müssen, aber es ist total übertrieben für die meisten Websites.

Auch wir verlassen Sie sich nicht auf den neuesten Assistenten von Microsoft - zu langsam, und zu viel versteckt Magie und zu anfällig seinen Namen zu ändern

.

Hier ist, wie wir es tun:

  1. Wir haben einen Beitrag Build-Schritt, die Kopien DLLs in ein 'bin-pub' -Ordner erstellt.

  2. Wir verwenden Beyond Compare (das ist ausgezeichnet **) zu überprüfen und synchronisieren geänderte Dateien (über FTP, weil das weit unterstützt wird) bis zum Produktionsserver

  3. Wir haben eine sichere URL auf der Website eine Schaltfläche, die kopiert alles in ‚ist-Pub‘ zu ‚ist‘ (wobei eine Sicherung erste schnelles Zurückkehren ermöglichen) enthält. An diesem Punkt die App startet sich neu. Dann sind unsere ORM überprüft, ob es irgendwelche Tabellen oder Spalten, die hinzugefügt und sie erzeugt werden müssen.

Das ist nur Millisekunden Ausfallzeiten. Die App Neustart kann eine Sekunde dauern oder zwei, sondern während des Neustarts Anfragen gepuffert werden, so gibt es effektiv keine Ausfallzeiten ist.

Der gesamte Einsatz dauert überall von 5 Sekunden bis 30 Minuten, je nachdem, wie viele Dateien geändert werden und wie viele Änderungen zu überprüfen.

Auf diese Weise müssen Sie nicht eine ganze Website in ein anderes Verzeichnis kopieren, sondern nur den Ordner bin. Sie haben auch die vollständige Kontrolle über den Prozess und die genau wissen, was verändert sich.

** Wir tun immer einen schnellen Augapfel der Veränderungen, die wir bereitstellen - als Last Minute überprüfen, damit wir wissen, was passiert, wenn etwas kaputt wir bereit, zu testen und zu. Wir verwenden Beyond Compare, weil es Ihnen leicht diff-Dateien über FTP ermöglicht. Ich würde das nie tun, ohne vor Christus, du hast keine Ahnung, was Sie überschreiben.

* Blättern Sie nach unten, um zu sehen :( BTW würde ich nicht mehr Websites empfehlen, weil sie langsamer zu bauen sind und schlecht mit der Hälfte kompilierte temporäre Dateien zum Absturz bringen können. Wir haben sie in der Vergangenheit verwendet, weil sie agilen File- erlaubt für-Datei ein kleines Problem zu beheben Einsatz sehr schnell und Sie können genau sehen, was Sie bereitstellen.. (bei Verwendung von Jenseits natürlich vergleichen - sonst vergessen)

Die einzigen ohne Ausfallzeiten Methoden, die ich denken kann, an denen mindestens zwei Server-Hosting auf.

Ich würde George Antwort ein bisschen verfeinern, wie folgt, für einen einzelnen Server:

  1. Verwenden Sie ein Web-Bereitstellungsprojekt, um die Website in einer einzigen DLL vorge kompilieren
  2. Zip die neue Website auf und laden Sie sie auf dem Server
  3. Entpacken Sie es in einen neuen Ordner in einem Ordner mit den richtigen Berechtigungen für die Website befindet, so erben die entpackten Dateien die Berechtigungen richtig (vielleicht e: \ web, mit Unterordnern v20090901, v20090916 usw.)
  4. Verwenden Sie IIS-Manager, um den Namen des Ordners zu ändern, um die Website
  5. enthalten
  6. Halten Sie den alten Ordner um für eine Weile, so dass Sie im Falle von Problemen es Rückfall

Schritt 4 bewirkt, dass der IIS-Arbeitsprozess recyceln.

Dies ist nur ohne Ausfallzeiten, wenn Sie nicht mit InProc Sitzungen sind; verwenden SQL-Modus statt, wenn Sie können (noch besser, Sitzungszustand ganz vermeiden).

Natürlich, es ist ein wenig komplizierter, wenn mehrere Server und / oder Datenbankänderungen ....

Um auf sklivvz Antwort zu erweitern, die auf mit einer Art von Load Balancer verlassen (oder nur eine Standby-Kopie auf dem gleichen Server)

  1. Direkt gesamte Verkehr auf der Website / Server 2
  2. Optional ein bisschen warten, dass so wenige Benutzer wie möglich zu gewährleisten, haben anstehende Workflows auf der bereitgestellte Version
  3. Deploy to Site / Server 1 und warm es so viel wie möglich
  4. nach oben
  5. Ausführen Datenbank Migrationen transaktions (danach streben, dies zu ermöglichen)
  6. richten sofort den gesamten Verkehr auf der Website / Server 1
  7. Deploy to Site / Server 2
  8. Direktverkehr auf den beiden Websites / Server

Es ist möglich, ein wenig Rauch Tests einzuführen, durch eine Datenbank snapshot / Kopie zu erstellen, aber das ist nicht immer möglich.

Wenn möglich und Verwendung „Routing-Unterschiede“, wie verschiedene Mieter URL benötigt: s (customerX.myapp.net) oder verschiedene Benutzer, zuerst auf eine ahnungs Gruppe von Meerschweinchen zu implementieren. Wenn nichts ausfällt, lassen Sie an alle.

Da Datenbankmigrationen beteiligt ist, ein Rollback zu einer früheren Version ist oft nicht möglich.

Es gibt Möglichkeiten, in diesen Szenarien wie die Verwendung von Ereigniswarteschlangen und Wiedergabe Mechanismen Anwendungen spielen schöner zu machen, aber da wir über die Bereitstellung von Änderungen an etwas reden, die verwendet wird, gibt es wirklich keinen narrensicher Weg.

Dies ist, wie ich es tun:

Absolute Mindest-Systemanforderungen:
 1 Server mit

  • 1 Load Balancer / Reverse-Proxy (z.B. nginx) läuft auf dem Port 80
  • 2 ASP.NET-Kern / Mono-Reverse-Proxy / fastcgi chroot-Gefängnisse oder Docker-Container auf 2 verschiedenen TCP-Ports hören
     (Oder auch nur zwei Reverse-Proxy-Anwendungen auf zwei verschiedene TCP-Ports ohne Sandbox)

Workflow:

Starttransaktion MyUpdate

try
    Web-Service: Tell all applications on all web-servers to go into primary read-only mode 
    Application switch to primary read-only mode, and responds 
    Web sockets begin notifying all clients 
    Wait for all applications to respond

    wait (custom short interval)

    Web-Service: Tell all applications on all web-servers to go into secondary read-only mode 
    Application switch to secondary read-only mode (data-entry fuse)
    Updatedb - secondary read-only mode (switches database to read-only)

    Web-Service: Create backup of database 
    Web-Service: Restore backup to new database
    Web-Service: Update new database with new schema 

    Deploy new application to apt-repository 
    (for windows, you will have to write your own custom deployment web-service)
    ssh into every machine in array_of_new_webapps
    run apt-get update
    then either 
    apt-get dist-upgrade
    OR
    apt-get install <packagename>
    OR 
    apt-get install --only-upgrade <packagename>
    depending on what you need
    -- This deploys the new application to all new chroots (or servers/VMs)

    Test: Test new application under test.domain.xxx
    -- everything that fails should throw an exception here
    commit myupdate;

    Web-Service: Tell all applications to send web-socket request to reload the pages to all clients at time x (+/- random number)
    @client: notify of reload and that this causes loss of unsafed data, with option to abort 

    @ time x:  Switch load balancer from array_of_old_webapps to array_of_new_webapps 
    Decomission/Recycle array_of_old_webapps, etc.

catch
        rollback myupdate 
        switch to read-write mode
        Web-Service: Tell all applications to send web-socket request to unblock read-only mode
end try 

Ich würde vorschlagen, die alten Dateien dort zu halten und sie einfach zu überschreiben. Auf diese Weise die Ausfallzeit beschränkt sich auf Single-Datei überschreiben Zeiten und es gibt immer nur eine Datei auf einmal fehlt.

Nicht sicher, dass dies allerdings in einer „Web-Anwendung“ hilft (ich glaube, Sie sagen, dass das, was Sie verwenden), weshalb wir immer benutzen „Web-Sites“. Auch mit „Web-Site“ entfalte nicht neu starten Ihre Website und fallen alle Benutzersitzungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top