DNS Round Robin: Bleiben Browser bei einer IP, solange sie online sind?

14

Wie verhalten sich die meisten Browser, wenn sie vom DNS-Server mehrere A-Einträge erhalten? Halten Sie sich an eine IP-Adresse, solange diese erreichbar ist (und verwenden Sie eine andere nur, wenn die IP-Adresse nicht verfügbar ist)? Oder wechseln sie die ganze Zeit ohne Grund?

Wenn sich die meisten aktuellen Browser an eine IP-Adresse halten, reicht DNS-RR für mich als einfache Failover-Lösung aus.

HiPerFreak
quelle
1
Ich kann Ihre Frage nicht direkt beantworten, aber ich werde Sie darauf hinweisen, dass Sie sich sowohl auf Browser- als auch auf Betriebssystemebene mit Caching befassen müssen! Viel Spaß :)
SpacemanSpiff
1
@Iain - Super Link
SpacemanSpiff
Wie viele Maschinen haben Sie für ein Backend? Wenn 2 Computer mit Aktiv / Passiv in Ordnung sind, holen Sie sich eine dritte IP-Adresse und verwenden Sie Heartbeat, um ein Failover zwischen physischen Computern durchzuführen. Alternativ, denke ich, unterstützt ultramonkey das Zuweisen zu Backends basierend auf der Quell-IP, was fast dasselbe ist wie bei einem einzelnen Client. Sie könnten wahrscheinlich auch etwas zusammen hacken, indem Sie für jedes Backend ein eindeutiges Cookie festlegen und je nach Cookie einen Frontend-Webserver-Proxy für die Backends einrichten. (Apaches mod_rewrite kann es wahrscheinlich tun.)
jon
Es gibt keine einheitliche Regel, die alle Browser abdeckt. Sie müssen also mindestens angeben, an welchem ​​Browser Sie interessiert sind.
John Gardeniers

Antworten:

7

Jeder Browser hat seine eigene Methode zur Behandlung von Round-Robin-DNS. Ich habe heute einige Zeit damit verbracht, dieses Problem zu untersuchen, und werde meine Antwort weiterhin aktualisieren, sobald ich einen Implementierungsnachweis finde, der meine Antworten auf Browser beschränkt, die ihr Verhalten offenlegen.

Google Chrome

Google Chrome (v58 verwendet) fordert alle Hosteinträge für eine Adresse (A, AAAA, CNAME) an und fügt sie in ein Array ( address_list ) ein. Chrome versucht dann, einen Socket für jede IP-Adresse zu öffnen, um von der ersten zur letzten zu gelangen. Chrome versucht nicht, die schnellste oder nächstgelegene IP-Adresse zu ermitteln, sondern geht davon aus, dass die erste (von Ihren DNS-Resolvern im Upstream angegebene) die beste IP-Adresse ist. In meinen Tests geben Bind- und Windows-DNS-Server eine unterschiedliche Reihenfolge von IPs pro Lookup an, wobei die Bandbreite für jede IP 50/50 aufgeteilt zu sein scheint. Diese Funktionalität ist in verfügbarchrome://net-internals/#events&q=type:SOCKET%20is:active

Locke (libcurl / 7.54.0)

Curl hat auch diese Failover-Funktion, aber die --connect-timeoutist viel länger als die Standardeinstellung in Chrome. Chrome führt ein sofortiges Failover durch, Curl nicht. Wenn Sie libcurl verwenden und eine Round-Robin-DNS-Instanz überleben möchten, bei der eine IP-Adresse ausfällt (funktioniert in Chrome, aber nicht im Code), müssen Sie diesen Wert niedriger angeben.

DEFAULT_CONNECT_TIMEOUT: 0 ließ mich glauben, dass dies mit Curl nicht möglich war.

* After 149990ms connect time, move on!

Auf beiden Browsern war die IP nicht klebrig , sie die TTL gegeben in DNS und sobald das ttl gefolgt abgelaufen (Chrom hält diese intern, Locke auf jede Anforderung fragt), wird die IP - Auswahl jedes Mal durchgeführt , wie oben beschrieben.

Was bedeutet das? DNS-RR ist für einige Systeme in Ordnung, jedoch nicht für Failover vorgesehen. Sie sollten davon ausgehen, dass alle Ergebnisse der DNS-Suche (eine Quelle der Wahrheit) gültig und für den Datenverkehr verfügbar sind. Es gibt viele Möglichkeiten, um die Verfügbarkeit von IP sicherzustellen, z. B. virtuelle Float-IPs, BGP / Routing-Tricks usw. Verwenden Sie diese .

Alle Tests, die nur in einer IPv4-Umgebung durchgeführt werden, werden mit Dual-Stack-Ergebnissen zurückgegeben, sobald genügend Infrastruktur zum Testen verfügbar ist.

Ich spekuliere, dass diese Änderungen ein Nebeneffekt der IPv6-Fallback RFC Happy Eyeballs sind

Update Ein nützlicher Gesichtspunkt ist, dass RR DNS nur beim Lastenausgleich und nicht bei Anwendungsfehlern helfen kann. Wenn einer Ihrer Knoten über einen 503 verfügt, werden Sie 40-60% bedienen, wenn der Datenverkehr 503 beträgt. Es wird davon ausgegangen, dass alle aufgeführten IPs gültige Arbeitsendpunkte sind, sofern diese erreichbar sind

Jacob Evans
quelle
2

edit: Bearbeiten meiner Antwort seit HiPerFreak mich geschult hat.

DNS-Server geben eine Liste aller A-Einträge für einen bestimmten Hostnamen zurück. Beim Round Robin dreht sich, wie die Liste sortiert ist. Der Link, der gepostet wurde, ist ein großartiges Beispiel dafür, wie Webbrowser diese Liste verwenden.

Round Robinning kann für eine sehr einfache Form des Lastenausgleichs verwendet werden, ist jedoch ein sehr schlechter Ersatz für den tatsächlichen Lastenausgleich, da der DNS-Server, wenn einer der Hosts in der Round-Robin-Rotation ausfällt, nicht klüger ist und es auch weiterhin tut Tragen Sie die IP-Adresse des heruntergefahrenen Knotens in die Liste ein.

Ryan Ries
quelle
Der DNS-Server teilt immer ALLE Adressen aus. Der Browser ist derjenige, der entscheidet, welcher verwendet wird (wie hier und anderswo oft diskutiert). Außerdem übergibt das Betriebssystem alle IP-Adressen an den Browser.
HiPerFreak
2
@HiPerFreak Die häufig vorkommende Konfiguration (insbesondere für eine große Anzahl von A-Records) besteht darin, dass der DNS einige Adressen ausgibt (wenn auch nicht alle, um sicherzustellen, dass sie in ein UDP-Paket mit 512 Bytes passen und keinen unnötigen Overhead verursachen). , normalerweise in wechselnder Reihenfolge.
the-wabbit
Ich dachte an 2 oder 3 IPs.
HiPerFreak
@HiPerFreak: Ich wollte nur sagen, dass Sie Recht haben, dass ein DNS-Server alle A-Einträge ausgibt, wenn er nach einem Namen gefragt wird, wenn für diesen Namen mehrere A-Einträge vorhanden sind. Ich habe einen DNS-Server und habe gerade eine Paketerfassung mit Wireshark durchgeführt, während ich den Hostnamen pingte, um dies zu bestätigen. Danke - ich habe heute etwas gelernt! :)
Ryan Ries
2

Siehe hierzu meine Frage (und Antwort): Wie Browser mit mehreren IPs umgehen .

Short-Round-Robin-DNS verbessert die Verfügbarkeit überhaupt nicht. Der Browser wählt eine IP und bleibt dabei, auch wenn er nicht antwortet. (Geprüft mit FF und Chrom).

Sobald der DNS-Cache des Browsers abgelaufen ist, wird der Hostname erneut aufgelöst und der Vorgang wiederholt, unabhängig davon, ob die IP-Adresse beantwortet wurde oder nicht.

Für grundlegende HA können Sie dynamisches DNS oder verschiedene IP-basierte Ansätze verwenden.

BEARBEITEN: Dieses Verhalten tritt auf, wenn ein unzugänglicher Host als "Schwarzes Loch" fungiert. Wenn der Host eingehende Verbindungen ablehnt, versucht der Browser eine IP-Adresse, lehnt diese ab und verwendet sofort eine andere IP-Adresse.

Sandman4
quelle
2
Vielleicht hat sich dies in den letzten Jahren geändert, aber ich kann bestätigen, dass sich die IP-Adresse nach mehreren Aktualisierungen in Firefox tatsächlich ändert, wenn auch nicht zu oft. Möglicherweise ist diese Antwort veraltet?
Yeti
Meine Forschung (von 2015) ist, dass Chrome, Firefox und MSIE sich NICHT so verhalten, wie Sandman4 es beschreibt. MSIE unterscheidet sich insbesondere dadurch, dass eine vollständige TCP-Zeitüberschreitung erforderlich ist, bevor eine Verbindung zur nächsten angegebenen Adresse hergestellt werden kann, wenn die erste fehlschlägt.
Symcbean
0

Sie tauschen die IPs, es ist keine Failover-Lösung.

Mit den Browsern kann das Betriebssystem die Namensauflösung vornehmen, und Linux sortiert die IP-Adressen beispielsweise immer nach dem Zufallsprinzip. Versuchen Sie mehrmals, google.com zu hosten . Die IPs werden in zufälliger Reihenfolge geliefert.

Stein
quelle
Warum machen sie das zufällig und ohne Grund? Wäre es nicht sinnvoll, ein funktionierendes IP wiederzuverwenden, solange es betriebsbereit ist?
HiPerFreak
1
Es dient zum Lastenausgleich.
Stone
@HiPerFreak Siehe auch: en.wikipedia.org/wiki/Round-robin_DNS
voretaq7
@HiPerFreak: Der Grund, warum es sich nicht um eine funktionierende IP handelt, ist, dass die Namensauflösung nichts darüber weiß, ob diese IP jetzt funktioniert oder in der Vergangenheit funktioniert. Der Browser hält sich nicht an eine einzelne IP-Adresse, da die Namensauflösung ihn auffordert, andere IP-Adressen zu verwenden. :-)
Sean Reifschneider
@Sean: Wie in der Antwort beschrieben, gibt die Namensauflösung dem Browser ALLE IP-Adressen und der Browser entscheidet, welche er verwendet. Und der Browser weiß, welche IPs funktionierten und welche nicht. Das kann also nicht der Grund sein.
HiPerFreak
0

Der DNS gibt alle IP-Adressen in einer Liste zurück, ändert jedoch die Reihenfolge der Liste. Diese Reihenfolge ist nicht zufällig oder ändert sich, wenn 1 ausfällt. Aus Gründen des Lastenausgleichs werden die IP-Adressen jedoch immer in der gleichen Reihenfolge zurückgegeben. Wenn der Browser die Liste erhält, nimmt er vermutlich den ersten Platz in der Liste ein, wenn er nicht als nicht funktionierend bekannt ist.

laurent
quelle