Zurück zum Blog

HAProxy und Load-Balancing-Konzepte: die Grundlagen

HAProxy und Load-Balancing-Konzepte: die Grundlagen

Einführung

High Availability Proxy (HAProxy), ist eine beliebte Open-Source-Proxy- und TCP/HTTP-Load-Balancer-Lösung, die auf Solaris, FreeBSD, und Linux ausgeführt werden kann. Sie wird am häufigsten verwendet, um die Zuverlässigkeit und Leistung einer Serverumgebung zu verbessern, indem sie eine ausgewogene Verteilung der Arbeitslast auf mehrere Server ermöglicht. Diese Art von Tool wird in vielen bekannten Umgebungen wie Instagram, GitHub, Twitter und Imgur eingesetzt.

Diese Anleitung führt Sie in HAProxy ein, macht Sie mit der Load-Balancing-Terminologie vertraut und liefert Beispiele dafür, wie es zur Steigerung der Leistung und Zuverlässigkeit von Serverumgebungen eingesetzt werden kann.

Wichtige HAProxy-Begriffe

Bevor wir uns mit den Details von Load Balancing und Proxying befassen, gibt es einige wichtige Begriffe und Konzepte, mit denen Sie sich vertraut machen sollten. Wir werden diese Konzepte in den folgenden Abschnitten zunächst durchgehen.

ACL (Access Control List)

Beim Load Balancing werden ACLs verwendet, um eine bestimmte Bedingung zu prüfen und basierend auf dem Ergebnis eine Aktion auszuführen. Dies ermöglicht es, den Datenverkehr optimal weiterzuleiten, basierend auf Faktoren wie Backend-Verbindungen, Musterabgleichen und vielen anderen. Hier ist ein Beispiel für die Verwendung einer ACL:

In diesem Fall trifft die ACL zu, wenn der vom Benutzer angeforderte Pfad mit /blog beginnt. Diese Übereinstimmungsanfrage würde beispielsweise auf http://yourdomain.com/blog/blog-entry-1 verweisen. Das HAProxy-Konfigurationshandbuch enthält eine detaillierte Anleitung zur Verwendung von ACLs.

Das Backend

Weitergeleitete Anfragen werden von einer Gruppe von Servern empfangen, die als Backend bezeichnet wird. Die Anfragen werden im Backend-Bereich der HAProxy-Konfiguration definiert. Vereinfacht ausgedrückt kann ein Backend durch die zu verwendenden Load-Balancing-Algorithmen und eine Liste von Ports und Servern definiert werden. Ein Backend kann aus einem einzelnen Server oder mehreren Servern bestehen. Je mehr Server dem Backend hinzugefügt werden, desto höher ist die potenzielle Lastkapazität, da die Verarbeitung auf mehrere Server verteilt wird. Wenn einige der Backend-Server offline gehen, dienen die anderen als Backup für die Bearbeitung der Anfragen.

Sehen wir uns ein Beispiel für die Konfiguration von zwei Backends an. In diesem Fall handelt es sich um ein Blog-Backend und ein Web-Backend. Jedes verfügt über zwei Webserver, die auf Port 80 lauschen:

Die Zeile balance roundrobin dient zur Angabe des Load-Balancing-Algorithmus. Einzelheiten dazu finden Sie im folgenden Abschnitt Algorithmen für Load Balancing, während mode http die Verwendung von Layer-7-Proxying einrichtet. Wir werden dies im Abschnitt Load-Balancing-Typen erklären. Außerdem zeigt die Option check nach den Server-Direktiven an, dass auf diesen speziellen Backend-Servern Health-Checks durchgeführt werden.

Das Frontend

Die Definition, wie Anfragen an das Backend weitergeleitet werden, wird als Frontend bezeichnet. Die Anfragen werden im Frontend-Bereich der HAProxy-Konfiguration definiert. Sie bestehen aus ACLs, einem Port, einer Reihe von IP-Adressen und einer Regel namens use_backend, die definiert, welche Backends in Abhängigkeit von den erfüllten ACL-Bedingungen verwendet werden sollen. Darüber hinaus gibt es eine default_backend-Regel für alle anderen Fälle. Im nächsten Abschnitt wird erklärt, wie ein Frontend für verschiedene Arten von Netzwerkverkehr konfiguriert werden kann.

Load-Balancing-Typen

Nachdem die grundlegenden Komponenten für das Load Balancing etabliert sind, können wir nun zu den grundlegenden Arten des Load Balancing übergehen.

Kein Load Balancing

In seiner rudimentärsten Form lässt sich das Fehlen von Load Balancing wie folgt darstellen:

HAProxy 1

