Haproxy-Lastausgleich mit HTTP-Headern

7

Wir verwenden HAProxy, um den Lastenausgleich für unsere Websocket- und Kometenanwendung durchzuführen. Im Hintergrund laufen ein HAProxy und drei Anwendungen. Wir verwenden HTTP Basic Auth (und wir werden in Zukunft andere Arten von Auth verwenden, wie z. B. OAuth), um den verbundenen Benutzer zu identifizieren.

Wir können kein reguläres Round-Robin verwenden, da es wichtig ist, dass Verbindungen für einen bestimmten Benutzer auf demselben Server enden. Es spielt keine Rolle, wo, aber es ist wichtig, dass sie denselben Server verwenden.

Ich kenne HAProxy als einen intelligenten Cookie-basierten Ansatz, aber leider wird in unserem Fall manchmal derselbe Benutzer von verschiedenen Computern aus verbunden, sodass der Cookie nicht funktioniert.

Ist es möglich, einen Hash des HTTP-Autorisierungsheaders für den Lastausgleich zu verwenden? Ist es auch möglich, und dies ist komplexer, unsere eigene Hashing-Methode zu definieren?

Folgefrage [nach Willys Antwort]:

Wäre es möglich, dies nur im Anmeldefeld (nach dem Parsen) zu tun balance hdr(Authorization), da dies möglich ist ?

Was ist der genaue Algorithmus? Ich glaube, es liegt in der Form vor hash(Authorization) % number_of_backend_server, aber was ist dann die Hash-Funktion, und was noch wichtiger ist, ist sie optimierbar? (oder kann ich einen Offset hinzufügen).

Ich frage, weil diese App tatsächlich eine XMPP-Komponentenverbindung offen hält und ich die XMPP-Komponenten mit demselben Algorithmus ausgleichen muss . Die toJID in den XMPP-Zeilengruppen wird durch die HTTP-Header-Autorisierung bestimmt.

Julien Genestoux
quelle

Antworten:

9

Ja, Sie können sehr gut jeden Header Ihrer Wahl hashen. Verwenden Sie einfach "balance hdr (header_name)". Ich muss sagen, ich hätte nie darüber nachgedacht, es so zu machen. In einigen Umgebungen kann es tatsächlich sehr nützlich sein. Sie können auch einen URL-Parameter oder einen POST-Parameter hashen, wenn dies hilfreich sein kann.

Sie können Ihre Hashing-Methode jedoch nicht definieren. Sie können auswählen, ob der Hash kartenbasiert oder konsistent ist, aber das ist alles.

Willy Tarreau
quelle
+1 ... aber wie bist du zu so vielen verschiedenen Konten gekommen, Willy? :)
danlefree
1
Erstaunt, dass du derjenige bist, der Willy antwortet! Folgefrage: Muss ich den vollständigen 'Authorization'-Header verwenden? Es wäre großartig, wenn HAProxy die [Login, Passwort] -Auflösung durchführen würde. Was ist der genaue Algorithmus? Ich glaube, es ist in Form von Hash (Authorization)% number_of_backend_server, aber was ist dann die Hash-Funktion und was noch wichtiger ist, ist sie optimierbar? (oder kann ich einen Offset hinzufügen). Ich frage, weil diese App tatsächlich eine XMPP-Komponentenverbindung offen hält und ich die XMPP-Komponenten mit demselben Algorithmus ausgleichen muss.
Julien Genestoux
@WillyTarreau Kann Haproxy bestimmte Verbindungen zu einer Reihe von Maschinen und die anderen zu einer anderen senden? Wenn eine Anforderung beispielsweise einen Header enthält, senden Sie die Anforderung an einen langsamen Computer und die verbleibenden Anforderungen an den schnellen Computer.
Wiliam
Ich glaube, ich habe die Lösung für meine vorherige Frage hier gefunden: serverfault.com/questions/307647/…
Wiliam