DNS Round Robin: ¿Los navegadores se adhieren a una IP siempre que esté en línea?


14

¿Cómo se comportan la mayoría de los navegadores si obtienen múltiples registros A del servidor DNS? ¿Se adhiere a una IP siempre que sea accesible (y solo use otra si la IP está inactiva)? ¿O cambian todo el tiempo sin razón?

Si la mayoría de los navegadores actuales se adhieren a una IP, DNS-RR sería suficiente para mí como una simple solución de conmutación por error.


1
¡No puedo responder su pregunta directamente, pero le señalaré que tiene que lidiar con el almacenamiento en caché tanto en el navegador como en el sistema operativo! Diviértete :)
SpacemanSpiff


1
@Iain - Enlace impresionante
SpacemanSpiff

¿Cuántas máquinas tienes para un backend? Si 2 máquinas con activo-pasivo está bien, obtenga una tercera dirección IP y use los latidos para conmutar por error entre máquinas físicas. Alternativamente, creo que ultramonkey admite la asignación a backends según la IP de origen, que es casi lo mismo que un solo cliente. Probablemente también podría hackear algo juntos haciendo que cada backend establezca una cookie única y que tenga un proxy de servidor web frontend para los backends dependiendo de la cookie. (Mod_rewrite de Apache probablemente puede hacerlo.)
Jon

No existe una regla única que cubra todos los navegadores, por lo que al menos debe especificar en cuál / es está interesado.
John Gardeniers

Respuestas:


7

Cada navegador tiene su propio método de manejo de DNS round-robin, hoy he pasado algún tiempo investigando este problema y continuaré actualizando mi respuesta a medida que encuentre pruebas de implementación que limitarán mis respuestas a los navegadores que exponen su comportamiento.

Google Chrome

Google Chrome (v58 utilizado) solicitará todas las entradas de host para una dirección (A, AAAA, CNAME) y las colocará en una matriz ( dirección_lista ). Chrome intentará abrir un socket en cada dirección IP en orden de principio a fin, Chrome no intentará la IP más rápida o más cercana, se supone que la primera IP (dada por sus solucionadores de dns ascendentes) es la mejor IP. En mis pruebas, los servidores bind y windows dns dan un orden diferente de IP por búsqueda, dando lo que parece una división 50/50 en ancho de banda para cada IP. Esta funcionalidad está expuesta enchrome://net-internals/#events&q=type:SOCKET%20is:active

Rizo (libcurl / 7.54.0)

Curl también tiene esta función de conmutación por error, pero --connect-timeoutes mucho más larga que la predeterminada en Chrome, Chrome falla inmediatamente, Curl no. Si usa libcurl y desea sobrevivir a una instancia dns round-robin donde falla una IP (funciona en Chrome pero no en código) asegúrese de especificar este valor más bajo.

DEFAULT_CONNECT_TIMEOUT: 0 me hizo pensar que esto no era posible con curl.

* After 149990ms connect time, move on!

En ambos navegadores , la IP no era pegajosa , siguieron el TTL dado en DNS y una vez que ttl expiró (Chrome mantiene esto internamente, curl pregunta en cada solicitud), la selección de ip se realiza cada vez como se describe anteriormente.

¿Qué significa esto? DNS-RR está bien para algunos sistemas, pero no está diseñado para la conmutación por error. Debe esperar que todos los resultados de la búsqueda de DNS sean (una fuente de verdad) válidos y disponibles para atender el tráfico. Hay muchas formas de garantizar la disponibilidad de IP, como IP flotantes virtuales, trucos BGP / enrutamiento, etc. Úselos .

Todas las pruebas realizadas en un entorno solo de IPv4, regresarán con resultados de doble pila una vez que haya suficiente infraestructura disponible para probar.

Especulo que estos cambios son un efecto secundario de los globos oculares felices IPv6-Fallback RFC

Actualización Una consideración útil, RR DNS solo puede ayudar con el equilibrio de carga, no con fallas de la aplicación, si uno de sus nodos tiene un 503, servirá 40-60% si su tráfico es 503. Se supone que todas las IP enumeradas son puntos finales de trabajo válidos si se puede alcanzar


2

editar: Editando mi respuesta desde que HiPerFreak me educó.

