Asigne varias IP a 1 entrada en el archivo de hosts

29

Tengo un servidor web que se conecta a una base de datos interna a través de una VPN. Hay 2 IP (principal y secundaria) en la base de datos desde el servidor web. ¿Cómo puedo configurar mi archivo / etc / hosts para que si la IP principal no está disponible, se use la IP secundaria?

¿Funcionaría esto para mi archivo de hosts?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary
Mike T
fuente

Respuestas:

26

El archivo de hosts no proporciona dicho mecanismo. Si enumera dos IP para el mismo nombre, solo se utilizará la primera. Por lo tanto, no existen las IP primarias y secundarias.

Además, el archivo de hosts no maneja las URL. Solo maneja nombres como los proporcionados en la pregunta. Una URL contiene una ruta completa y un protocolo como http://host/path/to/resource.

Khaled
fuente
Título y nombres editados en la pregunta de OP para eliminar la confusión sobre las URL / hosts.
dmourati
14

No puede proporcionar resistencia o balanceo de carga round robin a través del /etc/hostsarchivo; no está diseñado para ese propósito.

En cambio , sus opciones son ... (sin ningún orden en particular)

  1. Configure su red correctamente, de modo que las rutas cambien cuando se cae un enlace
  2. Utilice el equilibrio de carga de round-robin DNS (no es una buena idea TM ) utilizando un servicio administrado (por ejemplo, loaddns.com o dnsmadeeasy.com, etc.)
  3. Utilice un equilibrador de carga L3 local para el tráfico saliente (HAProxy?) Con los back-end definidos según sea necesario
  4. Desarrolle la resistencia en su propia aplicación web
Ben Lessani - Sonassi
fuente
El balanceo de carga por turnos DNS generalmente no es resistente. Se selecciona uno y otros no se prueban.
Antti Rytsölä Circles Consult
Otra opción podría ser usar netcat u otro software para reenviar la conexión a una IP. Luego cambie el reenvío si se pierde una IP.
Antti Rytsölä Circles Consult
1
@anttiR DNS RR por sí solo no tiene resistencia, pero se usa a través de un proveedor de servicios DNS administrado. He editado mis respuestas y dado algunos ejemplos para ser más claro.
Ben Lessani - Sonassi
Dudo que funcione muy bien con la base de datos. Tienen la tendencia de buscar una IP y mantenerla. Un sitio web de Internet, por otro lado, funcionaría muy bien.
Antti Rytsölä Circles Consult
Eso dependería de la resolución de la máquina host. Si el solucionador de DNS está configurado para ser un servicio sin almacenamiento en caché, o sondea directamente la base de datos de registradores de DNS, entonces funcionaría. Pero como dije, no es una buena idea , es solo una idea .
Ben Lessani - Sonassi
3

/ etc / hosts no es compatible con round robin, pero puede escribir una secuencia de comandos bash simple para reemplazar una entrada etiquetada con un comentario #RoundRobin (o cualquier otra etiqueta que desee usar, simplemente refleje en la línea grep de la secuencia de comandos) .

#!/bin/bash
fqdnips=( $(nslookup sub.domain.com|grep Address:|awk -F\  '{ print $2 }'|grep -v '#') )

new=`printf "${fqdnips[@]}"`
old=`grep "#RoundRobin" /etc/hosts|awk -F\  '{ print $1 }'`
sed -i "s/$old/$new/g" /etc/hosts

La secuencia de comandos anterior toma el resultado de nslookup para sub.domain.com y lo almacena en una matriz. Luego imprime el valor más alto en $ new y toma el valor existente para la etiqueta #RoundRobin asignada en / etc / hosts ... por último, realiza un reemplazo de sed

La entrada del archivo / etc / hosts se vería así

127.0.0.1        localhost
::1              localhost
11.12.13.14      sub.domain.com      #RoundRobin

Por último, coloque este script en el crontab de la raíz para que se ejecute cada hora más o menos y ahora tendrá un round robin / etc / host.

