web-dev-qa-db-de.com

Load Balancing-Websockets

Ich habe eine Frage zum Lastausgleich von Web-Sockets.

Ich habe einen Server, der Web-Sockets unterstützt. Browser stellen eine Verbindung zu meiner Website her und jeder öffnet einen Web-Socket für www.mydomain.com. Auf diese Weise kann meine soziale Netzwerk-App Nachrichten an die Clients senden.

Normalerweise skaliere ich nur mit HTTP-Anforderungen, indem ich einen zweiten Server und einen Lastenausgleich vor den beiden Webservern hinzufüge.

Bei Web-Sockets muss die Verbindung direkt mit dem Webserver hergestellt werden, nicht mit den Lastausgleichsmodulen. Wenn ein Computer beispielsweise über ein physisches Limit von 64.000 offenen Ports verfügt und die Clients eine Verbindung zum Lastausgleichsmodul herstellen, kann ich dies nicht unterstützen Mehr als 64.000 gleichzeitige Benutzer.

Wie mache ich -

  1. veranlassen, dass der Client beim Laden der Seite eine direkte Verbindung zum Webserver herstellt (und nicht zum Lastenausgleich)? Lade ich einfach das JavaScript von einem Knoten und die Load Balancer (oder was auch immer) ändern die URL für das Skript zufällig jedes Mal, wenn die Seite zum ersten Mal angefordert wird?

  2. einen Wellenstart bewältigen? Der Browser stellt fest, dass die Verbindung geschlossen wird, wenn der Webserver heruntergefahren wird. Ich kann JavaScript-Code schreiben, um zu versuchen, die Verbindung erneut zu öffnen, aber der Knoten ist für eine Weile nicht erreichbar. Ich würde also wahrscheinlich zum Load Balancer zurückkehren müssen, um die Adresse des nächsten zu verwendenden Knotens abzufragen.

  3. Ich habe mich gefragt, ob die Load Balancer bei der ersten Anforderung eine Umleitung gesendet haben, sodass der Browser zunächst www.mydomain.com und wird weitergeleitet zu www34.mydomain.com. Das funktioniert ganz gut, bis der Knoten ausfällt - und Websites wie Facebook tun das nicht. Wie machen Sie das?

88
John Smith

Stellen Sie einen L3-Load-Balancer bereit, der IP-Pakete basierend auf dem Quell-IP-Port-Hash auf Ihre WebSocket-Serverfarm verteilt. Da der L3-Balancer keinen Status beibehält (unter Verwendung von gehashtem Quell-IP-Port), wird er auf Kabelgeschwindigkeit auf Low-End-Hardware (z. B. 10 GbE) skaliert. Da die Verteilung deterministisch ist (unter Verwendung von gehashtem Quell-IP-Port), funktioniert sie mit TCP (und damit WebSocket).

Beachten Sie auch, dass ein 64-KB-Festplattenlimit nur für ausgehende TCP/IP-Adressen für eine bestimmte (Quell-) IP-Adresse gilt. Dies gilt nicht für eingehendes TCP/IP. Wir haben Autobahn (einen leistungsstarken WebSocket-Server) mit 200.000 aktiven Verbindungen auf einer 2-Kern-VM mit 4 GB RAM VM) getestet.

Beachten Sie außerdem, dass Sie den L7-Lastenausgleich für den HTTP-Pfad durchführen können, der beim ersten WebSocket-Handshake angegeben wurde. In diesem Fall muss der Load Balancer den Status beibehalten (welches Quell-IP-Port-Paar wird an welchen Backend-Knoten gesendet). Trotzdem wird es wahrscheinlich auf Millionen von Verbindungen skalieren, wenn das Setup in Ordnung ist.

Haftungsausschluss: Ich bin ursprünglicher Autor von Autobahn und arbeite für Tavendo.

75
oberstet

Beachten Sie, dass Sie socket.io anweisen können, einen gemeinsam genutzten Redis-Schlüssel-/Wertespeicher für die Synchronisation zu verwenden, wenn Ihre Websocket-Serverlogik auf nodejs mit socket.io ausgeführt wird. Auf diese Weise müssen Sie sich nicht einmal um den Lastenausgleich kümmern, da Ereignisse zwischen den Serverinstanzen übertragen werden.

var io = require('socket.io')(3000);
var redis = require('socket.io-redis'); 
io.adapter(redis({ Host: 'localhost', port: 6379 }));

Siehe: http://socket.io/docs/using-multiple-nodes/

Aber irgendwann kann Redis zum Flaschenhals werden ...

3
Convolver

Sie können auch einen Lastausgleich für Layer 7 mit Inspektions- und Routing-Funktionen erzielen.

Siehe "Überprüfen und Ausgleichen des WebSockets-Datenverkehrs mit Stingray Traffic Manager und erforderlichenfalls Verwalten des WebSockets- und HTTP-Datenverkehrs, der über dieselbe IP-Adresse und denselben Port empfangen wird". https://splash.riverbed.com/docs/DOC-1451

2
David