Veröffentlichung des HTTP/TCP-Lastenausgleichs HAProxy 2.0

Veröffentlicht Release des Lastenausgleichs HAProxy 2.0, das die Verteilung von HTTP-Traffic und beliebigen TCP-Anfragen auf eine Gruppe von Servern ermöglicht, unter Berücksichtigung einer Vielzahl von Faktoren (zum Beispiel überprüft es die Verfügbarkeit von Servern, bewertet die Last, verfügt über Mittel zur Abwehr von DDoS-Angriffen) und führt eine первичную фильтрацию данных durch (zum Beispiel kann man HTTP-Header analysieren, ungültige Anfrageparameter herausfiltern, SQL-Injektionen und XSS blockieren, Content-Processing-Agenten anschließen). HAProxy kann auch eingeführt zur Koordinierung der Interaktion von Komponenten in Systemen auf Basis der Mikrodienste-Architektur. Der Code des Projekts ist in C geschrieben und wird geliefert unter der GPLv2-Lizenz. Das Projekt wird auf vielen großen Websites verwendet, darunter Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter und Vimeo.

Wichtige Funktionen der Ausgabe:

  • Ein neuer API wurde eingeführt Datenplan, der es ermöglicht, die Einstellungen von HAProxy über eine REST Web API in Echtzeit zu verwalten. Dazu gehören das dynamische Hinzufügen und Entfernen von Backends und Servern, das Erstellen von ACL, das Ändern von Anfragenrouten und das Anpassen von Handlerbindungen an IP;
  • Die Direktive nbthread wurde hinzugefügt, die es ermöglicht, die Anzahl der Threads zu konfigurieren, die in HAProxy zur Optimierung der Nutzung von Mehrkern-CPUs verwendet werden. Standardmäßig wird die Anzahl der Arbeits-Threads basierend auf den verfügbaren CPU-Kernen in der aktuellen Umgebung festgelegt, während in Cloud-Umgebungen standardmäßig ein Thread eingestellt wird. Für die Festlegung strenger Limits wurden die Kompilierungsoptionen MAX_THREADS und MAX_PROCS hinzugefügt, die die Obergrenze für die Anzahl von Threads und Prozessen begrenzen;
  • Die Verwendung der Direktive bind zur Bindung von Handlers an Netzwerkadressen wurde vereinfacht. Bei der Konfiguration ist es jetzt nicht mehr erforderlich, die Prozessparameter zu definieren — standardmäßig werden die Verbindungen je nach Anzahl der aktiven Verbindungen auf die Threads verteilt.
  • Die Konfiguration von Logs beim Start in isolierten Containern wurde vereinfacht — das Log kann jetzt in stdout und stderr sowie in jeden bestehenden Dateideskriptor (zum Beispiel 'log fd@1 local0') geleitet werden;
  • Standardmäßig ist die Unterstützung von HTX (Native HTTP Representation) aktiviert, die eine Lastenverteilung bei der Nutzung erweiteter Funktionen wie End-to-End HTTP/2, Layer 7 Retries und gRPC ermöglicht. HTX ersetzt die Header nicht direkt, sondern reduziert die Änderungsoperation auf das Entfernen und Hinzufügen eines neuen Headers am Ende der Liste, was eine Manipulation aller erweiterten HTTP-Protokollvarianten ermöglicht, während die ursprüngliche Semantik der Header beibehalten wird und eine höhere Leistung beim Übergang von HTTP/2 zu HTTP/1.1 und umgekehrt erzielt wird.
  • Offizielle Unterstützung für den End-to-End HTTP/2 Modus hinzugefügt (Verarbeitung aller Phasen in HTTP/2, einschließlich Backend-Anfragen, nicht nur der Interaktion zwischen Proxy und Client);
  • Vollständige Unterstützung für bidirektionales Proxying des gRPC-Protokolls implementiert mit der Möglichkeit, gRPC-Streams zu analysieren, einzelne Nachrichten herauszustellen, den gRPC-Verkehr im Log aufzuzeichnen und Nachrichten mithilfe von ACL zu filtern. gRPC ermöglicht die Zusammenarbeit von Mikrodiensten in verschiedenen Programmiersprachen, die über eine universelle API miteinander kommunizieren. Die Netzwerkkommunikation in gRPC erfolgt über das HTTP/2-Protokoll und basiert auf der Verwendung von Protocol Buffers zur Serialisierung von Daten.
  • Unterstützung für den „Layer 7 Retries“ Modus hinzugefügt, der es ermöglicht, HTTP-Anfragen im Fall von Softwarefehlern, die nicht mit Problemen beim Aufbau der Netzwerkverbindung zusammenhängen (z. B. bei fehlenden oder leeren Antworten auf POST-Anfragen), erneut zu senden. Um diesen Modus zu deaktivieren, wurde das Flag „disable-l7-retry“ zur Option „http-request“ hinzugefügt, und für eine Feinabstimmung gibt es in den Abschnitten defaults, listen und backend die Option „retry-on“. Folgende Hinweise sind für die erneute Übermittlung verfügbar: all-retryable-errors, none, conn-failure, empty-response, junk-response, response-timeout, 0rtt-rejected sowie eine Bindung an die zurückgegebenen Statuscodes (404 usw.);
  • Ein neuer Prozessmanager (Process Manager) implementiert, der die Ausführung externer ausführbarer Dateien mit Handlern für HAProxy konfiguriert.
    Zum Beispiel wird ein externes Handler-API-Datenplan ( /usr/sbin/dataplaneapi) sowie verschiedene Engines zur Offload-Verarbeitung von Streams realisiert;
  • Für .NET Core, Go, Lua und Python wurden Bindings für die Entwicklung von SPOE (Stream Processing Offload Engine) und SPOP (Stream Processing Offload Protocol) hinzugefügt. Zuvor wurde die Entwicklung von Erweiterungen nur in C unterstützt;
  • Ein externer Handler spoa-mirror (\/usr\/sbin\/spoa-mirror) wurde hinzugefügt, um Anfragen an einen separaten Server zu spiegeln (z. B. um Teile des Arbeitsverkehrs für Tests in einer experimentellen Umgebung unter realer Last zu kopieren);
  • Vorstellung HAProxy Kubernetes Ingress Controller zur Gewährleistung der Integration mit der Kubernetes-Plattform;
  • Integrierte Unterstützung für den Export von Statistiken in das Überwachungssystem hinzugefügt Prometheus;
  • Das Peers-Protokoll, das für den Austausch von Informationen mit anderen Knoten von HAProxy verwendet wird, wurde erweitert. Dazu gehört die Unterstützung von Heartbeat und verschlüsselter Datenübertragung;
  • Der Direktive „log“ wurde der Parameter „sample“ hinzugefügt, der es erlaubt, nur einen Teil der Anfragen ins Log zu schreiben, z. B. 1 von 10, um eine analytische Stichprobe zu erstellen;
  • Ein automatisches Profilerungsmodus wurde hinzugefügt (Direktive profiling.tasks, die Werte wie auto, on und off annehmen kann). Die automatische Profilerung wird aktiviert, wenn der durchschnittliche Verzögerungswert 1000 ms übersteigt. Um die Profildaten zu sehen, wurde der Befehl „show profiling“ zur Runtime API hinzugefügt oder es ist eine Möglichkeit vorhanden, Statistiken ins Log zurückzusetzen;
  • Unterstützung für die Ansprache von Backend-Servern unter Verwendung des SOCKS4-Protokolls hinzugefügt;
  • End-to-End-Unterstützung für den Mechanismus des schnellen Öffnens von TCP-Verbindungen (TFO — TCP Fast Open, RFC 7413) hinzugefügt, der die Anzahl der Schritte zum Herstellen einer Verbindung durch die Kombination des ersten und zweiten Schritts des klassischen 3-Schritte-Handshake-Prozesses verringert und das Senden von Daten zu Beginn des Verbindungsaufbaus ermöglicht;
  • Neue Aktionen hinzugefügt:
    • „http-request replace-uri“ zum Ersetzen von URLs mit regulären Ausdrücken;
    • „tcp-request content do-resolve“ und „http-request do-resolve“ zum Auflösen von Hostnamen;
    • „tcp-request content set-dst“ und „tcp-request content set-dst-port“ zum Setzen der Ziel-IP-Adresse und des Ports.
  • Neue Konvertierungs-Module hinzugefügt:
    • aes_gcm_dev zur Entschlüsselung von Streams unter Verwendung der Algorithmen AES128-GCM, AES192-GCM und AES256-GCM;
    • protobuf zur Extraktion von Feldern aus Protocol Buffers-Nachrichten;
    • ungrpc zur Extraktion von Feldern aus gRPC-Nachrichten.

    Quelle: opennet.ru

60GB SSD 8Gb DDR4