Esto es particularmente útil si tiene una página codificada que extrae algunos datos de una API y la búsqueda de DNS para el servidor API está causando mucho tiempo de inactividad en la ejecución del script de la página ... lo que resulta en un alto consumo de CPU para lo que de otro modo Parece ser una página simple. Para evitar la costosa búsqueda de DNS (particularmente si su sitio está haciendo cientos de ellos por minuto para tráfico pesado), debe usar / etc / hosts para resolver el FQDN del servidor API remoto. Esto reducirá drásticamente el uso de la CPU para extraer los datos de la API y generar la página.

Satalink
fuente
¿El almacenamiento en caché de dns no aliviará su caso de cientos de búsquedas por minuto?
Xalorous
No controlo el servidor DNS, ¿es algo que puedo configurar en el servidor web CentOS?
Satalink
0

Sí, funcionaría

Sin embargo, el mecanismo de búsqueda simplemente va a la lista hasta que encuentra una coincidencia.

Entonces, aunque la respuesta a la pregunta tal como está escrita es SÍ, será un desafío. Pero nada insuperable.

Pruebe esto: cada una de esas direcciones IP realmente necesita tener nombres diferentes.

SDsolar
fuente
1
No, no funcionará. La segunda aparición de un valor en / etc / hosts nunca se usaría. Y si cambia el nombre de la segunda dirección IP con un nombre de host diferente, ahora tiene que hacer algo en su aplicación para equilibrar la carga. Eso será costoso y difícil, cuando DNS o DNS + Load Balancer es la respuesta correcta.
Xalorous
0

Una manera fácil de hacer que esto suceda sería usar un servicio DNS público, como AWS Route53. Puede ingresar varias direcciones IP por registro A con prioridad

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

Mientras no haya certificados involucrados, esto funciona y afaik ni siquiera va en contra de las normas o mejores prácticas.

NSLookup u otras consultas de dominio devolverán ambas direcciones. Su aplicación necesita poder manejar esto. Y sí, el dominio debe estar registrado públicamente, no solo un nombre de host local.

bortran
fuente
Los navegadores podrán manejar esto, si 10 no está disponible, recurrirá a 20. Seguramente depende de la aplicación y también debería haber un punto en el que verifique la disponibilidad, si desea evitar configurar algo más complicado y costoso con equilibrio de carga.
bortran
Alos registros no tienen un campo de prioridad. Algunos servicios de DNS autorizados tienen ponderación de registros, pero eso se hace al incluir o excluir probabilísticamente los registros.
Matt Nordhoff
0

Fácil de configurar, siga las instrucciones:

  1. instalar dnsmasq
  2. edite /etc/resolv.conf y establezca "nameserver 127.0.0.1" como primer DNS
  3. agregue DNS normal como alternativa (google one por ejemplo) "nameserver 8.8.8.8" como segunda línea
  4. asegúrese de que haya dos registros requeridos en su archivo / etc / hosts
  5. ahora verifique con un comando host abc.efg.datastore.com

    que debería responder dos registros con RR-DNS, de modo que si un nodo de la lista está inactivo, su aplicación se conectará a otro
Ihor Kolodyuk
fuente
1
La pila de IP verifica automáticamente el archivo de hosts antes de consultar DNS. Creo que es parte de la definición de IP, pero sé que Windows y Linux siguen este patrón. No necesita dnsmasq, y si cambia su /etc/resolv.conf de esta manera, perderá la conexión con su servidor DNS real.
Xalorous
no es cierto, puede poner varias líneas a resolv.conf para que la siguiente línea pueda ser "nameserver 8.8.8.8", por ejemplo, + nscd para almacenar en caché los registros existentes, este enfoque resuelve exactamente el problema que se describió
Ihor Kolodyuk
Eso no es lo que le dijiste que hiciera. Le dijiste que pusiera su servidor de nombres en bucle invertido. NO dijiste agregar loopback como servidor de nombres. Pero si el host no se ejecuta con el nombre, o incluso si lo está y no está escuchando en el bucle invertido, entonces las consultas DNS a esa dirección no serán respondidas. Simplemente agregar las direcciones al archivo de hosts permitirá que se resuelvan, pero si tienen el mismo nombre de host, solo se usará el primero y volveremos al principio. La respuesta está en configurar un host virtual en DNS con alias ponderados, o en el frente de la base de datos con un equilibrador de carga.
Xalorous
Eso es exactamente lo que le dije, dnsmasq está actuando como un proxy de servidor de nombres. Este enfoque funciona.
Ihor Kolodyuk