In diesem Szenario verbindet sich ein Benutzer direkt mit dem Webserver unter yourdomain.com. Es ist kein Load Balancing vorhanden. Da es nur einen Datenbankserver gibt, ist der Zugriff auf die darauf befindlichen Informationen vollständig unterbrochen, wenn dieser offline geht. Wenn viele Benutzer gleichzeitig versuchen, sich mit einem einzelnen Webserver zu verbinden, und dieser die dadurch entstehende Last nicht bewältigen kann, verlangsamen sich alle Verbindungen oder schlagen ganz fehl.

Load Balancing (Layer 4)

Eine der einfachsten und pragmatischsten Methoden zur Verteilung des Netzwerkverkehrs auf mehrere Server ist die Verwendung von Balancing-Methoden auf der Transportschicht oder Layer 4. Diese Art des Load Balancing leitet jeden sich verbindenden Benutzer basierend auf dem IP-Bereich, in den seine IP-Adresse fällt, und dem Port weiter. Mit anderen Worten, wenn http://yourdomain.com/anything der Ursprung der Anfrage ist, wird das Backend, das für die Bearbeitung dieser Anfragen definiert ist, diese letztendlich verarbeiten. Es leitet diese Anfragen für yourdomain.com auf Port 80 weiter.

Der grundlegende Aufbau von Layer-4-Load-Balancing sieht wie folgt aus:

HAProxy 2

Sobald der Benutzer Zugriff auf den Load Balancer erhält, werden seine Anfragen an die Web-Backend-Servergruppe weitergeleitet. Der konfigurierte Backend-Server antwortet direkt auf die Anfrage des Benutzers. Um zu verhindern, dass der Benutzer auf inkonsistente Daten stößt, sollten alle Web-Backend-Server identische Inhalte bereitstellen. Gemäß dem obigen Diagramm verweisen beide Webserver letztendlich auf denselben Datenbankserver.

Load Balancing (Layer 7)

Es gibt eine weitere, komplexere Methode zur Lastverteilung des Netzwerkverkehrs. Dies geschieht durch den Einsatz von Load Balancing auf Layer 7 oder der Anwendungsschicht. Dieser Ansatz ermöglicht es, Benutzeranfragen je nach Inhalt der Anfrage an verschiedene Backend-Server weiterzuleiten. Diese Methode erlaubt es, das Load Balancing über mehrere Webanwendungsserver hinweg über denselben Port und dieselbe Domain durchzuführen. Weitere Details zu dieser Schicht finden Sie im HTTP-Unterabschnitt unseres The Nitty Gritty of Networking: Learn about Terminology, Interfaces, and Protocols-Tutorials.

Das folgende Diagramm veranschaulicht das Layer-7-Load-Balancing:

layer 7

In diesem Fall fordert ein Benutzer yourdomain.com/blog an, und seine Anfrage wird an das Blog-Backend weitergeleitet. Dies ist eine Backend-Servergruppe, die speziell für die Ausführung der Blog-Anwendung zugewiesen ist. In der Zwischenzeit werden andere Anfragen an das Web-Backend weitergeleitet. Beide Backends greifen jedoch letztendlich auf denselben Datenbankserver zu.

Ein Beispiel für einen kleinen Teil einer Frontend-Konfiguration für Layer-7-Load-Balancing würde etwa wie die folgenden Befehle aussehen. Sie konfigurieren das HTTP-Frontend so, dass es eingehenden Datenverkehr über Port 80 verarbeitet:

Wenn der Pfad der Benutzeranfrage mit /blog beginnt, stimmt die acl url_blog path_beg /blog mit der Anfrage überein.

use_backend blog backend if url_blog leitet den Datenverkehr unter Verwendung von ACL an das Blog-Backend weiter.

defaut_backen web_backend leitet alle anderen Weiterleitungen des Datenverkehrs an das Web-Backend weiter.

Algorithmen für Load Balancing

Wenn ein Lastausgleich durchgeführt wird, bestimmt der Lastausgleichsalgorithmus, welcher Backend-Server für diesen Zweck ausgewählt wird. Es gibt mehrere Algorithmus-Optionen, die von HAProxy angeboten werden. Es ist zusätzlich möglich, den Servern einen Gewichtungsparameter zuzuweisen, um zu beeinflussen, wie oft ein Server im Vergleich zu anderen ausgewählt wird. Es gibt einfach zu viele verfügbare Algorithmen, um sie alle zu beschreiben. Daher konzentriert sich dieser Leitfaden nur auf die gängigsten. Sie können sich auf den HAProxy Documentation Converter beziehen, um die vollständige Liste zu sehen. Zu den am häufigsten verwendeten gehören:

  • roundrobin: Der Standardalgorithmus, der die Server nacheinander auswählt.
  • leastconn: Der Server mit den wenigsten Verbindungen wird automatisch ausgewählt. Die Server innerhalb desselben Backends sollten jedoch im Round-Robin-Verfahren abgewechselt werden.
  • source: Der Algorithmus wählt den Server basierend auf der IP-Adresse aus, von der die Benutzeranfrage stammt. Dies ist eine Methode, um sicherzustellen, dass sich der Benutzer immer mit demselben Server verbindet.

