Lastausgleich eines UDP-Servers

10

Ich habe einen udp-Server, der ein zentraler Bestandteil meines Geschäftsprozesses ist. Um die Lasten zu bewältigen, die ich in der Produktionsumgebung erwarte, benötige ich wahrscheinlich 2 oder 3 Instanzen des Servers. Der Server ist fast vollständig zustandslos, er sammelt meistens Daten und die darüber liegende Schicht weiß, wie mit der minimalen Menge veralteter Daten umzugehen ist, die aus den mehreren Serverinstanzen entstehen können.

Meine Frage ist, wie kann ich den Lastenausgleich zwischen den Servern implementieren? Ich würde es vorziehen, die Anfragen so gleichmäßig wie möglich auf die Server zu verteilen. Ich hätte auch gerne eine gewisse Wiedergabetreue. Ich meine, wenn Client X an Server y weitergeleitet wurde, möchte ich, dass alle nachfolgenden Anforderungen von X an Server Y gesendet werden, solange dies sinnvoll ist und Y nicht überlastet.

Übrigens ist es ein .NET-System ... was würden Sie empfehlen?


Der Status ist intern auf den Servern und keine Transaktion. Der Status besteht aus einigen Daten, die die Server aus den empfangenen Daten aggregieren, und kann mit einem einfachen WCF-WebService analysiert werden. Die Anwendung basiert auf UDP, und obwohl ich der Entscheidung nicht zustimme, ist sie "Über meiner Gehaltsstufe".

Ich probiere gerade die NLB von MS aus, sie funktioniert einwandfrei, sie macht die Wiedergabetreue sofort, aber sie erzeugt Rauschen im gesamten Netzwerk ...

Auch kein DNS ... Oh und es ist ein komplett Kostümprotokoll.

Höllenfrost
quelle
Nur ein Hinweis zum späteren Nachschlagen - Fragen können in vielen Fällen von Moderatoren und angesehenen Benutzern zwischen Stackexchange-Sites verschoben werden. Auf diese Weise bleiben bereits platzierte Antworten erhalten. Daher ist es in der Regel besser, sie selbst neu zu veröffentlichen (es sei denn, es gibt keine Antworten. In diesem Fall löschen Sie die alte Frage, damit niemand sie versehentlich beantwortet). Wenn Sie einem Vorschlag zum Verschieben zustimmen, fügen Sie einfach einen entsprechenden Kommentar hinzu und markieren Sie Ihren Beitrag (wenn möglich) für die Aufmerksamkeit des Moderators. Der Beitrag sollte dann für Sie verschoben werden.
Bdonlan

Antworten:

4

Ich habe einen udp-Server, [...] der Server ist fast vollständig zustandslos [..] hat eine gewisse Wiedergabetreue. Ich meine, wenn Client X an Server y weitergeleitet wurde, möchte ich, dass alle nachfolgenden Anforderungen von X an Server Y gehen solange es sinnvoll ist und Y nicht überlastet.

Sie verwenden also ein nicht bekannt gegebenes Anwendungsprotokoll, das einen gewissen Anwendungsstatus beibehält und auf UDP ausgeführt wird? Du gehst in eine schwierige Richtung. UDP ist kein zuverlässiger Datentransport, das ist der springende Punkt - für einen zuverlässigen Datentransport siehe seinen beliebten Freund TCP. Die einzige Möglichkeit, Ihre "Wiedergabetreue" zu erreichen, besteht darin, einen Load-Balancing-Proxy zu haben, der Ihr Protokoll auf Anwendungsebene versteht, Ihren aktuellen Anwendungsstatus kennt und entsprechend handeln kann.

Ich sehe drei Ansätze, die dem entsprechen, was Sie suchen:

  • Verteilen Sie eingehende Verbindungen statisch auf 3 IP-Adressen, basierend auf der Quell- IP-Adresse (Endbenutzer). Auf diese Weise wird ein bestimmter Benutzer immer an denselben Server weitergeleitet. Die meisten professionellen Firewalls können dies für Sie tun. Möglicherweise müssen Sie die 3 Server selbst hoch verfügbar machen, da die meisten Firewalls keine Backend-Integritätsprüfungen für Sie durchführen.

  • Verwenden Sie DNS und DNS Round Robin, wie bereits von Matt Simmons vorgeschlagen.

  • Verwenden Sie den in Windows integrierten Network Load Balancing (NLB) . Ehrlich gesagt, ich weiß nicht, wie sich das Failover-Szenario mit NLB und Ihrem semi-statusbehafteten UDP-basierten Dienst auswirken würde - Sie müssten dies selbst untersuchen, basierend darauf, wie Ihre Anwendung mit dem Status umgeht. Auf der positiven Seite ist NLB sehr einfach einzurichten, kostenlos mit der Windows-Lizenz, ausgereift und leistungsfähig.

