Der Lastenausgleich zwischen mehreren Anwendungen, Backends und Servern ist Teil des Prozesses zur Optimierung von Ressourcen, Verbesserung der Leistung und Fehlertoleranz des Dienstes.
Nginx als Load Balancer
Dieser Webserver gilt als eine der beliebtesten und produktivsten Lösungen, da er die breiteste Funktionalität und Flexibilität bei der Konfiguration bietet. Daher wird Nginx häufig zum Lastenausgleich verwendet.
Es gibt mehrere Ansätze und Implementierungen, aber überprüfen Sie zuerst die Verfügbarkeit des Moduls ngx_http_upstream_module:
# nginx -v
Wenn es fehlt, müssen Sie Nginx neu erstellen, indem Sie dieses Modul hinzufügen. Danach können Sie mit der Konfiguration des Webservers beginnen. Um den Ausgleich zu aktivieren, fügen Sie die Upstream-Direktive (http-Abschnitt) zur Nginx-Konfigurationsdatei hinzu:
upstream backend { server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
Jetzt müssen Sie die Umleitung der erforderlichen Gruppe angeben:
server { location / { proxy_pass http://backend; } }
Darüber hinaus unterstützt Nginx zusätzliche Parameter und Load-Balancing-Methoden.
Wahl einer Ausgleichsmethode
Nginx bietet mehrere Load-Balancing-Methoden.
Round-Robin
Standardmäßig verteilt der Webserver Anfragen gleichmäßig auf die Backends (aber unter Berücksichtigung der Gewichtung). Dies ist eine Standardmethode in Nginx, daher gibt es keine Einschlussdirektive.
least_conn
Anfragen werden zuerst an das Backend mit der geringsten Anzahl aktiver Verbindungen gesendet (aber unter Berücksichtigung von Gewichtungen):
upstream backend { least_conn; server backend1.somesite.com; server backend2.somesite.com; }
Hash und IP-Hash
Mit dieser Methode können Sie eine Art dauerhafte Verbindung zwischen Clients und Backends herstellen. Für jede Anfrage berechnet Nginx einen Hash, der aus Text, Webserver-Variablen oder einer Kombination davon besteht, und ordnet ihn dann den Backends zu:
upstream backend { hash $scheme$request_uri; server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
IP-Hash funktioniert nur mit HTTP, dies ist eine vordefinierte Option, bei der der Hash anhand der IP-Adresse des Clients berechnet wird:
upstream backend { ip_hash; server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
Backend-Gewicht
Wenn bestimmte Backends auf dem Stack leistungsfähiger sind als andere, sind Gewichtungen praktisch:
upstream backend { server backend1.somesite.com weight=10; server backend2.somesite.com weight=5; server backend3.somesite.com; server 192.0.0.1 backup; }
In diesem Beispiel verarbeitet das erste Back-End von 16 Anfragen 10, das zweite 5 und das dritte 1. In diesem Fall erhält der Backup-Server Anfragen nur, wenn die drei Haupt-Back-Ends nicht verfügbar sind.
Überwachung
Wenn Nginx glaubt, dass der Backend-Server nicht verfügbar ist, sendet es vorübergehend keine Anfragen mehr an ihn. Dafür sind zwei Direktiven zuständig:
- max_fails — legt die Anzahl der fehlgeschlagenen Verbindungsversuche fest, nach denen das Backend für eine bestimmte Zeit als nicht verfügbar gilt;
- fail_timeout — Zeit, während der der Server als nicht verfügbar gilt.
Die Parameter sehen so aus:
upstream backend { server backend1.somesite.com; server backend2.somesite.com max_fails=3 fail_timeout=30s; server backend3.somesite.com max_fails=2; }
Schlussfolgerung
Die Wahl der geeigneten Auswuchtmethode ermöglicht eine gleichmäßigere Lastverteilung. Vergessen Sie nicht Backend-Gewichte, Überwachung und Serverfehlertoleranz.