Frage Weighted Round Robins via TTL - möglich?


Ich benutze derzeit DNS-Round-Robin für Load-Balancing, das funktioniert gut. Die Aufzeichnungen sehen so aus (ich habe eine TTL von 120 Sekunden)

;; ANSWER SECTION:
orion.2x.to.        116 IN  A   80.237.201.41
orion.2x.to.        116 IN  A   87.230.54.12
orion.2x.to.        116 IN  A   87.230.100.10
orion.2x.to.        116 IN  A   87.230.51.65

Ich habe gelernt, dass nicht jeder ISP / Gerät eine solche Antwort auf die gleiche Weise behandelt. Zum Beispiel rotieren einige DNS-Server die Adressen zufällig oder durchlaufen sie immer durch. Einige propagieren nur den ersten Eintrag, andere versuchen zu bestimmen, welcher (regional nahe) am besten ist, indem sie die IP-Adresse betrachten.

Wenn die Benutzerbasis jedoch groß genug ist (verteilt sich über mehrere ISPs usw.), gleicht sie sich ziemlich gut aus. Die Diskrepanzen vom höchsten zum am niedrigsten belasteten Server übersteigen kaum alle 15%.

Aber jetzt habe ich das Problem, dass ich mehr Server in die Systeme einführe, und dass nicht alle die gleichen Kapazitäten haben.

Ich habe momentan nur 1 Gbps Server, aber ich möchte mit 100 Mbps und auch 10 Gbps Servern arbeiten.

Also möchte ich einen Server mit 10 Gbps mit einem Gewicht von 100, einen 1 Gbps Server mit einem Gewicht von 10 und einen 100 Mbps Server mit einem Gewicht von 1 einführen.

Ich habe vorher Server zweimal hinzugefügt, um mehr Traffic zu ihnen zu bringen (was gut funktioniert hat - die Bandbreite hat sich fast verdoppelt). Aber 100-mal einen 10 Gbps-Server zu DNS hinzuzufügen, ist ein bisschen lächerlich.

Also dachte ich über die Verwendung der TTL nach.

Wenn ich Server A 240 Sekunden TTL und Server B nur 120 Sekunden gebe (das ist ungefähr das Minimum für Round Robin, da viele DNS-Server auf 120 gesetzt werden, wenn eine niedrigere TTL spezifiziert ist (also ich gehört habe)). Ich denke, so etwas sollte im Idealfall passieren:

First 120 seconds
50% of requests get server A -> keep it for 240 seconds.
50% of requests get server B -> keep it for 120 seconds

Second 120 seconds
50% of requests still  have server A cached -> keep it for another 120 seconds.
25% of requests get server A -> keep it for 240 seconds
25% of requests get server B -> keep it for 120 seconds

Third 120 seconds
25% will get server A (from the 50% of Server A that now expired) -> cache 240 sec
25% will get server B  (from the 50% of Server A  that now expired) -> cache 120 sec
25% will have server A cached for another 120 seconds
12.5% will get server B (from the 25% of server B that now expired) -> cache 120sec
12.5% will get server A (from the 25% of server B that now expired) -> cache 240 sec

Fourth 120 seconds
25% will have server A cached -> cache for another 120 secs
12.5% will get server A (from the 25% of b that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of b that now expired) -> cache 120 secs
12.5% will get server A (from the 25% of a that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of a that now expired) -> cache 120 secs
6.25% will get server A (from the 12.5% of b that now expired) -> cache 240 secs
6.25% will get server B (from the 12.5% of b that now expired) -> cache 120 secs
12.5% will have server A cached -> cache another 120 secs
... I think I lost something at this point, but I think you get the idea...

Wie Sie sehen können, wird es ziemlich kompliziert vorherzusagen und es wird in der Praxis sicher nicht so funktionieren. Aber es sollte sich definitiv auf die Distribution auswirken!

Ich weiß, dass gewichtetes Round-Robin existiert und nur vom Root-Server gesteuert wird. Es durchläuft beim Antworten nur DNS-Einträge und gibt DNS-Einträge mit einer festgelegten Wahrscheinlichkeit zurück, die der Gewichtung entspricht. Mein DNS-Server unterstützt dies nicht, und meine Anforderungen sind nicht so präzise. Wenn es nicht perfekt wäscht ist es in Ordnung, aber es sollte in die richtige Richtung gehen.

