Lastausgleich mehrerer horizontaler Drupal-Instanzen

8

Ich habe eine REST-WebAPI mit dem Services-Modul entwickelt. Es funktioniert gut. Ich habe einen Client dieser API mit projizierter Nutzung, für den ich meine Drupal-Instanz horizontal skalieren muss. Beachten Sie, dass ich aufgrund der Art meiner API, die erhebliche CPU- und GPU-Ressourcen erfordert, keine Cloud-Server verwenden kann. Aufgrund der Art meiner API müssen die Drupal-Instanzen auch unter Windows ausgeführt werden. (Für meine Anwendung ist Software erforderlich, die nur unter Win64 verfügbar ist.) Ich habe jetzt einen ziemlich leistungsfähigen Server an einem gemeinsamen Standort, und für diesen ehrgeizigen Client plane ich, meine Hardware auf folgende Weise horizontal zu skalieren:

  • Ein CentOS-Server, auf dem HaProxy als Front-End-Load-Balancer ausgeführt wird.
  • Zwei zu Beginn, weitere werden nach Bedarf hinzugefügt: Windows Server 2008 R2-Server, auf denen Drupal gehostet wird.
  • Ein CentOS-Datenbankserver, der eine einzelne Datenbank für mehrere Drupal-Instanzen bereitstellt.
  • Ein CentOS-Datenbankserver, der im Replikationsmodus ausgeführt wird, falls DB-Server 1 ausfällt.

Meine Fragen haben damit zu tun, wie der HaProxy Load Balancer funktioniert. Ich gehe davon aus, dass die von den Drupal-Instanzen erstellten Sitzungs-IDs voneinander eindeutig sind. Überprüft der Load Balancer die Sitzungs-ID und leitet alle Anforderungen an denselben Server weiter, der diese Sitzungs-ID erstellt hat? Wie würde eine REST-WebAPI-Kommunikation funktionieren, wenn der Lastenausgleich dazu führen würde, dass jede API-Anforderung an einen anderen Server gesendet wird? Müssen alle Daten, auf die von der WebAPI verwiesen wird, in der Datenbank gespeichert werden, da ich nicht sicherstellen kann, dass mehrere API-Anforderungen für dieselbe Ressource an dieselbe Drupal-Instanz weitergeleitet werden?

Blake Senftner
quelle
Sehr interessante Frage. Ich kann nicht anders, als das Gefühl zu haben, dass es sich eher um eine allgemeine als um eine reine Frage zu Drupal handelt (sie könnte für jede PHP-basierte REST-API gelten, die die Sitzungsauthentifizierung verwendet, wenn ich sie richtig lese). In diesem Fall können Sie vom Markieren profitieren, damit es auf die Haupt-SO-Site migriert wird. Nur ein Gedanke :)
Clive
+1 für weitere Informationen an anderer Stelle. Sie können die meisten Ratschläge zum Skalieren jeder PHP-Anwendung mit Drupal verwenden. Da mein Kommentar etwas zu lang war, habe ich eine Antwort gepostet, die Ihnen helfen kann, das zu finden, was Sie brauchen.
Rocketeerbkw
Vielen Dank an rocketeerbkw und Berdir für Ihre Erkenntnisse. Bei meinen laufenden Untersuchungen habe ich festgestellt, dass HaProxy SSL nicht mit Sticky-Sitzungen verarbeitet, und ich muss so etwas wie Stunnel für SSL verwenden, da meine gesamte API-Kommunikation über SSL erfolgt. Es sieht so aus, als wären weitere Untersuchungen erforderlich, um meinen nächsten Schritt hier vollständig zu verstehen.
Blake Senftner
Weitere Untersuchungen scheinen darauf hinzudeuten, dass meine Konfiguration wie Tier1 aussehen muss: Firewall-Server und Stunnel, Tier2: Load Balancer, Tier3: Mehrere Drupal-Webserver, Tier4: Shared Database Server, Tier5: Replizieren des Datenbankservers. Und möglicherweise zusammen mit Tier4 ein SAN für die gemeinsame Dateispeicherung für mehrere Drupal-Instanzen. Einblicke, Brotkrumen oder Webartikel, in denen Personen beschrieben werden, die so etwas einrichten, sind willkommen.
Blake Senftner

Antworten:

12

Das Vorhandensein mehrerer Webserver hinter einem Load Balancer / Reverse Proxy ist für Drupal weit verbreitet und wird gut unterstützt. Lack wird normalerweise in der Linux-Welt verwendet, weil das Ding einfach wahnsinnig schnell ist, wenn man es tatsächlich verwenden kann, was anonyme Besucher bedeutet. Was bei Ihrer Site offensichtlich nicht der Fall ist.

