DNS Round Robin: i browser si attengono a un solo IP purché sia ​​online?


14

Come si comportano la maggior parte dei browser se ottengono più record A dal server DNS? Attenersi a un IP purché sia ​​raggiungibile (e utilizzarne un altro solo se l'IP è inattivo)? O cambiano continuamente senza motivo?

Se i browser più diffusi si attengono a un solo IP, DNS-RR sarebbe sufficiente per me come semplice soluzione di failover.


1
Non posso rispondere direttamente alla tua domanda, ma ti faccio notare che devi gestire la cache sia a livello di browser che di sistema operativo! Buon divertimento :)
SpacemanSpiff


1
@Iain - Link fantastico
SpacemanSpiff

Quante macchine hai per un backend? Se 2 macchine con attivo-passivo vanno bene, ottieni un terzo indirizzo IP e usa il battito cardiaco per eseguire il failover tra macchine fisiche. In alternativa, penso che ultramonkey supporti l'assegnazione ai backend in base all'IP di origine, che è quasi uguale a un singolo client. Probabilmente potresti anche hackerare qualcosa insieme avendo ogni backend impostato un cookie univoco e avendo un proxy del server web front-end su back-end a seconda del cookie. (Probabilmente il mod_rewrite di Apache può farlo.)
jon

Non esiste una singola regola che copra tutti i browser, quindi almeno devi specificare a quale / i ti interessa.
John Gardeniers,

Risposte:


7

Ogni browser ha il proprio metodo di gestione del DNS round robin, ho passato un po 'di tempo oggi a ricercare questo problema e continuerò ad aggiornare la mia risposta quando trovo la prova dell'implementazione che limiterà le mie risposte ai browser che espongono il loro comportamento.

Google Chrome

Google Chrome (utilizzato v58) richiederà tutte le voci host per un indirizzo (A, AAAA, CNAME) e le inserirà in un array ( address_list ). Chrome tenterà quindi di aprire un socket su ciascun indirizzo IP in ordine dal primo all'ultimo, Chrome non tenterà l'IP più veloce o più vicino, presuppone che il primo IP (fornito dai resolver DNS upstream) sia l'IP migliore. Nei miei test i server bind e windows dns danno un diverso ordine di IP per ricerca, dando a ogni IP ciò che sembra diviso in larghezza di banda 50/50. Questa funzionalità è esposta inchrome://net-internals/#events&q=type:SOCKET%20is:active

Curl (libcurl / 7.54.0)

Anche Curl ha questa funzione di failover, ma --connect-timeoutè molto più lunga di quella predefinita in Chrome, Chrome fallisce immediatamente, Curl no. Se usi libcurl e vuoi sopravvivere a un'istanza DNS round robin in cui un IP fallisce, (funziona in Chrome ma non nel codice) assicurati di specificare questo valore in basso.

DEFAULT_CONNECT_TIMEOUT: 0 mi ha fatto pensare che questo non fosse possibile con il ricciolo.

* After 149990ms connect time, move on!

Su entrambi i browser , l'IP non era appiccicoso , seguivano il TTL indicato in DNS e una volta scaduto il ttl (Chrome lo mantiene internamente, il ricciolo chiede su ogni richiesta), la selezione dell'ip viene eseguita ogni volta come descritto sopra.

Cosa significa questo? DNS-RR è ok per alcuni sistemi, ma non è progettato per il failover. Dovresti aspettarti che tutti i risultati del DNS siano (una fonte di verità) validi e disponibili per servire il traffico. Esistono molti modi per garantire la disponibilità dell'IP, come IP float virtuali, trucchi BGP / Routing, ecc . Usali .

Tutti i test eseguiti in ambiente solo IPv4, verranno restituiti con risultati dual-stack quando sarà disponibile un'infrastruttura sufficiente per il test.

Immagino che queste modifiche siano un effetto collaterale degli Happy Eyeballs RFC IPv6-Fallback

Aggiornamento Una considerazione utile, RR DNS può solo aiutare con il bilanciamento del carico, non i guasti delle applicazioni, se uno dei tuoi nodi ha un 503, servirai il 40-60% se il tuo traffico è 503. Si presume che tutti gli IP elencati siano endpoint di lavoro validi se raggiungibili


2

modifica: Modifica la mia risposta da quando HiPerFreak mi ha istruito.