Sticky Sessions

Für einige Anwendungen ist es erforderlich, dass sich verbindende Benutzer immer mit demselben Server verbinden. Durch „Sticky Sessions“ und die Verwendung des appsession-Parameters im Backend, das dies erfordert, kann eine solche Persistenz erreicht werden.

Verarbeitung von Health-Checks

HAProxy benötigt eine Methode, mit der es die Fähigkeit eines Backend-Servers zur Verarbeitung von Anfragen bestimmen kann. Dies dient dazu, einen Server aus dem Backend zu entfernen, wenn er offline geht. Standardmäßig wird ein „Health-Check“ ausgeführt, der versucht, eine TCP-Verbindung herzustellen. Dies geschieht durch Abhören der konfigurierten IP-Adresse und des Ports.

Wenn der Health-Check für den Server fehlschlägt, kann der Server die gesendeten Anfragen nicht verarbeiten. Zu diesem Zeitpunkt wird der Server im Backend automatisch deaktiviert, und es wird kein Datenverkehr mehr an ihn weitergeleitet, bis er wieder betriebsbereit (fehlerfrei) ist. In bestimmten Fällen erweist sich die Bestimmung des Serverzustands über den Standard-Health-Check jedoch als unzureichend.

Alternative Lösungen

HAProxy könnte sich als zu anspruchsvoll für Ihre speziellen Anforderungen erweisen. In diesem Fall gibt es einige gute Alternativen, die sich als effizienter erweisen könnten:

  • Nginx: Dies ist ein zuverlässiger und schneller Webserver, der für Lastausgleichs- und Proxy-Zwecke genutzt werden kann. Tatsächlich wird Nginx häufig in Kombination mit HAProxy eingesetzt, das seine Komprimierungs- und Caching-Funktionen nutzt.
  • Linux Virtual Servers (LVS): Dies ist ein einfacher Layer-4-Lastverteiler, der auf vielen Linux-Systemen enthalten ist.

High Availability

Bisher haben wir über Layer-4- und Layer-7-Lastausgleich gesprochen. Beide nutzen einen Load Balancer, um zu bestimmen, welcher der vielen Backend-Server mit der Beantwortung der Benutzeranfrage beauftragt wird. Es ist jedoch wichtig, die Einschränkungen eines Load Balancers im Auge zu behalten. Nämlich, dass er ein Single Point of Failure ist. Das bedeutet, dass ein Ausfall oder eine Überlastung durch Benutzeranfragen zu Ausfallzeiten bzw. Verzögerungen bei der Anfrageverarbeitung führt. Ein HA-Setup (High Availability / Hochverfügbarkeit) bietet jedoch eine Infrastruktur, die keinen einzigen Ausfallpunkt aufweist. Dies verhindert Ausfallzeiten aufgrund von Serverausfällen, indem Redundanz auf jeder Ebene der Systemarchitektur eingeführt wird. Während der Load Balancer dazu beiträgt, die Redundanz des Backends zu ermöglichen, müssen die Load Balancer selbst ebenfalls redundant ausgelegt sein.

Das folgende Diagramm zeigt eine Grundform eines Hochverfügbarkeits-Setups:

basic form of a high availability setup

 

Diese Infrastruktur verfügt über mehrere Load Balancer (einer aktiv, die restlichen passiv), die an eine statische IP-Adresse gebunden sind. Diese IP-Adresse kann bei Bedarf einem anderen Server zugewiesen werden. Die Benutzeranfrage gelangt über die externe IP-Adresse zum derzeit aktiven Load Balancer. Wenn der Load Balancer zu diesem Zeitpunkt offline ist, erkennt der Ausfallsicherungsmechanismus diesen Zustand und weist die IP-Adresse dem oder den passiven Servern neu zu.

Fazit

Das grundlegende Verständnis von Lastverteilung und das Wissen über einige der Möglichkeiten, wie HAProxy die Anforderungen an die Lastverteilung für Ihr System erfüllen kann, sollten Ihnen eine solide Grundlage bieten, um mit der Optimierung der Zuverlässigkeit und Leistung Ihrer aktuellen Serverumgebungen zu beginnen. Sie können sich auch unser Tutorial Nginx HTTP-Proxying, Lastverteilung, Pufferung und Caching: Ein Überblick ansehen, um mehr über die Lastverteilungseigenschaften von Nginx zu erfahren.

Fröhliches Computing!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev ist ein kreativer Designer bei CloudSigma und konzentriert sich auf eine konsistente Unternehmensidentität durch traditionelle und innovative Marketingkanäle. Er versteht es meisterhaft, künstlerische Vision mit strategischem Marketing zu verbinden, um wirkungsvolle Markengeschichten zu schaffen.

Kommentare

Noch keine Kommentare. Schreiben Sie den ersten.