Wenn Sie den TCP-Lastenausgleich mit HAProxy verwenden, fließt der gesamte ausgehende Datenverkehr durch den LB?

19

Ich richte eine App ein, die mithilfe von VMs gehostet werden soll (wahrscheinlich amazon, aber das ist nicht in Stein gemeißelt), für die sowohl HTTP-Lastausgleich als auch Lastausgleich einer großen Anzahl (etwa 50.000) von beständigen TCP-Verbindungen erforderlich sind. Die Datenmenge ist nicht allzu hoch, aber Aktualisierungen sind häufig.

Im Moment evaluiere ich Load Balancer und bin etwas verwirrt über die Architektur von HAProxy. Wenn ich HAProxy verwende, um die TCP-Verbindungen auszugleichen, muss der gesamte resultierende Verkehr durch den Load Balancer fließen? Wenn ja, würde eine andere Lösung (wie LVS oder sogar nginx_tcp_proxy_module) besser passen?

user122875
quelle

Antworten:

33

HAProxy unterhält (wie viele Load Balancer) im Allgemeinen zwei Konversationen. Der Proxy hat eine Sitzung (in diesem Fall TCP) mit dem Client und eine weitere Sitzung mit dem Server. Daher sehen Sie bei Proxys am Ende 2x die Verbindungen auf dem Load Balancer. Daher fließt der gesamte Datenverkehr durch den Load Balancer.

Wenn es um die Skalierung über mehrere Load Balancer geht, müssen Sie das meines Erachtens nicht. Ein praktischer und ziemlich einfacher Weg, dies zu tun, ist die Verwendung von Keepalived mit zwei Floating-IPs und Round-Robin-DNS zwischen diesen beiden IPs. Wenn bei keepalived einer der Load Balancer ausfällt, hält der andere beide IPs, sodass Sie auf diese Weise eine hohe Verfügbarkeit erhalten. Abgesehen davon denke ich, dass Sie mit einer aktiven Haproxy-Instanz mit Ihrer Last gut zurechtkommen werden.

HAProxy skaliert sehr gut. In einem Beispiel verwendet das Stack Exchange-Netzwerk Web-Sockets, die offene TCP-Verbindungen aufrechterhalten. Während ich dies poste, haben wir 143.000 eingerichtete TCP-Sockets auf einer virtuellen VMware-Maschine ohne Probleme. Die CPU-Auslastung der VM beträgt ca. 7%.

Stellen Sie bei dieser Art der Einrichtung mit HAProxy sicher, dass Sie maxconnhoch genug eingestellt haben. Hier ist ein Beispiel für eine HAProxy-Konfiguration:

frontend fe_websockets
        bind 123.123.123.123:80
        mode tcp
        log global
        option tcplog
        timeout client 3600s
        backlog 4096
        maxconn 50000
        default_backend be_nywebsockets

backend be_nywebsockets
        mode  tcp
        option log-health-checks
        option redispatch
        option tcplog
        balance roundrobin
        server web1 10.0.0.1:1234
        server web2 10.0.0.2:1234
        timeout connect 1s
        timeout queue 5s
        timeout server 3600s
Kyle Brandt
quelle
das sind 143.000 - spricht das noch von den Web-Sockets? oder sind das auch andere dinge
Marc Gravell
@MarcGravell: Praktisch alle Web-Sockets. Beachten Sie jedoch, dass dies, wie in meiner Einführung bereits erwähnt, 2x ist, sodass auf den Websocket-Servern insgesamt ~ 70.000 angezeigt werden
Kyle Brandt
@Kyle - Gibt es Gründe, warum Sie Web-Sockets und dauerhafte TCP-Verbindungen benötigen? Diese Website scheint keine Echtzeitfunktionen zu haben, die dies erfordern würden.
Fortsetzung
@Continuation: Es gibt eine ganze Reihe von Echtzeitfunktionen, einschließlich Posteingangsbenachrichtigungen, Abstimmungen, Änderungen, neuen Kommentaren / Antworten / Fragen. Nicht sicher, ob sie nur für Benutzer mit einem bestimmten Wiederholungslimit aktiviert sind. Wenn Sie sie nicht sehen, können Sie sich bei meta.stackoverflow.com
Kyle Brandt,
1
@KyleBrandt funktioniert das auch im TCP-Modus?
Elslooo
2

Ja, der gesamte Datenverkehr sollte normalerweise über den Load Balancer geleitet werden. Die Anforderungen werden vom Load Balancer empfangen und die Antworten an den Load Balancer zurückgesendet, der sie an die Clients zurücksendet.

Für die Auswahl des richtigen Werkzeugs habe ich nicht viel Erfahrung mit den anderen Optionen. Ich verwende Haproxy und es ist wirklich gut und stabil und kann eine große Menge an Verkehr verarbeiten. Auch die ACL-Funktionen sind hervorragend.

Khaled
quelle
2

Es besteht die Möglichkeit, DSR (Direct Server Return) zu verwenden und zu konfigurieren. Dies hat jedoch nichts mit dem Loadbalancer zu tun, sondern wird im TCP-Stack (Routing-Tabellen) konfiguriert. Wir haben dies für ein großes Video-Streaming-Portal verwendet. Obwohl es funktioniert, bereitet es Ihnen erhebliche Kopfschmerzen in Bezug auf die Komplexität des notwendigen Routings.

Daher würde ich nicht empfehlen, diese Technik zu verwenden, ohne die Verwendung und die Nachteile sehr gründlich in Betracht zu ziehen.

Vielleicht gibt es einige Hinweise, um dort anzufangen:

Habe Spaß!

Andreas Balg
quelle