I server DNS restituiranno un elenco di tutti i record A che ha per un determinato nome host. Il round robin entra nel fatto che ruota come viene ordinato l'elenco. Il link che è stato pubblicato è un ottimo esempio di come i browser web useranno tale elenco.

Round Robinning può essere utilizzato per una forma molto primitiva di bilanciamento del carico, ma è un sostituto molto scarso per il bilanciamento del carico reale, poiché se uno degli host nella rotazione round robin diminuisce, il server DNS non sarà il più saggio e continuerà a essere inserire l'indirizzo IP del nodo scaricato nell'elenco.


Il server DNS distribuisce sempre TUTTI gli indirizzi. Il browser è quello che decide quale viene utilizzato (come discuso molte volte qui e altrove). Inoltre, il sistema operativo passa tutti gli IP al browser.
HiPerFreak

2
@HiPerFreak La configurazione spesso vista (specialmente per un gran numero di A-Records) è che il DNS distribuisce alcuni indirizzi (anche se non tutti, di solito per assicurarsi che si inseriscano in un pacchetto UDP di 512 byte e non comportino costi inutili) , di solito in un ordine variabile.
the-wabbit il

Stavo pensando a 2 o 3 IP.
HiPerFreak

@HiPerFreak: Volevo solo dire che hai ragione nel dire che un server DNS distribuisce tutti i record A quando viene richiesto un nome se esistono più record A per quel nome. Ho un server DNS e ho appena fatto una cattura di pacchetti con Wireshark mentre eseguivo il ping del nome host per confermare. Grazie - ho imparato qualcosa oggi! :)
Ryan Ries

2

Vedi questa mia domanda (e risposta): come i browser gestiscono più IP .

In breve, Round Robin DNS non migliora affatto la disponibilità. Il browser sceglie un IP e si attiene ad esso, anche se non risponde. (Controllato con FF e cromo).

Una volta scaduta la cache DNS del browser, il nome host si è risolto di nuovo e il processo si è ripetuto, indipendentemente dalla risposta dell'IP o meno.

Per l'HA di base, è possibile utilizzare DNS dinamico o vari approcci basati su IP.

EDIT: questo comportamento si verifica quando l'host inaccessibile funge da "buco nero". Se invece l'host rifiuta in modo attivo le connessioni in entrata, il browser proverà un IP, si rifiuterà e utilizzerà immediatamente un altro IP e quindi fallirà abbastanza bene.


2
Forse questo è cambiato negli ultimi anni, ma posso confermare che su più aggiornamenti in Firefox, l'IP in effetti cambia, anche se non troppo spesso. Forse questa risposta è obsoleta?
Yeti,

La mia ricerca (dal 2015) è che Chrome, Firefox e MSIE NON si comportano come descritto da Sandman4. MSIE è notevolmente diverso in quanto richiede un timeout TCP completo prima di tentare una connessione all'indirizzo successivo elencato se il primo fallisce.
symcbean,

0

Cambiano gli IP, non è una soluzione di failover.

I browser consentono al sistema operativo di eseguire la risoluzione dei nomi e, per esempio, Linux randomizza sempre gli indirizzi IP, provare più volte l' host google.com . Gli IP arriveranno in ordine casuale.


Perché lo fanno in modo casuale e senza motivo? Non avrebbe senso riutilizzare un IP "know-to-work" fintanto che è attivo e funzionante?
HiPerFreak

1
È per il bilanciamento del carico.
Stone,


@HiPerFreak: il motivo per cui non si attacca a un IP noto al lavoro è che la risoluzione dei nomi non sa nulla sul fatto che quell'IP funzioni ora o abbia in passato. Il browser non si attacca a un singolo IP, perché la risoluzione dei nomi gli dice di usare IP diversi. :-)
Sean Reifschneider il

@Sean: come discusso nella risposta definitiva, la risoluzione del nome fornisce al browser TUTTI gli IP e il browser decide quale utilizzare. E il browser sa quali IP hanno funzionato e quali no. Quindi questo non può essere il motivo.
HiPerFreak il

0

Il DNS restituisce tutti gli IP in un elenco ma cambiano l'ordine dell'elenco e questo ordine non è casuale o cambia quando 1 fallisce ma restituiscono sempre gli IP nella stessa sequenza per motivi di bilanciamento del carico. Quando il browser riceve l'elenco, suppongo che scelga il primo nell'elenco se non noto come non funzionante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.