Eine Einführung in HAProxy und Lastausgleichskonzepte

Einführung

HAProxy, was für High Availability Proxy steht, ist eine beliebte Open-Source-Software für TCP/HTTP-Lastenausgleich und Proxy-Lösung, die auf Linux, macOS und FreeBSD ausgeführt werden kann. Ihre häufigste Verwendung besteht darin, die Leistung und Zuverlässigkeit einer Serverumgebung zu verbessern, indem die Arbeitslast auf mehrere Server verteilt wird (z. B. Web-, Anwendungs- und Datenbankserver). Sie wird in vielen bekannten Umgebungen verwendet, darunter: GitHub, Imgur, Instagram und Twitter.

In diesem Leitfaden erhalten Sie einen allgemeinen Überblick darüber, was HAProxy ist, eine Überprüfung der Lastenausgleichs-Terminologie und Beispiele, wie es verwendet werden kann, um die Leistung und Zuverlässigkeit Ihrer eigenen Serverumgebung zu verbessern.

HAProxy-Terminologie

Es gibt viele Begriffe und Konzepte, die wichtig sind, wenn es um Lastenausgleich und Proxy geht. Sie werden gängige Begriffe in den folgenden Unterabschnitten behandeln.

Bevor Sie sich mit den grundlegenden Arten des Lastenausgleichs befassen, sollten Sie mit einer Überprüfung von ACLs, Backends und Frontends beginnen.

Zugriffskontrollliste (ACL)

Im Zusammenhang mit der Lastverteilung werden ACLs verwendet, um eine Bedingung zu überprüfen und eine Aktion auszuführen (z. B. Auswahl eines Servers oder Blockierung einer Anfrage) basierend auf dem Testergebnis. Die Verwendung von ACLs ermöglicht eine flexible Weiterleitung des Netzwerkverkehrs basierend auf einer Vielzahl von Faktoren wie Musterabgleich und Anzahl der Verbindungen zu einem Backend, zum Beispiel.

Beispiel für eine ACL:

acl url_blog path_beg /blog

Diese ACL wird abgeglichen, wenn der Pfad einer Benutzeranfrage mit /blog beginnt. Dies würde beispielsweise eine Anfrage von http://yourdomain.com/blog/blog-entry-1 abgleichen.

Für eine ausführliche Anleitung zur Verwendung von ACLs, siehe das HAProxy Configuration Manual.

Backend

A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:

  • welcher Lastverteilungsalgorithmus verwendet werden soll
  • a list of servers and ports

A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.

Hier ist ein Beispiel für eine Konfiguration mit zwei Backends, web-backend und blog-backend, mit jeweils zwei Webservern, die auf Port 80 hören:

backend web-backend
   balance roundrobin
   server web1 web1.yourdomain.com:80 check
   server web2 web2.yourdomain.com:80 check
   
backend blog-backend
   balance roundrobin
   mode http
   server blog1 blog1.yourdomain.com:80 check
   server blog1 blog1.yourdomain.com:80 check

Die Zeile balance roundrobin legt den Lastverteilungsalgorithmus fest, der im Abschnitt Lastverteilungsalgorithmen ausführlich beschrieben wird.

mode http legt fest, dass Layer-7-Proxying verwendet wird, was im Abschnitt Arten der Lastverteilung erläutert wird.

Die check-Option am Ende der server-Direktiven legt fest, dass Gesundheitsprüfungen an diesen Backend-Servern durchgeführt werden sollen.

Frontend

A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend section of the HAProxy configuration. Their definitions are composed of the following components:

  • a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
  • ACLs
  • use_backend-Regeln, die festlegen, welche Backends je nach Übereinstimmung mit den ACL-Bedingungen verwendet werden, und/oder eine default_backend-Regel, die alle anderen Fälle behandelt

A frontend can be configured to various types of network traffic, as explained in the next section.

Arten der Lastverteilung

Jetzt, da Sie ein Verständnis für die grundlegenden Komponenten haben, die bei der Lastverteilung verwendet werden, können Sie in die grundlegenden Arten der Lastverteilung übergehen.

Keine Lastverteilung

A simple web application environment with no load balancing might look like the following:

No Load Balancing