Ich denke, die Verwendung des TTL-Feldes könnte eine elegantere und einfachere Lösung sein - und es ist kein DNS-Server erforderlich, der dies dynamisch steuert, was Ressourcen spart - was meines Erachtens den ganzen Punkt des DNS-Lastenausgleichs gegenüber Hardware-Lastenausgleichern darstellt.

Meine Frage ist nun: Gibt es Best Practices / Methoden / Faustregeln, um die Round-Robin-Verteilung mit dem TTL-Attribut von DNS-Einträgen zu gewichten?

Bearbeiten:

Das System ist ein Forward-Proxy-Server-System. Die Bandbreite (keine Anforderungen) übersteigt den Wert eines einzelnen Servers mit Ethernet. Also brauche ich eine Balancing-Lösung, die die Bandbreite auf mehrere Server verteilt. Gibt es alternative Methoden als DNS? Natürlich kann ich einen Load Balancer mit Fibre Channel usw. verwenden, aber die Kosten sind lächerlich und es erhöht auch nur die Breite des Flaschenhalses und beseitigt sie nicht. Das einzige, was ich mir vorstellen kann, sind Anycast (ist es Anycast oder Multicast?) IP-Adressen, aber ich habe nicht die Mittel, um ein solches System einzurichten.


8
2018-02-07 15:11


Ursprung


Bereiten Sie sich darauf vor, von einem breiten Spektrum von Befragten mit einer Kopie von RFC 2181 § 5.2 auf den Kopf getroffen zu werden. - JdeBP
Nun, ich merke, dass RR nicht für den Lastenausgleich konzipiert wurde. aber es funktioniert super ... so ... mir ist auch keine Alternative bekannt. natürlich gibt es sie aber entweder sind sie mir nicht möglich oder viel zu teuer oder zu kompliziert - The Shurrican
@JdeBP ja, guter Platz - die TTLs in einem RRset MÜSSEN gleich sein. - Alnitak


Antworten:


Zunächst einmal stimme ich @Alnitak völlig zu, dass DNS nicht für solche Dinge gedacht ist, und die beste Vorgehensweise ist es, DNS nicht als Lastausgleich für Arme einzusetzen.

Meine Frage ist jetzt ... gibt es irgendwelche beste Precices / Methos / Faustregeln, um Round Robin Verteilung mit dem TTL-Attribut von DNS-Aufzeichnungen zu gewichten?

Um auf die Prämisse der Frage zu antworten, Der Ansatz, der verwendet wird, um Basix-gewichtetes Round-Robin mit DNS durchzuführen, ist:

  • Verstelle die relatives Auftreten von Datensätzen in autorisierenden DNS-Antworten. I.e. ob Server A ist 1/3 des Verkehrs und Server B ist 2/3, dann 1/3 von autorisierenden DNS-Antworten auf DNS-Proxies enthalten würde nur  AIP, und nur 2/3 der Antworten B's IP. (Wenn zwei oder mehr Server dasselbe Gewicht haben, können sie zu einer einzigen Antwort zusammengefasst werden.)
  • Behalten Sie einen niedrigen DNS-TTL bei, damit die nicht ausgeglichene Last relativ schnell ausgeglichen wird. Da die nachgeschalteten DNS-Proxys sehr uneinheitliche Clients hinter sich haben, sollten Sie die Datensätze häufig neu mischen.

Amazonas Route 53 DNS-Dienst verwendet diese Methode.

Der Umfang der Bandbreite (keine Anfragen) übersteigt den Wert eines einzelnen Servers mit Ethernet. Also brauche ich eine Balancing-Lösung, die die Bandbreite auf mehrere Server verteilt.

Recht. So wie ich das verstehe, haben Sie eine Art von "billigen" Downloads / Video-Distribution / große Datei-Download-Service, wo die Gesamt-Service-Bitrate 1 GBit übersteigt.

Ohne genau zu wissen, wie Ihr Service und Ihr Serverlayout genau aussehen, ist es schwierig, genau zu sein. Aber ein übliche Lösung in diesem Fall ist:

  • DNS-Round-Robin auf zwei oder mehr Load-Balancer-Instanzen auf TCP / IP- oder HTTP-Ebene.
  • Jede Load-Balancer-Instanz ist hochverfügbar (zwei identische Load-Balancer arbeiten zusammen, um eine IP-Adresse immer eingeschaltet zu lassen).
  • Jede Load-Balancer-Instanz verwendet eine gewichtete Round-Robin- oder gewichtete zufällige Verbindungsbehandlung mit den Back-End-Servern.

Diese Art von Setup kann mit Open-Source-Software oder mit speziell entwickelten Appliances von vielen Herstellern erstellt werden. Das Lastausgleichs-Tag Hier ist ein guter Ausgangspunkt, oder Sie könnten Sysadmins einstellen, die das schon einmal getan haben, um sich für Sie zu beraten ...


2
2018-02-09 03:06





Meine Frage ist jetzt ... gibt es irgendwelche beste Precices / Methos / Faustregeln, um Round Robin Verteilung mit dem TTL-Attribut von DNS-Aufzeichnungen zu gewichten?

Ja, beste Praxis ist mach es nicht !!

Bitte wiederhole es nach mir

  • DNS dient nicht zum Lastenausgleich
  • DNS bietet keine Ausfallsicherheit
  • DNS bietet keine Failover-Funktionen

DNS ist für die Zuordnung von a Name zu eine oder mehrere IP-Adressen. Jede nachfolgende Balance, die du erhältst, ist durch Glück, nicht durch Design.


5
2018-02-07 16:26



more IP addresses ... wie balanciert das nicht? außerdem habe ich deshalb meiner Frage eine entsprechende einleitung gegeben. Wenn ich das nicht getan habe, würde ich Ihren Beitrag als KOMMENTAR schätzen, aber so muss ich ihn ablehnen. es ist nicht Design, aber es funktioniert gut und bietet große Vorteile im Vergleich zu allen Alternativen. und das ist, was Websites wie Google, Facebook, Amazon usw. auch denken und verwenden. Kommentar jedoch notiert. Ich habe meine Frage mit weiteren Informationen über das Szenario aktualisiert und bitte Sie, eine alternative Ausgleichslösung @Alnitak vorzuschlagen - The Shurrican
Der Abgleich auf diese Weise bietet keine Garantie für die Vollständigkeit, da so viele Probleme auf der Kundenseite außerhalb Ihrer Kontrolle entstehen. Dies ist doppelt so wichtig, wenn Sie "gewichten" wollen, da Sie Round Robin grundsätzlich nicht garantieren können. DNS ist nur ein Beratungsdienst, Clients müssen dem nicht folgen. Ich denke, das ist der Punkt, den @ Alnitak machen wollte - Matthew Ife
Das verstehe ich perfekt. Zitat aus meiner Frage: Ich habe gelernt, dass nicht jeder ISP / Gerät eine solche Antwort auf die gleiche Weise behandelt. Zum Beispiel rotieren einige DNS-Server die Adressen zufällig oder durchlaufen sie immer durch. Einige propagieren nur den ersten Eintrag, andere versuchen herauszufinden, welches (regional nahe) am besten ist, indem sie die IP-Adresse betrachten. Wenn die Benutzerdatenbank jedoch groß genug ist (verteilt sich über mehrere ISPs usw.), gleicht sie sich ziemlich gut aus. Die Diskrepanzen vom höchsten zum am niedrigsten belasteten Server übersteigen kaum alle 15%. - The Shurrican
@JoeHopfgartner ist der einzige narrensichere Weg zur Bereitstellung von Ausfallsicherheit, Redunancy und Balancing auf der IP-Ebene - also BGP-Routing und Layer 4 Load Balancer. Ich habe es in dieser Antwort nicht gesagt, weil ich es schon Dutzende Male in anderen Antworten gesagt habe. - Alnitak
Ist Redundanz für Ihre Lösung wichtig? I.E Wenn ein Server ausfällt, wird er entsprechend behandelt? Denn wenn Sie eine Dose Würmer mit RR-DNS öffnen. - Matthew Ife