Sitzungen werden standardmäßig in der Datenbank gespeichert, sodass dies kein Problem darstellt. Das einzige andere, was auf allen Servern gemeinsam genutzt werden muss, ist das Verzeichnis der öffentlichen Dateien und alle anderen wie die privaten Dateien, wenn Sie so etwas verwenden. In den meisten Fällen wird hierfür ein gemeinsam genutztes / verteiltes Dateisystem wie NFS verwendet, obwohl es einige fortgeschrittenere Ansätze gibt. An einer Site, an der ich beteiligt bin, befindet sich das Dateisystem, das von einem weiteren Server bereitgestellt wird, der ein NFS-Mount auf den Drupal-Servern ist (der Zugriff dort ist also langsam) und von Lighthttpd unter einer anderen Domäne verteilt wird. Aber auch das ist wahrscheinlich nicht so relevant für Sie, da Sie nicht viele Bilder und CSS-Dateien bedienen werden, denke ich.

Wie von rocketeerbkw erwähnt, gibt es Cache-Backends für Memcache, Redis und andere. Bisher habe ich nur Memcache verwendet, aber ich habe kürzlich angefangen, mich mit Redis zu befassen, und es sieht sehr vielversprechend aus, aber ich bin nicht sicher, ob es für Windows verfügbar ist. Es wäre jedoch möglich, einen separaten Linux-Server für den Cache einzurichten. Drupal 7 ist stark auf Caches angewiesen. Die Möglichkeit, sie aus der Datenbank zu entfernen, ist aus zwei Gründen sehr wichtig:

  1. Tools wie Redis und Memcache sind für schnelle schlüsselbasierte Suchvorgänge konzipiert und speichern ihre Daten immer im Speicher, um die Suche so schnell wie möglich zu gestalten. Sie haben auch Unterstützung für die automatische Bereinigung alter Cache-Daten eingebaut, wenn das konfigurierte Limit näher rückt.

  2. Vielleicht noch wichtiger ist, dass es hilft, die Datenbank herunterzuladen. Sobald Sie die Grundeinstellung eingerichtet haben, ist das Hinzufügen zusätzlicher Webserver einfach. Sobald Sie die Grenzen eines einzelnen Datenbankservers erreicht haben, werden die Dinge viel komplizierter und Sie müssen sich mit Dingen wie der Master / Master-Replikation befassen (Drupal 7 profitiert nicht wirklich von Master / Slave-Umgebungen).

Es ist also im Grunde nur Ihre eigene API, um die Sie sich kümmern müssen. Wenn möglich, müssen Sie sicherstellen, dass immer alles von allen Servern verfügbar ist. Sie können entweder die Datenbank, das Dateisystem oder etwas anderes verwenden (Drupal kann MongoDB auch zum Speichern bestimmter Daten verwenden, z. B. Felder). Wenn dies keine Option ist, müssen Sie Sticky-Sitzungen verwenden, damit Benutzer immer auf derselben Instanz landen. Sie sollten jedoch wirklich versuchen, dies zu vermeiden, da bei einem Ausfall eines Servers alle Benutzer, die sich auf diesem Server befanden, erneut eine Verbindung zu einem anderen Server herstellen müssen, wodurch möglicherweise Daten verloren gehen.

Berdir
quelle
0

Standardmäßig speichert PHP Sitzungen auf der Festplatte. Wenn sich ein Benutzer bei Server 1 anmeldet und dann auf Server 2 trifft, wird er abgemeldet. Es gibt einige Möglichkeiten, dies zu beheben:

  1. Speichern Sie keine Sitzungen auf der Festplatte
  2. Stellen Sie sicher, dass Benutzer immer denselben Server verwenden
  3. Mounten Sie ein freigegebenes Dateisystem auf allen Servern

Um # 2 zu implementieren und Ihre Fragen zu HAProxy zu beantworten; Im einfachsten Setup können Sie es im TCP-Modus ausführen und den "Quell" -Ausgleichsalgorithmus ( http://cbonte.github.com/haproxy-dconv/configuration-1.4.html#4-balance ) verwenden, um sicherzustellen, dass Benutzer treffen der gleiche Server. Sie sollten die Dokumente lesen, um festzustellen, ob Sie mit diesem Ansatz Nachteile haben.

Für Nummer 1 können Sie einen Schlüssel- / Wertspeicher wie Redis oder Memecached verwenden, mit dem alle Ihre Server eine Verbindung herstellen und Sitzungen abrufen würden. Dadurch werden Sitzungen sehr schnell geladen / gespeichert, und Sie können sie auch als gemeinsam genutzten Drupal-Cache verwenden.

rocketeerbkw
quelle
6
Standardmäßig speichert Drupal die Sitzungen in der Datenbank und nicht im Dateisystem.
Berdir