Jesper M.
quelle
Ich habe meine Frage bearbeitet
Hellfrost
6

Linux Virtual Server ist ein hoch skalierbarer und hochverfügbarer Server, der auf einem Cluster realer Server basiert. LVS-unterstütztes UDP-Protokoll und Quell-Hash-Algorithmus (wird verwendet, wenn ein Client immer auf demselben Realserver angezeigt werden soll).

Ich benutze LVM, um DNS (rr), SIP (sh) auszugleichen.

alvosu
quelle
4

Interessant. Die meiste Proxy-Software, die ich gesehen habe, basiert zugegebenermaßen auf TCP.

Der größte Teil des UDP-spezifischen Lastausgleichs, den ich in meiner mageren Erfahrung gesehen habe, war DNS-basiert (dh Zeitserver, DNS-Server usw.). Gibt es eine Möglichkeit, mehrere A-Datensätze bereitzustellen? Wenn dies funktionieren würde, würde der normale DNS Round Robin eine faire Verteilung der Anforderungen sicherstellen (wahrscheinlich jedenfalls fair genug) und das Client-Caching würde sicherstellen, dass die Wiedergabetreue erhalten bleibt (vorausgesetzt, Sie verwenden eine Cache-basierte Plattform auf der Client-Seite).

Matt Simmons
quelle
überhaupt keine DNS.
Hellfrost
2

Sie können jede Art von Load Balancer verwenden, entweder Hardware oder Software. Sie können je nach Bedarf aus verschiedenen Load Balancern auswählen.

Lastausgleichsstufe 3: Lastenausgleich nur anhand der eingehenden IP-Adresse und der verfügbaren Backend-IPs. Diese Art von Lastausgleich sorgt für Klebrigkeit, indem immer dieselbe eingehende IP-Adresse an dasselbe Backend gesendet wird, obwohl diese Art von Strategie eine überlasten kann der Backends, wenn viele Clients von derselben IP stammen (sei es ein Proxy oder ein Corporate Gateway)

Load Balancer der Stufe 7: Ein Load Balancer der Stufe 7 wird nicht nur als Balancer der Stufe 3 ausgeglichen, sondern auch den Inhalt des Pakets anzeigen, wodurch Sie viel mehr Flexibilität für Ihre Ausgleichsrichtlinien erhalten.

In Anbetracht der Tatsache, dass Sie UDP verwenden, sollten beide Balancer eine gute Leistung erbringen. Auch die eingehende Paketprüfung in UDP ist etwas eingeschränkter als in TCP (nur aus Protokollgründen).

Abhängig von Ihrem Budget können Sie zunächst einen Software-Load-Balancer (z. B. Linux + IPVS) verwenden und dann Hardware-Load-Balancer verwenden, wie sie von Cisco oder Netapp angeboten werden

Luchsmann
quelle
-1 für den L7-Teil. Ein Layer / Ebene 7 Load - Balancer arbeitet auf der Anwendungsebene - aber da OP UDP verwendet, er ist nicht nur alte HTTP, und er hat nicht bekannt gegeben, welche Anwendung er wird verwendet. Wir können nicht wissen, dass ein L7-Load-Balancer für das von OP verwendete Protokoll vorhanden ist.
Jesper M
1
Ich habe gerade seine Optionen in Load Balancern kommentiert, und wir wissen nicht, was er über UDP verwendet. Ich denke, Sie schneiden diese zu eng;)
Lynxman
Zwischen NLB / Linux und Cisco / Netapp gibt es etwas: KEMP-Loadbalancer. Sie können eine virtuelle Ausgabe davon erhalten, die nicht viel Geld kostet. Wir verwenden sie und sind sehr glücklich.
Pause
2

Das Open Source NGINX und die Application Delivery-Plattform NGINX Plus unterstützen jetzt den UDP-Lastausgleich. Die neue Funktion baut auf unseren vorhandenen TCP- und HTTP-Funktionen auf und macht NGINX zu einem leistungsstarken, benutzerfreundlichen und konsistenten Frontend für eine noch größere Auswahl an Internetanwendungen und -geräten.

Verfügbar in der Version nginx-1.9.13

Anish
quelle