Sieh dir das an PowerDNS. Es ermöglicht Ihnen, ein benutzerdefiniertes Pipe-Back-End zu erstellen. Ich habe ein Beispiel Load-Balancer-DNS-Backend in Perl geschrieben, um den Algorithmus ::Konsistenter Hash:: Ketama Modul. Damit kann ich beliebige Gewichte wie folgt setzen:

my $ketamahe = Algorithm::ConsistentHash::Ketama->new();

# Configure servers and weights
$ketamahe->add_bucket("192.168.1.2", 50);
$ketamahe->add_bucket("192.168.1.25", 50);

Und noch einer:

# multi-colo hash
my $ketamamc = Algorithm::ConsistentHash::Ketama->new();

# Configure servers and weights
$ketamamc->add_bucket("192.168.1.2", 33);
$ketamamc->add_bucket("192.168.1.25", 33);
$ketamamc->add_bucket("192.168.2.2", 17);
$ketamamc->add_bucket("192.168.2.2", 17);

Ich habe einen cname von meiner gewünschten Top-Level-Domain zu einem Subdoman hinzugefügt, den ich gslb oder Global Server Load Balancing nenne. Von dort aus rufe ich diesen benutzerdefinierten DNS-Server auf und sende A-Datensätze entsprechend meinen gewünschten Gewichten aus.

Funktioniert wie ein Champion. Der Ketama-Hash hat die nette Eigenschaft, die bestehende Konfiguration nur minimal zu stören, wenn Sie Server hinzufügen oder Gewichte anpassen.

Ich empfehle alternative DNS-Server von Jan-Piet Mens zu lesen. Er hat viele gute Ideen und Beispielcode.

Ich würde auch empfehlen, die TTL-Modulation aufzugeben. Sie sind schon ziemlich weit entfernt und ein weiterer Kludon wird die Fehlersuche und Dokumentation extrem erschweren.


2
2018-02-09 04:17





Sie können PowerDNS verwenden, um gewichtetes Round-Robin auszuführen, obwohl die Verteilung von Lasten in einer solchen unausgewogenen Art (100: 1?) Sehr interessant werden kann, zumindest mit den Algorithmen, die ich in meiner Lösung verwendet habe , zwischen 1-100, und ein zufälliger Wert wird verwendet, um Datensätze ein- oder auszuschließen.

Hier ist ein Artikel, den ich mit dem MySQL-Backend in PowerDNS geschrieben habe, um den gewichteten RR-DNS zu tun: http://www.mccartney.ie/wordpress/2008/08/wrr-dns-with-powerdns/

R.I.Pienaar hat auch einige Ruby-basierte Beispiele (mit dem PowerDNS-Pipe-Backend): http://code.google.com/p/ruby-pdns/wiki/RecipeWeightedRoundRobin


1
2018-04-12 16:45





Um mit dieser Art von Setup fertig zu werden, müssen Sie sich eine echte Load-Balancing-Lösung anschauen. Lesen Virtueller Linux-Server und HAProxy. Sie erhalten den zusätzlichen Vorteil, dass Server automatisch aus dem Pool entfernt werden, wenn sie ausfallen und die Auswirkungen viel leichter zu verstehen sind. Gewichtung ist einfach eine Einstellung, die angepasst werden muss.


1
2018-02-07 16:47



Das Problem dabei ist, dass ich ein Bandbreitenproblem habe und kein Problem mit der Anzahl von Anfragen, die ein einzelner Server bewältigen kann. Eine Lösung, bei der ich den gesamten Datenverkehr über einen Knoten leiten muss, ist für mich keine Lösung. Das einzige, was mir neben der DNS-Lösung einfällt, ist eine Multicast-IP-Adresse. Ich habe meine Frage entsprechend bearbeitet. - The Shurrican
Entschuldigung, ich meine Anycast, nicht Multicast (glaube ich) - The Shurrican
Wenn die Bandbreite das Problem ist, sollten Sie dieses + LACP auf Ihren Switches betrachten. Sie könnten dann mehrere 10G-Karten in den Loadbalancing-Geräten verbinden. - Mark Harrigan
ich habe das aufgefrischt weil es interessant ist ... aber hten ich habe meinen switch als flaschenhals! - The Shurrican