J'ai un serveur Web qui se connecte à une base de données interne via un VPN. Il existe 2 adresses IP (principale et secondaire) dans la base de données à partir du serveur Web. Comment puis-je configurer mon fichier/etc/hosts pour que si l'IP primaire n'est pas disponible, l'IP secondaire sera utilisée?
Est-ce que cela fonctionnerait pour mon fichier d'hôtes?
141.131.286.1 abc.efg.datastore.com #primary
141.131.286.237 abc.efg.datastore.com #secondary
Le fichier hosts ne fournit pas un tel mécanisme. Si vous répertoriez deux adresses IP pour le même nom, seule la première sera utilisée. Donc, il n'y a rien de tel que les IP primaires et secondaires.
En outre, le fichier hosts ne gère pas les URL. Il gère uniquement les noms comme ceux fournis dans la question. Une URL contient un chemin d'accès complet et un protocole tels que http://Host/path/to/resource
.
Vous ne pouvez pas fournir de résilience ou d'équilibrage de charge à tour de rôle via le /etc/hosts
fichier - il n'est pas conçu à cet effet.
Au lieu de cela, vos options sont ... (sans ordre particulier)
/ etc/hosts ne prend pas en charge le round robin mais vous pouvez écrire un simple script bash pour remplacer sed une entrée balisée par un commentaire #RoundRobin (ou toute autre balise que vous souhaitez utiliser, il suffit de la refléter dans la ligne grep du 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
Le script ci-dessus capture la sortie de nslookup pour sub.domain.com et la stocke dans un tableau. Il imprime ensuite la valeur la plus élevée dans $ new et récupère la valeur existante pour la balise #RoundRobin affectée dans/etc/hosts ... enfin, il effectue un remplacement sed
L'entrée du fichier/etc/hosts ressemblerait à ceci
127.0.0.1 localhost
::1 localhost
11.12.13.14 sub.domain.com #RoundRobin
Enfin, placez ce script dans la crontab de la racine pour l'exécuter toutes les heures environ et vous aurez maintenant un round-robin/etc/Host.
Cela est particulièrement utile si vous avez une page codée qui extrait des données d'une API et que la recherche DNS pour le serveur d'API entraîne beaucoup de temps d'arrêt dans l'exécution du script de la page ... entraînant une consommation élevée de CPU pour ce qui serait autrement semblent être une simple page. Pour éviter la recherche DNS coûteuse (en particulier si votre site en fait des centaines par minute pour un trafic important), vous devez utiliser/etc/hosts pour résoudre le nom de domaine complet du serveur d'API distant. Cela réduira considérablement l'utilisation du processeur pour extraire les données API et générer la page.
Facile à installer, veuillez suivre les instructions:
Oui, plusieurs adresses IP dans/etc/hosts fonctionnent. Exemple et test;
> echo "192.168.0.141 test
192.168.0.142 test
192.168.0.143 test" >> /etc/hosts
> Dig test +short
192.168.0.141
192.168.0.142
192.168.0.143
Cependant, le mécanisme de recherche fait simplement la liste jusqu'à ce qu'il trouve une correspondance.
Ainsi, alors que la réponse à la question telle qu'elle est écrite est OUI, cela va être un défi. Mais rien d'insurmontable.
Essayez ceci: chacune de ces adresses IP doit vraiment avoir des noms différents.
Un moyen simple d'y parvenir serait d'utiliser simplement un service DNS public, comme AWS Route53. Vous pouvez entrer plusieurs adresses IP par enregistrement A avec priorité
abc.efg.datastore.com
10 141.131.286.1
20 141.131.286.237
Tant qu'aucun certificat n'est impliqué, cela fonctionne et n'est même pas contraire aux normes ou aux meilleures pratiques.
NSLookup ou d'autres requêtes de domaine renverront les deux adresses. Votre application doit pouvoir gérer cela. Et oui, le domaine doit être enregistré publiquement, pas seulement un nom d'hôte local.
Notez qu'au moins sur macOS, contrairement à ce que disent les autres réponses, le résolveur système retournera toutes les entrées associées à un nom d'hôte dans/etc/hosts au lieu de s'arrêter au premier.