Ursprünglicher Autor: Adam Charnock
Ursprünglicher Link: The Hitchhikers Guide to PHP Load Balancing
Übersetzung: Koda
bedeutete früher das Ausführen eines großen Webservers beim Ausführen einer großen Webanwendung. Da Ihre Anwendung eine große Anzahl von Benutzern anzieht, müssen Sie Ihrem Server mehr Speicher und Prozessoren hinzufügen.
Heutzutage ist das „Großserver“-Modell verschwunden und wird durch eine große Anzahl kleiner Server ersetzt, die verschiedene Lastausgleichstechniken nutzen. Dies ist ein praktikablerer Ansatz, der die Hardwarekosten auf ein Minimum beschränkt.
Der Vorteil von „mehr kleinen Servern“ gegenüber dem früheren „Großserver“-Modell spiegelt sich in zwei Aspekten wider:
Wenn der Server ausfällt, stellt das Lastausgleichssystem keine Anfragen mehr an den ausgefallenen Server und verteilt die Last stattdessen auf andere normal laufende Server . Vorgesetzter.
Die Skalierung Ihres Servers ist einfacher. Sie müssen lediglich neue Server zum Lastausgleichssystem hinzufügen. Sie müssen Ihre Bewerbung nicht unterbrechen.
Nutzen Sie diese Gelegenheit also :) Der Nachteil besteht natürlich darin, dass Ihre Anwendungsentwicklung etwas komplexer sein muss. Darum geht es in diesem Artikel.
An diesem Punkt fragen Sie sich vielleicht: „Aber woher weiß ich, dass ich Lastausgleich verwende?“ '. Die ehrlichste Antwort, wenn Sie diese Frage stellen, ist, dass Sie wahrscheinlich kein Lastausgleichssystem verwenden und Ihr System dies nicht berücksichtigen muss. Wenn die Anwendung groß genug wird, muss in den meisten Fällen der Lastausgleich explizit vorgeschlagen und eingerichtet werden. Gelegentlich sehe ich jedoch, dass Webhosting-Unternehmen diesen Lastausgleich für Kundenanwendungen durchführen oder ihn wie unten beschrieben selbst durchführen.
Bevor ich weiter unten fortfahre, möchte ich darauf hinweisen, dass dieser Artikel hauptsächlich den Lastausgleich in PHP beschreibt. Ich werde vielleicht in Zukunft über den Datenlastausgleich schreiben, aber jetzt müssen Sie warten.
Beachten Sie, dass ich immer wieder von „Webanwendungen“ und nicht von Websites spreche. Dies soll darauf hinweisen, dass es sich bei „Webanwendungen“ um komplexe Websites handelt, die häufig serverseitige Programmierung und Datenbanken beinhalten, und nicht um Websites, die nur einfache statische Inhalte anzeigen.
1. PHP-Dateien Die erste Frage ist: Wie laden Sie Ihre PHP-Dateien auf alle Server hoch, wenn Sie eine große Anzahl kleiner Server haben? Als Referenz gibt es die folgende Methode:
Laden Sie alle Dateien einzeln auf jeden Server hoch. Das Problem bei dieser Methode ist: Stellen Sie sich vor, Sie haben 20 Server, dann führt dies leicht zu Fehlern während des Upload-Vorgangs und die Aktualisierungszeit wird sehr lang sein schnell Es ist möglich, unterschiedliche Versionen von Dateien auf verschiedenen Servern zu haben.
Verwenden Sie „rsync“ (oder eine ähnliche Software). Ein solches Tool kann Dateien in einem lokalen Verzeichnis und Verzeichnissen auf mehreren Remote-Hosts synchronisieren.
Verwenden Sie Versionskontrollsoftware (z. B. Subversion). Dies ist meine Lieblingsmethode. Dadurch kann ich meinen Code sehr gut pflegen, und wenn ich meine Anwendung veröffentliche, kann ich den Befehl svn update auf jedem Server ausführen, um ihn zu synchronisieren. Dieser Ansatz erleichtert auch den Serverwechsel auf eine frühere Version des Codes.
Verwenden Sie einen Dateiserver (möglicherweise eignet sich NFS dafür hervorragend). Wenn Ihr Dateiserver ausfällt, sind natürlich alle Ihre Websites nicht verfügbar. Zu diesem Zeitpunkt müssen Sie mehr Geld für die Wiederherstellung ausgeben.
Für welche Methode Sie sich entscheiden, hängt von Ihren Bedürfnissen und Ihren Fähigkeiten ab. Wenn Sie ein Versionskontrollsystem verwenden, möchten Sie möglicherweise eine Möglichkeit planen, den Code auf allen Servern zu aktualisieren, indem Sie gleichzeitig einen Aktualisierungsbefehl ausführen. Wenn Sie jedoch einen Dateiserver verwenden, müssen Sie einen Mechanismus zur Wiederherstellung nach Fehlern implementieren, um Anforderungsfehler zu verhindern, falls der Server ausfällt.
2. Datei-Upload Wenn nur ein Server vorhanden ist, ist das Hochladen von Dateien kein Problem. Aber wie sollen die hochgeladenen Dateien gespeichert werden, wenn wir mehrere Server haben? Das Problem beim Hochladen von Dateien ähnelt der serverübergreifenden PHP-Dateispeicherung. Hier sind mehrere mögliche Lösungen:
Speichern Sie die Datei in einer Datenbank. Die meisten Daten ermöglichen die Speicherung binärer Daten. Wenn Sie einen Dateidownload anfordern, gibt access data die Binärdaten sowie den entsprechenden Dateinamen und -typ an den Benutzer aus. Bevor Sie diese Lösung verwenden, sollten Sie überlegen, wie die Datenbank Ihre Dateien speichert. Das Problem bei diesem Ansatz besteht darin, dass die Dateien nicht mehr verfügbar sind, wenn der Datenbankserver ausfällt.
Speichern Sie hochgeladene Dateien auf einem Dateiserver. Wie in der vorherigen Einführung müssen Sie einen Dateiserver installieren, der von allen Webservern gemeinsam genutzt werden kann. Nach dem Hochladen können ihn alle Webserver verwenden. Wenn der Dateiserver jedoch ausfällt, kann es zu Unterbrechungen beim Herunterladen der Bilddateien kommen.
Entwerfen Sie Ihren eigenen Upload-Mechanismus zum Übertragen von Dateien auf jeden Server. Dieser Ansatz weist nicht die Nachteile einer einzelnen Dateiserver- oder Datenbanklösung auf, erhöht jedoch die Komplexität Ihres Codes. Was können Sie beispielsweise tun, wenn der Server während des Hochladens auf mehrere Server ausfällt?
Eine gute Lösung ist die Verwendung einer Datenbank zum Speichern hochgeladener Dateien und das Entwerfen eines Datei-Caching-Mechanismus. Wenn der Server eine Datei-Download-Anfrage erhält, prüft er zunächst, ob die Datei im Cache-System vorhanden ist. Wenn sie gefunden wird, lädt er sie aus der Datenbank herunter und speichert sie im Dateisystem.
3. Sitzungen
Wenn Sie mit der Sitzungsverwaltung von PHP vertraut sind, wissen Sie wahrscheinlich, dass es Sitzungsdaten standardmäßig in temporären Dateien auf dem Server speichert. Darüber hinaus befindet sich diese Datei nur auf dem Server, auf dem Sie sie angefordert haben. Nachfolgende Anforderungen können jedoch von einem anderen Server verarbeitet werden, wodurch eine neue Sitzung auf dem anderen Server generiert wird. Dies führt dazu, dass Sitzungen häufig nicht erkannt werden, z. B. dass angemeldete Benutzer immer wieder aufgefordert werden, sich erneut anzumelden.
Meine empfohlene Lösung besteht darin, entweder den in PHP integrierten Sitzungsverarbeitungsmechanismus wiederherzustellen, um Sitzungsdaten in der Datenbank zu speichern, oder einen eigenen Mechanismus zu implementieren, um sicherzustellen, dass die Anfrage eines Benutzers an denselben Server gesendet wird.
4. Konfiguration
Obwohl dieses Thema nicht speziell mit PHP zu tun hat, halte ich es für notwendig, es zu erwähnen. Beim Betrieb geclusterter Server empfiehlt es sich, die Konfigurationsdateien zwischen den Servern auf irgendeine Weise synchron zu halten. Wenn die Konfigurationsdateien inkonsistent sind, kann dies zu einem sehr seltsamen, zeitweise auftretenden Verhalten führen, das schwierig zu beheben sein kann.
Ich empfehle, sie einzeln mit einem Versionskontrollsystem zu verwalten. Auf diese Weise können Sie verschiedene PHP-Konfigurationsdateien für verschiedene Projektinstallationen speichern und außerdem alle Serverkonfigurationsdateien synchron halten.
5. Protokollierung
Wie Konfigurationsprobleme hängt auch die Protokollierung nicht nur mit PHP zusammen. Dennoch ist es sehr wichtig, dass Ihr Server fehlerfrei läuft. Wie würden Sie ohne ein ordnungsgemäßes Protokollierungssystem feststellen, ob Ihr PHP-Code Fehler generiert (Sie schalten die Einstellung „display_errors“ immer aus, wenn das System aktiv ist, nicht wahr?).
Es gibt mehrere Möglichkeiten, die Protokollierung zu implementieren:
Melden Sie sich alle an Server. Dies ist der einfachste Weg. Jede Maschine zeichnet nur eine Datei auf. Der Vorteil besteht darin, dass es einfach ist und möglicherweise nur sehr wenig Konfiguration erfordert. Mit zunehmender Serveranzahl wird die Überwachung der Protokolldateien auf jedem Server jedoch sehr schwierig.
Protokollierung auf einer Freigabe Bei diesem Ansatz liegen die Protokolldateien immer noch auf jedem Server, sie werden jedoch über den Freigabemechanismus auf einem zentralen Dateiserver gespeichert, was die Überwachung der Protokolle erleichtert. Das Problem bei dieser Lösung besteht darin, dass bei Nichtverfügbarkeit des Dateiservers ein einfaches Protokollschreibproblem schließlich zum Absturz der gesamten Anwendung führt.
Protokollierung auf einem Protokollierungsserver Sie können eine Protokollierungssoftware wie Syslog verwenden, um alle Protokolle auf einen zentralen Server zu schreiben. Obwohl diese Methode mehr Konfiguration erfordert, bietet sie auch die robusteste Lösung.
phpv fügte hinzu: Ein weiterer wichtiger Punkt ist die Datenbankverwaltung, die möglicherweise viel Inhalt beinhaltet. Daher hat der Autor ihn nicht ausgeschrieben.