Los servidores DNS devolverán una lista de todos los registros A que tiene para un nombre de host dado. Donde entra el round robin es que gira cómo se ordena la lista. El enlace que se publicó es un gran ejemplo de cómo los navegadores web harán uso de esa lista.

Round Robinning se puede usar para una forma muy primitiva de equilibrio de carga, pero es un sustituto muy pobre para el equilibrio de carga real, ya que si uno de los hosts en la rotación round robin se cae, el servidor DNS no será más sabio y seguirá siendo ponga la dirección IP del nodo caído en la lista.


El servidor DNS siempre entrega TODAS las direcciones. El navegador es el que decide cuál se usa (como se desacredita muchas veces aquí y en otros lugares). Además, el sistema operativo pasa todas las IP al navegador.
HiPerFreak

2
@HiPerFreak La configuración que se ve a menudo (especialmente para una gran cantidad de registros A) es que el DNS distribuye algunas direcciones (aunque no todas, generalmente para asegurarse de que encajan en un paquete UDP de 512 bytes y no incurren en gastos generales innecesarios) , generalmente en un orden cambiante.
the-wabbit

Estaba pensando en 2 o 3 IP.
HiPerFreak

@HiPerFreak: solo quería decir que tiene razón en que un servidor DNS entrega todos los registros A cuando se le pregunta por un nombre si existen varios registros A para ese nombre. Tengo un servidor DNS y acabo de capturar un paquete con Wireshark mientras marcaba el nombre del host para confirmar. Gracias, ¡aprendí algo hoy! :)
Ryan Ries

2

Vea esta mi pregunta (y respuesta): Cómo los navegadores manejan múltiples IP .

En breve, round robin dns no mejora la disponibilidad en absoluto. El navegador elige una IP y se adhiere a ella, incluso si no responde. (Comprobado con FF y cromo).

Una vez que caduca la memoria caché del navegador, el nombre de host se resuelve nuevamente y el proceso se repite, independientemente de si IP respondió o no.

Para HA básica, puede usar DNS dinámico o varios enfoques basados ​​en IP.

EDITAR: Este comportamiento tendrá lugar cuando el host inaccesible actúe como un "agujero negro". Si, en cambio, el host rechaza las conexiones entrantes, el navegador intentará una ip, se negará e inmediatamente usará otra ip y, por lo tanto, fallará bastante bien.


2
Tal vez esto haya cambiado en los últimos años, pero puedo confirmar que, tras varias actualizaciones en Firefox, la IP cambia, aunque no con demasiada frecuencia. ¿Posiblemente esta respuesta está desactualizada?
Yeti

Mi investigación (a partir de 2015) es que Chrome, Firefox y MSIE NO se comportan como Sandman4 describe. MSIE es notablemente diferente en el sentido de que requiere un tiempo de espera TCP completo antes de intentar una conexión a la siguiente dirección indicada si la primera falla.
symcbean

0

Cambian las IP, no es una solución de conmutación por error.

Los navegadores permiten que el sistema operativo haga la resolución de nombres y, por ejemplo, Linux siempre aleatoriza las direcciones IP, pruebe host google.com varias veces. Las IP vendrán en orden aleatorio.


¿Por qué hacen esto al azar y sin razón? ¿No tendría sentido reutilizar una IP de conocimiento para trabajar siempre que esté en funcionamiento?
HiPerFreak

1
Es para equilibrar la carga.
Stone


@HiPerFreak: La razón por la que no se adhiere a una IP conocida es que la resolución de nombre no sabe nada sobre si esa IP funciona ahora o en el pasado. El navegador no se adhiere a una sola IP, porque la resolución del nombre le dice que use diferentes IP. :-)
Sean Reifschneider

@Sean: Como se discutió en la respuesta de golpe, la resolución de nombre le da al navegador TODAS las IP y el navegador decide cuál usar. Y el navegador sabe qué IP funcionaron y cuáles no. Entonces esta no puede ser la razón.
HiPerFreak

0

El DNS devuelve toda la IP en una lista, pero cambia el orden de la lista y este orden no es aleatorio o cambia cuando 1 falla, pero siempre devuelve las IP en la misma secuencia por razones de equilibrio de carga. Cuando el navegador recibe la lista, supongo que elige el primero de la lista si no se conoce como no funcional.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.