Wie tausende Backends in haproxy verwenden? Ist die neue Kartenfunktion dafür nützlich?

8

Ich möchte haproxy als Proxy und Load Balancer für Tausende von Backends verwenden. Daher muss eine Anfrage abhängig vom Hostnamen an das korrekte Backend weitergeleitet werden und dann im Backend ausgeglichen werden. Ich benutze haproxy-1.5dev21.

Die Konfigurationsdatei sieht folgendermaßen aus:

%Vor%

Problem ist, dass ich eine zusätzliche Latenz von 30 ms pro Anfrage bekomme, wenn 5000 Hosts sind. Und für 20k-Backends benötigt haproxy viel Zeit zum Laden, ganz zu schweigen von der Katastrophe bei der Latenz pro Anfrage.

Kann ich etwas besseres tun als sequenzielle acl-Regeln? Ich habe kein Beispiel für die neue Kartenfunktion gefunden - die Versionshinweise sagen, dass sie für massive Umleitungsregeln verwendet werden können. Ich habe es versucht:

%Vor%

Etwas offensichtlich Dummes oben bei der Verwendung von Karten, aber jede Anleitung wäre hilfreich. Danke!

    
rcrc 25.02.2014, 20:26
quelle

2 Antworten

12

Einige Unzulänglichkeiten wurden nach der Experteneingabe aus der Konfigurationsdatei entfernt. Ich listet sie hier auf, für den Fall, dass sie für andere nützlich sein könnten.

  1. Verwenden Sie hdr (Host) anstelle von hdr_reg () . Dies verbessert die Zeit erheblich, die für die Auswertung der ACLs benötigt wird. Noch besser, acl vermeiden und die Inline-Auswertung z.

    use_backend host1 if { req.fhdr(host,1) -m str host1.domain.com }

  2. Verwenden Sie nbproc & gt; 1 . Bei gleichzeitigen Verbindungen hilft dies. Obwohl es das Debuggen erschwert.

  3. Verwenden Sie für die Back-Ends die IP-Adresse direkt anstelle von 'server hostn_1 dns_of_server: port_number'

  4. Setzen Sie fullconn 1000 in den Standardbereich. Dies verbessert die Ladezeit immens.

Verwenden Sie abschließend den neuesten Haproxy-Git-Checkout und beobachten Sie die Verlängerung der Ladezeit. Es ist beträchtlich gesunken. Die Reihenfolge der Sekunden im Vergleich zu Minuten zuvor.

Außerdem ist in Bezug auf die Funktion "Karte" ein neues dynamisches Schema "use_backend" in Arbeit, das die Notwendigkeit beseitigen sollte, so viele ACLs zu schreiben.

    
rcrc 28.03.2014, 01:13
quelle
1

Ich hatte das gleiche Problem. Ich experimentiere gerade mit Nginx + Lua mit allen auf Redis gespeicherten Backends.

Der Anforderungsfluss sieht wie folgt aus.

  1. Die Anfrage wird bei Nginx empfangen.
  2. Basierend auf dem Anfrage-Host wird Redis abgefragt. Ein Lua-Modul ist für Redis verfügbar.
  3. Backend-Informationen werden von Redis abgerufen und Nginx leitet die Anforderung an das entsprechende Back-End weiter.
  4. Backend (HAProxy), lädt dann die Anfrage.

Motivation dafür ist von Ссылка

Hoffe, das hilft.

    
sudhir 19.11.2014 06:58
quelle