Skalieren Sie HAProxy für mehr als 64.000 Websockets

8

Wir versuchen, eine Architektur zu entwerfen, die mehr als 64.000 Websockets verarbeiten kann.

Wir haben es zuerst mit Amazon ELB versucht, aber sein Design erlaubt keinen unerwarteten Anstieg des Datenverkehrs oder des Websockets. (Zeitüberschreitung im TCP-Modus der Websockets unerwartet)

Mit HAProxy gelten diese Grenzwerte nicht, wir sind jedoch auf ~ 64.000 Websockets beschränkt, die zwischen HA und den Back-End-Servern verwaltet werden.

Mehrere Lösungen, die mir in den Sinn kamen:

  • Mehrere HAProxy-Instanzen, Lastausgleich mit DNS (Route53 hat eine gewichtete Option)
  • Zwei HAProxy-Instanzen mit Keepalived und mehreren internen IP-Adressen (nicht sicher, ob dies möglich ist)

Gibt es einen besseren Weg, dies zu tun?

Bastien974
quelle
1
Warum 64k Limit? Ist es eine Sache mit dem Quellport? Wenn dies der Fall ist, können Sie dem Backend einfach weitere "Server" hinzufügen, die an verschiedene Ports gebunden sind ...
Kyle Brandt
@ Bastien974, der einfachste Weg, ist die Verwendung einer anderen Quell-IP für Backends, um auf 130K-Verbindungen zu skalieren. Ich habe zwei ips und die Option tw_reuse sysctl verwendet
c4f4t0r

Antworten:

7

Wenn Ihr 64k-Limit auf Quellports zurückzuführen ist, können Sie Folgendes tun (ein wenig hacky, aber es war derzeit bei SE für Websockets (wir haben ungefähr 0,5 Millionen gleichzeitig mit HAProxy):

server ny-web01-1 10.0.0.1:8081 check
server ny-web01-2 10.0.0.1:8082 check
server ny-web01-3 10.0.0.1:8083 check

Auch mehrere Instanzen sind mit keepalived möglich. Machen Sie einfach so etwas wie Round-Robin-DNS über mehrere IPs. Stellen Sie einfach sicher, dass die IPs immer von aktiven Load Balancern erfasst werden, da DNS selbst Ihnen keinen Load Balancing bietet (es gibt auch hier mehr Optionen, diese ist einfach).

Kyle Brandt
quelle
1
Wenn ich das richtig verstehe, da eine TCP-Verbindung durch srcIP: srcPORT / destIP: destPORT definiert ist, würde dies bedeuten, dass ich zwischen HAProxy- und Back-End-Servern zwischen den Back-End-Servern an mehreren Ports lauschen kann mehrere Verbindungen von derselben 127.0.0.1:12345 -> 10.0.0.1:8081, 127.0.0.1:12345 -> 10.0.0.1:8082 usw. haben? Funktioniert das wirklich?
Bastien974
@ Bastien974: Du verstehst richtig - es funktioniert.
Kyle Brandt
@ Bastien974: Sie können source 0.0.0.0 usesrc clientin der Backend-Konfiguration von haproxy die Transparenz der Proxy-Quelle verwenden. Auf diese Weise werden srcIP: srcPORT die tatsächlichen Client-IPs / Ports sein (nicht die internen IPs der Haproxy-Maschine) - auch für die Protokollierung geeignet.
wqw
0

Sie können mehrere HAproxy-Systeme einrichten, die dieselben IPs mit Anycast und BGP oder einem anderen Border-Routing-Protokoll verwenden. Auf diese Weise sind alle HAproxy-Systeme aktiv. Wenn einer dieser Fehler auftritt, beenden Sie die Werbung für die BGP-Route auf diesem System und der Empfang von Datenverkehr wird in ca. 30 Sekunden eingestellt. Diese werden an andere verfügbare Systeme weitergegeben, die dieselbe Reichweite bewerben.

Überprüfen Sie beispielsweise diese URL, um ein solches Layout einzurichten

Hrvoje Špoljar
quelle
Ich bin mir nicht ganz sicher, ob dies in einer AWS VPC-Infrastruktur funktionieren würde, da ich die jeder Instanz zugeordnete elastische IP-Adresse verwenden muss. Ihre Lösung kommt der DNS-Lösung sehr nahe, da Amazon Route53 die Option bietet, eine Integritätsprüfung hinzuzufügen. Ich mache mir Sorgen, dass wir es uns selbst bei einer niedrigen TTL nicht leisten können, die Weitergabe an andere Länder (wir haben Kunden weltweit) abzuwarten, um den Datenverkehr nicht mehr an eine "tote" HA-Instanz zu senden.
Bastien974