Assegna più IP a 1 Voce nel file hosts


29

Ho un server Web che si collega a un database interno tramite una VPN. Esistono 2 IP (primari e secondari) per il database dal server web. Come posso impostare il mio file / etc / hosts in modo che se l'IP primario non è disponibile, verrà utilizzato l'IP secondario?

Funzionerebbe con il mio file hosts?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary

Risposte:


26

Il file hosts non fornisce tale meccanismo. Se si elencano due IP con lo stesso nome, verrà utilizzato solo il primo. Quindi, non esistono IP primari e secondari.

Inoltre, il file hosts non gestisce gli URL. Gestisce solo nomi come quelli forniti nella domanda. Un URL contiene percorso e protocollo completi come http://host/path/to/resource.


Titolo modificato e denominazione nella domanda di OP per eliminare la confusione su URL / host.
dmourati,

14

Non è possibile fornire resilienza o bilanciamento del carico round robin tramite il /etc/hostsfile: non è progettato a tale scopo.

Invece , le tue opzioni sono ... (in nessun ordine particolare)

  1. Configura correttamente la tua rete, in modo tale che i percorsi cambino quando viene eliminato un collegamento
  2. Utilizzare il bilanciamento del carico DNS round robin (non A Good Idea TM ) utilizzando un servizio gestito (ad es. Loaddns.com o dnsmadeeasy.com ecc.)
  3. Utilizzare un bilanciamento del carico L3 locale per il traffico in uscita (HAProxy?) Con i back-end definiti come necessari
  4. Sviluppa la resilienza nella tua stessa applicazione web

Il bilanciamento del carico DNS round robin non è in genere resiliente. Uno è selezionato e altri non sono stati provati.
Antti Rytsölä Circles Consult,

Un'altra opzione potrebbe essere quella di utilizzare netcat o un altro software per inoltrare la connessione a un IP. Quindi modificare l'inoltro se si perde un IP.
Antti Rytsölä Circles Consult,

1
@anttiR DNS RR da solo non ha resilienza, ma lo fa tramite un provider di servizi DNS gestito. Ho modificato le mie risposte e fornito alcuni esempi per essere più chiari.
Ben Lessani - Sonassi,

Dubito che funzionerebbe benissimo con il database. Hanno la tendenza a recuperare un IP e attenersi ad esso. D'altra parte un sito Web funzionerebbe alla grande.
Antti Rytsölä Circles Consult,

Ciò dipenderebbe dal risolutore della macchina host. Se il resolver DNS è impostato per essere un servizio senza memorizzazione nella cache o esegue il polling del DB di registrar DNS direttamente, funzionerebbe. Ma come ho detto, non è una buona idea , è solo un'idea .
Ben Lessani - Sonassi,

3

/ etc / hosts non supporta round robin ma puoi scrivere un semplice script bash per sostituire una voce taggata con un commento #RoundRobin (o qualsiasi altro tag che desideri utilizzare, riflettilo nella riga grep nello script) .

#!/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

Lo script sopra prende l'output di nslookup per sub.domain.com e lo memorizza in un array. Quindi stampa il valore più alto su $ new e prende il valore esistente per il tag #RoundRobin assegnato in / etc / hosts ... infine, esegue una sostituzione sost

La voce del file / etc / hosts sarebbe simile a questa

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

Infine, posiziona questo script nel crontab di root per eseguirlo ogni ora circa e ora avrai un round robin / etc / host.

Ciò è particolarmente utile se si dispone di una pagina codificata che sta estraendo alcuni dati da un'API e la ricerca DNS per il server API sta causando molto tempo di sospensione nell'esecuzione dello script della pagina ... con conseguente elevato consumo di CPU per ciò che altrimenti sembra essere una pagina semplice. Per evitare la costosa ricerca DNS (in particolare se il tuo sito ne fa centinaia al minuto per traffico intenso), dovresti usare / etc / hosts per risolvere il nome FQDN del server API remoto. Ciò ridurrà drasticamente l'utilizzo della CPU per estrarre i dati API e generare la pagina.


La memorizzazione nella cache DNS non allevierebbe il tuo caso di centinaia di ricerche al minuto?
Xalorous,

Non controllo il server DNS, è qualcosa che posso impostare sul server web CentOS?
Satalink,


0

Sì, funzionerebbe.

Tuttavia, il meccanismo di ricerca fa semplicemente l'elenco finché non trova una corrispondenza.

Quindi, mentre la risposta alla domanda scritta è SÌ, sarà una sfida. Ma niente di insormontabile.

Prova questo: ognuno di quegli indirizzi IP deve davvero avere nomi diversi.


1
No, non funzionerà. La seconda occorrenza di un valore in / etc / hosts non verrebbe mai utilizzata. E se rinomina il secondo indirizzo IP con un nome host diverso, ora deve fare qualcosa nella sua app per eseguire il bilanciamento del carico. Sarà costoso e un kludge, quando DNS o DNS + Load Balancer è la risposta giusta.
Xalorous,

0

Un modo semplice per ottenere questo risultato sarebbe semplicemente usare un servizio DNS pubblico, come AWS Route53. È possibile inserire più indirizzi IP per record A con priorità

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

Fintanto che non sono coinvolti certificati, questo funziona e non è neppure contro le norme o le migliori pratiche.

NSLookup o altre query di dominio restituiranno entrambi gli indirizzi. La tua app deve essere in grado di gestirla. E sì, il dominio deve essere registrato pubblicamente, non solo un nome host locale.


I browser saranno in grado di gestirlo, se 10 non è disponibile tornerà su 20. Dipende sicuramente dall'app e dovrebbe esserci anche il punto in cui si controlla la disponibilità - se si vuole aggirare la configurazione di qualcosa di più complicato e costoso con bilanciamento del carico.
Bortran,

Ai record non hanno un campo prioritario. Alcuni servizi DNS autorevoli hanno una ponderazione dei record, ma ciò avviene includendo o escludendo probabilisticamente i record.
Matt Nordhoff,

0

Facile da configurare, seguire le istruzioni:

  1. installa dnsmasq
  2. modifica /etc/resolv.conf e imposta "nameserver 127.0.0.1" come primo DNS
  3. aggiungi DNS normale come alternativa (google one per esempio) "nameserver 8.8.8.8" come seconda riga
  4. assicurati che due record richiesti siano nel tuo file / etc / hosts
  5. ora controlla con un host di comando abc.efg.datastore.com

    che dovrebbe rispondere a due record con RR-DNS, quindi se un nodo dall'elenco è inattivo, l'applicazione verrà connessa a un altro

1
Lo stack IP controlla automaticamente il file host prima di consultare il DNS. Credo che faccia parte della definizione IP, ma so che sia Windows che Linux seguono questo schema. Non ha bisogno di dnsmasq, e se cambia il suo /etc/resolv.conf in questo modo, perderà la connessione al suo vero server DNS.
Xalorous,

non è vero, può inserire più righe in resolv.conf in modo che la riga successiva possa essere "nameserver 8.8.8.8", ad esempio + nscd per la memorizzazione nella cache dei record esistenti, questo approccio risolve esattamente il problema descritto
Ihor Kolodyuk del

Non è quello che gli hai detto di fare. Gli hai detto di impostare il suo nameserver su loopback. NON hai detto di aggiungere loopback come nameserver. Ma se l'host non è in esecuzione con nome, o anche se lo è e non è in ascolto su loopback, allora le query DNS a quell'indirizzo saranno senza risposta. La semplice aggiunta degli indirizzi al file hosts consentirà di risolverli, ma se hanno lo stesso nome host, verrà utilizzato solo il primo e siamo di nuovo all'inizio. La risposta è nell'impostazione di un host virtuale in DNS con alias ponderati o nel fronting del database con un bilanciamento del carico.
Xalorous,

Questo è esattamente quello che gli ho detto, dnsmasq agisce come proxy del nameserver. Questo approccio funziona.
Ihor Kolodyuk,
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.