Bereitstellen von Code auf mehreren Front-End-Servern

8

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

  1. Dateien aktualisieren

  2. 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.

Jeremy French
quelle

Antworten:

6

Sie sollten sich wahrscheinlich mit Aegir befassen , dem mit Abstand flexibelsten und leistungsstärksten Drupal-Site-Management- / Bereitstellungssystem. Es ist in der Lage, "Plattformen" zu verwalten, die sich über mehrere Webköpfe oder "Cluster" erstrecken, sowie eine Vielzahl anderer Konfigurationen.

Ich würde vorschlagen, die Community-Dokumentation durchzulesen, die im Allgemeinen ziemlich gut ist, sowie den hervorragenden Überblick und den Einführungsartikel von mig5 und einige seiner anderen Artikel wie diesen durchzulesen .

Sie können auch im # aegir IRC-Kanal gute Unterstützung erhalten.

Es wird eine Art Workflow-Änderung sein, die definitiv einige Zeit in Anspruch nehmen kann, um sich zurechtzufinden, aber wenn Sie dort sind, werden Sie nicht mehr zurückblicken.

Tom Kirkpatrick
quelle
Danke, das ist interessant, aber es könnte eine größere Veränderung sein, die wir erwartet hatten. Wir haben nur eine Site, daher scheint Aegir ein Overkill und eine andere Komplexität zu sein.
Jeremy French
Danke, ich weiß nicht, ob wir das am Ende tun werden, aber es scheint eine sehr gute Option zu sein.
Jeremy French
Ich kann es nur empfehlen. Zu denken, dass Ihr Job zu klein ist, um so etwas wie Aegir zu erfordern, ist die falsche Sichtweise. Aegir eignet sich für kleine und große Projekte. Wenn Sie Drupal-Sites bereitstellen müssen, ist Aegir der richtige Weg. Zeitraum. (IMO)
Tom Kirkpatrick
4

In unserem Unternehmen unterhalten wir VIELE Drupal-Sites. Unser aktuelles Setup sieht ungefähr so ​​aus:

  • Die Codebasis jeder Site hat ein eigenes Git-Repo
  • Neue Features, die für die nächste Version wahrscheinlich nicht stabil genug sind, erhalten einen eigenen Feature-Zweig in Git

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:

  • Automatische Konfiguration des virtuellen Hosts für Apache2- und Nginx-Webserver
  • Cron-Setup in /etc/cron.d
  • Automatisierte Codebereitstellung mit Partitionsteilung für Sites / Standard / Dateien
  • Automatisierte Konfiguration über das dpkg debconf settings tool
  • Automatisierter Bereitstellungsprozess
  • Benutzerdefinierter Git VCS-Handler zum Erstellen von Paketen aus Git

Was bedeutet das?

So erstellen Sie eine Version:

cd /path/to/drupal-root
drush dh-make

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 ):

sudo dpkg -i drupal-site-yoursitehere.2011.05.25-1.all.deb

Auf einem Webserver ausführen:

cd /path/to/drupal-root
sudo -u drupal-site-yoursitehere drush updb && drush fra -y && drush cron

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

wiifm
quelle
Das ist ein großartiger Weg! Haben Sie sich vor dem Einrichten dieses Workflows überhaupt mit Aegir befasst?
Andy
Aegir ist großartig, wenn Sie alle Ihre Websites in demselben Cluster hosten. Es hilft nicht, wenn Sie Ihre Websites auf separaten physischen Hosts bereitstellen. Ich sehe aegir nicht als Konkurrent dieses Setups. Tatsächlich werden wir in Kürze die Hostmaster-Installation und die Plattformen für aegir mit drush debain-Verpackung
bereitstellen
3

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:

  1. Schreibgeschützter Modus ein
  2. SELECT current_db INTO new_db
  3. cp -R current_docroot new_docroot
  4. new.yourdomain.com ==> / new_docroot
  5. Code in new_docroot aktualisieren
  6. update.php
  7. symlink / new_docroot ==> current_docroot
  8. Schreibgeschützter Modus aus.
Entendu
quelle
Interessante Idee, +1 für die Offline-Idee. Wir wollten jederzeit einfache Bereitstellungen durchführen. Wenn Sie offline schalten, müssen Sie über Release-Fenster nachdenken, dies ist jedoch möglicherweise eine sehr zuverlässige Methode.
Jeremy French
Es hängt alles davon ab, was Sie bereitstellen. CSS-Änderungen können beispielsweise mit minimalen Auswirkungen live bereitgestellt werden (mit Ausnahme der Cache-Updates, die durchgeführt werden müssen).
Entendu
Hoppla, wollte einen Zeilenumbruch machen. Option 2 oben kann mit Hudson / Jenkins geschrieben und viertelt werden. Inwieweit hängt davon ab, um welche Art von Website es sich handelt (100% angemeldete Benutzer? Meistens anon?) Und welche Auswirkungen dies auf Ihre Besucher haben wird.
Entendu
2

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 :)

richardg
quelle
0

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.

skwashd
quelle