In diesem Beispiel verbindet sich der Benutzer direkt mit Ihrem Webserver unter yourdomain.com und es gibt keine Lastenausgleichung. Wenn Ihr einzelner Webserver ausfällt, kann der Benutzer nicht mehr auf Ihren Webserver zugreifen. Darüber hinaus, wenn viele Benutzer gleichzeitig versuchen, auf Ihren Server zuzugreifen und er die Last nicht bewältigen kann, können sie eine langsame Erfahrung haben oder möglicherweise überhaupt keine Verbindung herstellen.

Schicht 4 Lastenausgleich

Der einfachste Weg, den Netzwerkverkehr auf mehrere Server zu verteilen, besteht darin, den Lastenausgleich der Schicht 4 (Transportebene) zu verwenden. Auf diese Weise wird der Lastenausgleich den Benutzerdatenverkehr basierend auf dem IP-Bereich und dem Port weiterleiten (d. h. wenn eine Anfrage für http://yourdomain.com/anything eingeht, wird der Datenverkehr an den Backend weitergeleitet, der alle Anfragen für yourdomain.com auf Port 80 verarbeitet). Weitere Details zur Schicht 4 finden Sie im Abschnitt TCP unseres Einführung in Netzwerke.

Hier ist ein Diagramm eines einfachen Beispiels für Schicht 4 Lastenausgleich:

Layer 4 Load Balancing

Der Benutzer greift auf den Lastenausgleicher zu, der die Anfrage des Benutzers an die Web-Backend-Gruppe von Backend-Servern weiterleitet. Der ausgewählte Backend-Server antwortet direkt auf die Anfrage des Benutzers. Im Allgemeinen sollten alle Server im Web-Backend identische Inhalte bereitstellen, da der Benutzer sonst inkonsistente Inhalte erhalten könnte. Beachten Sie, dass beide Webserver mit demselben Datenbankserver verbunden sind.

Layer 7 Lastenausgleich

Ein weiterer, komplexerer Weg, um den Netzwerkverkehr auszugleichen, besteht darin, den Layer 7 (Anwendungsschicht) Lastenausgleich zu verwenden. Durch die Verwendung von Layer 7 kann der Lastenausgleicher Anfragen an verschiedene Backend-Server basierend auf dem Inhalt der Anfrage des Benutzers weiterleiten. Diese Art des Lastenausgleichs ermöglicht es Ihnen, mehrere Webanwendungsserver unter derselben Domain und Port auszuführen. Für weitere Details zu Layer 7 besuchen Sie den HTTP-Unterabschnitt unserer Einführung in Netzwerke.

Hier ist ein Diagramm eines einfachen Beispiels für den Layer 7 Lastenausgleich:

Layer 7 Load Balancing

In diesem Beispiel wird ein Benutzer, der ihredomain.com/blog anfordert, an das Blog-Backend weitergeleitet, das eine Reihe von Servern ist, die eine Bloganwendung ausführen. Andere Anfragen werden an Web-Backend weitergeleitet, das möglicherweise eine andere Anwendung ausführt. In diesem Beispiel verwenden beide Backends denselben Datenbankserver.

A snippet of the example frontend configuration would look like this:

frontend http
  bind *:80
  mode http

  acl url_blog path_beg /blog
  use_backend blog-backend if url_blog
 
  default_backend web-backend

Dies konfiguriert einen Frontend mit dem Namen http, der den gesamten eingehenden Traffic auf Port 80 verarbeitet.

acl url_blog path_beg /blog passt eine Anfrage an, wenn der Pfad der Anfrage des Benutzers mit /blog beginnt.

use_backend blog-backend if url_blog verwendet die ACL, um den Traffic an blog-backend weiterzuleiten.

default_backend web-backend legt fest, dass alle anderen Anfragen an web-backend weitergeleitet werden.

Load-Balancing-Algorithmen

Der verwendete Load-Balancing-Algorithmus bestimmt, welcher Server in einem Backend ausgewählt wird, wenn die Last verteilt wird. HAProxy bietet mehrere Optionen für Algorithmen. Zusätzlich zum Load-Balancing-Algorithmus können Server einen Weight-Parameter zugewiesen bekommen, um zu beeinflussen, wie häufig der Server im Vergleich zu anderen ausgewählt wird.

A few of the commonly used algorithms are as follows:

roundrobin

Round Robin wählt Server abwechselnd aus. Dies ist der Standardalgorithmus.

leastconn

Wählt den Server mit der geringsten Anzahl von Verbindungen aus. Dies wird für längere Sitzungen empfohlen. Server im selben Backend werden auch im Round-Robin-Verfahren rotiert.

Quelle

Dies wählt aus, welcher Server basierend auf einem Hash der Quell-IP-Adresse ausgewählt wird, von der Benutzer Anfragen stellen. Diese Methode stellt sicher, dass dieselben Benutzer eine Verbindung zu denselben Servern herstellen.

Sticky Sessions

Einige Anwendungen erfordern, dass ein Benutzer weiterhin eine Verbindung zum selben Backend-Server herstellt. Dies kann durch sticky sessions erreicht werden, unter Verwendung des appsession-Parameters im Backend, das dies erfordert.

Gesundheitsprüfung

HAProxy verwendet Gesundheitsprüfungen, um festzustellen, ob ein Backend-Server verfügbar ist, um Anfragen zu verarbeiten. Dies vermeidet, dass ein Server manuell aus dem Backend entfernt werden muss, wenn er nicht verfügbar ist. Die Standard-Gesundheitsprüfung besteht darin, eine TCP-Verbindung zum Server herzustellen.

Wenn ein Server einen Gesundheitscheck nicht besteht und daher nicht in der Lage ist, Anfragen zu bedienen, wird er automatisch im Backend deaktiviert, und der Verkehr wird erst wieder an ihn weitergeleitet, wenn er wieder gesund ist. Wenn alle Server in einem Backend ausfallen, wird der Dienst nicht verfügbar, bis mindestens einer dieser Backend-Server wieder gesund wird.

Für bestimmte Arten von Backends, wie Datenbankservern, ist der Standard-Gesundheitscheck nicht unbedingt dazu da, festzustellen, ob ein Server noch gesund ist.

Der Webserver Nginx kann auch als eigenständiger Proxyserver oder Lastenausgleicher verwendet werden und wird oft in Verbindung mit HAProxy für seine Cache- und Komprimierungsfähigkeiten eingesetzt.

Hohe Verfügbarkeit

Die in diesem Tutorial beschriebenen Layer-4- und Layer-7-Lastenausgleichseinrichtungen verwenden beide einen Lastenausgleicher, um den Verkehr an einen von vielen Backend-Servern zu leiten. Ihr Lastenausgleicher ist jedoch ein Single Point of Failure in diesen Konfigurationen. Wenn er ausfällt oder mit Anfragen überlastet wird, kann dies zu hoher Latenzzeit oder Ausfallzeiten Ihres Dienstes führen.

A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.

Hier ist eine Diagramm einer hochverfügbaren Konfiguration:

In diesem Beispiel haben Sie mehrere Lastenausgleicher (einen aktiven und einen oder mehr passive) hinter einer statischen IP-Adresse, die von einem Server auf einen anderen umgeschaltet werden kann. Wenn ein Benutzer auf Ihre Website zugreift, geht die Anfrage über die externe IP-Adresse zum aktiven Lastenausgleicher. Wenn dieser Lastenausgleicher ausfällt, erkennt Ihr Ausfallsicherungsmechanismus dies und weist automatisch die IP-Adresse einem der passiven Server zu. Es gibt verschiedene Möglichkeiten, ein aktives/passives HA-Setup zu implementieren. Um mehr zu erfahren, lesen Sie Wie man reservierte IPs verwendet.

Fazit

Jetzt, da Sie ein Verständnis für Lastenausgleich haben und wissen, wie Sie HAProxy verwenden können, haben Sie eine solide Grundlage, um mit der Verbesserung der Leistung und Zuverlässigkeit Ihrer eigenen Serverumgebung zu beginnen.

Wenn Sie daran interessiert sind, die Ausgabe von HAProxy für spätere Ansichten zu speichern, werfen Sie einen Blick auf Wie man HAProxy-Protokollierung mit Rsyslog auf CentOS 8 konfiguriert [Schnellstart].

Wenn Sie ein Problem lösen möchten, schauen Sie sich Gängige HAProxy-Fehler an. Wenn eine weitere Fehlerbehebung erforderlich ist, werfen Sie einen Blick auf Wie man gängige HAProxy-Fehler behebt.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts