Frage Wenn der TCP-Lastenausgleich mit HAProxy verwendet wird, fließt der gesamte ausgehende Datenverkehr durch die LB?


Ich richte eine App ein, die mit VMs gehostet wird (wahrscheinlich amazon, aber das ist nicht in Stein gemeißelt), die sowohl HTTP Load Balancing als auch Load Balancing einer großen Anzahl persistenter TCP-Verbindungen (möglichst 50k) erfordert. Die Menge an Daten ist nicht so hoch, aber Updates sind häufig.

Momentan evaluiere ich Load Balancer und bin ein wenig verwirrt über die Architektur von HAProxy. Wenn ich HAProxy zum Ausgleichen der TCP-Verbindungen verwende, muss der gesamte resultierende Verkehr durch den Lastenausgleich fließen? Wenn ja, wäre eine andere Lösung (wie LVS oder sogar nginx_tcp_proxy_module) besser geeignet?


18
2018-05-30 13:08


Ursprung




Antworten:


HAProxy führt (wie viele Load Balancer) im Allgemeinen zwei Konversationen. Der Proxy hat eine Sitzung (tcp in diesem Fall) mit dem Client und eine weitere Sitzung mit dem Server. Bei Proxies sehen Sie also 2x die Verbindungen auf dem Load Balancer. Daher fließt der gesamte Datenverkehr durch den Load Balancer.

Wenn es darum geht, mehrere Load-Balancer zu skalieren, müssen Sie das nicht tun. Aber ein praktischer und ziemlich einfacher Weg, dies zu tun, ist etwas zu verwenden, mit dem man sich fortbewegt zwei Floating IPs und Round-Robin-DNS zwischen diesen beiden IPs. Wenn einer der Load Balancer bei Keepalived ausfällt, würde der andere beide IPs enthalten, so dass Sie auf diese Weise hohe Verfügbarkeit erhalten. Davon abgesehen denke ich, dass es dir mit einer aktiven haproxy-Instanz mit deiner Ladung gut gehen wird.

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

Mit dieser Art von Setup mit HAProxy stellen Sie sicher, dass Sie einstellen maxconn hoch genug. Hier ist ein Beispiel für eine HAProxy-Konfiguration, die Ihnen den Einstieg erleichtert:

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

32
2018-05-30 13:20



das 143.000 - redet das noch über die Web-Sockets? oder sind das auch andere Dinge? - Marc Gravell♦
@MarcGravell: Praktisch alle Web-Sockets. Beachten Sie, dass dies 2x ist, wie ich in meiner Einführung sagte, so dass die Web-Sockets-Server insgesamt ~ 70k sehen würden - Kyle Brandt♦
@Kyle - Gründe, warum Sie Web-Sockets und persistente TCP-Verbindungen benötigen? Diese Website scheint keine Echtzeitfunktionen zu haben, die dies erfordern würden. - Continuation
@Continuation: Es gibt eine gute Menge an Echtzeit-Funktionen einschließlich Posteingang Benachrichtigungen, Abstimmungen, Änderungen, neue Kommentare / Antworten / Fragen. Nicht sicher, ob sie nur für Benutzer mit einem bestimmten Ruflimit aktiviert sind. Wenn Sie sie nicht sehen, können Sie sich auf meta.stackoverflow.com erkundigen - Kyle Brandt♦
@KyleBrandt funktioniert das auch im TCP-Modus? - elslooo


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

Für die Auswahl des richtigen Tools habe ich nicht viel Erfahrung mit den anderen Optionen. Ich benutze Haproxy und es ist wirklich gut und stabil und kann eine große Menge an Verkehr bewältigen. Auch seine ACL-Fähigkeiten sind großartig.


2
2018-05-30 13:18





Es besteht die Möglichkeit, DSR (Direct Server Return) zu verwenden und zu konfigurieren, dies hat jedoch nichts mit dem Loadbalancer zu tun, sondern ist im tcp-stack (Routing-Tabellen) konfiguriert. Wir haben dies für ein großes Video-Streaming-Portal verwendet. Obwohl es funktioniert, wird es Ihnen erhebliche Kopfschmerzen angesichts der Komplexität des Routing geben.

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

Vielleicht gibt es ein paar Tipps, um dort anzufangen:

Habe Spaß!


2
2018-06-25 15:54