Wir haben eine Situation, in der mehrere Server mit Lastenausgleich auf eine gemeinsame Datenbank verweisen.
Im Normalfall funktioniert dies einwandfrei und bietet Redundanz, Skalierbarkeit usw.
Wir finden den Einsatz jedoch etwas mühsam.
Wir verwenden Funktionen in großem Umfang und versuchen, die Bereitstellung zu automatisieren. Die Bereitstellung ist derzeit nicht sehr zuverlässig.
In vereinfachter Form besteht das Bereitstellungsskript für jeden Server aus zwei Phasen
Dateien aktualisieren
Funktionen zurücksetzen (mit denen Abhängigkeiten, Einstellungsänderungen usw. verwaltet werden)
Gibt es Best Practices für die Bereitstellung auf mehreren Servern, ohne dass diese in einem inkonsistenten Zustand sind?
Soweit ich sehen kann, führt das Bereitstellen der Schritte 1 und 2 auf Server A zu einem Ausfall von Server B. Wenn Sie Schritt 1 auf beiden Servern versuchen, bevor Sie mit Schritt 2 fortfahren, werden beide für eine Weile unterbrochen.
quelle
In unserem Unternehmen unterhalten wir VIELE Drupal-Sites. Unser aktuelles Setup sieht ungefähr so aus:
Das oben Gesagte ist für die meisten Drupal-Sites ziemlich häufig.
Was wir in unserem Unternehmen besonders machen, ist das Debian- Paket der Sites für die Bereitstellung mit einem benutzerdefinierten Drush-Befehl - ' Drush Debian Packaging '.
Drush Debian Packaging bietet einen Drush-Befehl zum Erstellen von Debian-Paketen von Drupal-Sites, um Drupal-Sites auf Debian- oder Ubuntu-Servern bereitzustellen.
Drush Debian Packaging verwendet das Drupal-Hooks-System, um ein Debian-Paket zu erstellen, das den Anforderungen Ihrer Site am besten entspricht. Features sind:
Was bedeutet das?
So erstellen Sie eine Version:
Um eine Version bereitzustellen, senden Sie zunächst die .deb-Datei an alle Webserver im Cluster. Führen Sie dann auf allen Webservern aus (Sie können das Linux-Paket cssh verwenden, um den Befehl gleichzeitig an alle Server in der Farm einzugeben ):
Auf einem Webserver ausführen:
Getan
Natürlich ist das Zurücksetzen aus Sicht der Codebasis jetzt trivial. Installieren Sie einfach die vorherige Version der .deb auf allen Webservern und führen Sie ein Rollback der Datenbank durch.
Gerne beantworten wir Ihre Fragen dazu
quelle
Welcher Teil des Bereitstellungsprozesses ist mühsam / unzuverlässig?
Wenn es sich um das Problem "Server A dann B / Inkonsistenz aktualisieren" handelt, wie wäre es, wenn Sie die Wartungsseite für die Dauer Ihrer Pushs einrichten? Wartungsseite nach oben, Code auf beiden Webköpfen aktualisieren, update.php auf einem von ihnen ausführen , Wartungsseite nach unten. Das ist ziemlich einfach zu schreiben.
Eine weitere Option: Abhängig von der Art der Site, die Sie ausführen, können Sie einen "schreibgeschützten Modus" erstellen, der alle Benutzer offline schaltet und die Anmeldung / Registrierung deaktiviert. Klonen Sie Ihre Datenbank in eine zweite Datenbank in derselben Datenbankbox, klonen Sie Ihr Front-End in eine neue Docroot, führen Sie dort Ihre Aktualisierungen durch und verknüpfen Sie dann Apaches Docroot mit der neuen Front-End-Docroot. Workflow ist so etwas wie:
quelle
Dies hängt von den Änderungen ab, die Sie vornehmen, wie Entendu vorschlägt. Welcher Anteil der Code-Updates kann fehlerfrei ausgeführt werden, wenn die Datenbank noch nicht aktualisiert wurde? Für alles, was nicht von Datenbankaktualisierungen abhängig ist (und vielleicht können Sie den Entwicklungsprozess ein wenig ändern, um dies häufiger zu machen), gibt es eigentlich nichts Besonderes zu tun. Ich gehe davon aus, dass Sie Bereitstellungen mit minimalen Ausfallzeiten durchführen möchten, da dies sonst nur einige grundlegende Synchronisierungsvorgänge erfordern würde. In diesem Fall gibt es immer ein Zeitfenster mit unerwünschten Effekten (auch wenn sich die Site nur im schreibgeschützten Modus befindet), aber ich würde denken, dass sie die meiste Zeit ziemlich klein sein könnte.
Sie können grundlegende Optimierungen vornehmen, z. B. ein "neues" Verzeichnis auf jedem Server im Voraus einrichten und dann alle umschalten, um gleichzeitig auf das neue Verzeichnis zu verweisen (möglicherweise mithilfe von Symlinks wie in Entendus Antwort), damit Sie alle Informationen erhalten Server wechselten innerhalb von 5-10 Sekunden zu den neuen Dateien.
Damit bleibt das Problem der Datenbankaktualisierungen. Wenn sie nur von einem Server aus ausgeführt werden müssen, können Sie die anderen in den Wartungsmodus versetzen oder den Load Balancer so anpassen, dass sie in diesem Fall nicht verwendet werden. Wenn sie nicht ausgeführt werden können, während Benutzer auf der Site aktiv sind, muss sich natürlich nur alles im Wartungsmodus befinden. Für einfache Updates können Sie dies jedoch in maximal 30 Sekunden tun.
Es kann sinnvoll sein, verschiedene Bereitstellungsskripts für verschiedene Arten von Änderungen zu verwenden, damit Sie den minimal erforderlichen Prozess ausführen können, unabhängig davon, ob Sie nur Dateien kopieren, ein kleines Datenbankupdate ausführen oder eine größere Datenbankänderung vornehmen.
Wenn Sie Ihre Datei- und Datenbankaktualisierungen optimieren und prüfen können, ob es einfache Änderungen gibt, die Sie an der Entwicklung der Dinge vornehmen können, könnte dies Sie näher bringen, aber ich weiß nicht, ob dies für Sie neu ist :)
quelle
Aegir ist nützlich, um ein Netzwerk von Websites zu verwalten. Ich habe damit über 2000 Sites für einen einzelnen Client bereitgestellt und verwaltet.
Ihre Frage legt nahe, dass Sie eine einzelne Site mit mehreren Webheads verwalten möchten. In diesem Fall ist Aegir für Sie möglicherweise weniger nützlich. Stattdessen würde ich vorschlagen, dass Sie ein Dateisystem verwenden, das das Netzwerk unterstützt. Dies stellt nicht nur sicher, dass Ihr Code synchron bleibt, sondern bedeutet auch, dass Ihre Uploads auf allen Knoten verfügbar sind.
In der Vergangenheit haben Benutzer NFS verwendet, mit dem das Dateisystem eines Servers für andere Knoten freigegeben werden kann. Leider führt dies zu einem einzelnen Fehlerpunkt, da Ihre Site nicht bedient werden kann, wenn der NFS-Server abstürzt oder ausfällt.
Wenn Sie bereit sind, ein wenig Kompromisse bei der Io-Leistung zugunsten eines zuverlässigeren Servers einzugehen, würde ich GlusterFS empfehlen . Ich habe in einigen Produktionsumgebungen verwendet. Es ist nicht perfekt, aber es ist besser als NFS. Mit Gluster kann der Webhead immer lokal lesen und die Schreibvorgänge werden dann auf die anderen Knoten repliziert.
In Bezug auf Ihre Bereitstellungsstrategie sollten Sie Drush als erstes Tool auf Ihrer Liste haben. Mit drush sollten Sie in der Lage sein, die Schritte Ihrer Bereitstellung zu automatisieren. Sie sollten erwägen, Jenkins zum Mix hinzuzufügen, damit Sie Ihre Bereitstellungsjobs verfolgen und Muster identifizieren können, wenn Probleme auftreten. Capistrano kann hilfreich sein, um die mit der Bereitstellung verbundenen Schritte zu automatisieren. Wenn Sie die Dinge richtig machen, können Sie es so machen, dass Ihre Benutzer nicht einmal wissen, dass Sie eine Bereitstellung durchgeführt haben.
quelle