Weisen Sie 1 Eintrag in der Hosts-Datei mehrere IP-Adressen zu

29

Ich habe einen Web-Server, der über ein VPN eine Verbindung zu einer internen Datenbank herstellt. Es gibt 2 IPs (primäre und sekundäre) für die Datenbank vom Webserver. Wie kann ich meine Datei / etc / hosts so einrichten, dass die sekundäre IP verwendet wird, wenn die primäre IP nicht verfügbar ist?

Würde dies für meine Hosts-Datei funktionieren?

141.131.286.1   abc.efg.datastore.com   #primary

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

Antworten:

26

Die hosts-Datei bietet keinen solchen Mechanismus. Wenn Sie zwei IPs mit demselben Namen auflisten, wird nur die erste verwendet. Es gibt also keine primären und sekundären IPs.

Die Hosts-Datei verarbeitet auch keine URLs. Es behandelt nur Namen wie die in der Frage angegebenen. Eine URL enthält vollständigen Pfad und Protokoll wie http://host/path/to/resource.

Khaled
quelle
Der Titel und die Benennung in der OPs-Frage wurden bearbeitet, um die Verwirrung über URLs / Hosts zu beseitigen.
Dmourati
14

Sie können keine Ausfallsicherheit oder einen Round-Robin-Lastenausgleich über die /etc/hostsDatei bereitstellen - sie wurde nicht für diesen Zweck entwickelt.

Stattdessen sind Ihre Optionen ... (in keiner bestimmten Reihenfolge)

  1. Konfigurieren Sie Ihr Netzwerk ordnungsgemäß, damit sich die Routen ändern, wenn eine Verbindung getrennt wird
  2. Verwenden Sie DNS-Round-Robin-Lastenausgleich (keine gute Idee TM) ) mithilfe eines verwalteten Dienstes (z. B. loaddns.com oder dnsmadeeasy.com usw.).
  3. Verwenden Sie einen lokalen L3-Load-Balancer für den ausgehenden Datenverkehr (HAProxy?), Wobei die Back-Ends nach Bedarf definiert werden
  4. Bauen Sie die Ausfallsicherheit in Ihre Webanwendung selbst ein
Ben Lessani - Sonassi
quelle
DNS-Round-Robin-Lastenausgleich ist normalerweise nicht ausfallsicher. Eine ist ausgewählt und andere werden nicht ausprobiert.
Antti Rytsölä Circles Consult 19.09.12
Eine andere Möglichkeit besteht darin, Netcat oder eine andere Software zu verwenden, um die Verbindung an eine IP weiterzuleiten. Ändern Sie dann die Weiterleitung, wenn eine IP verloren geht.
Antti Rytsölä Circles Consult 19.09.12
1
@anttiR DNS RR allein hat keine Ausfallsicherheit, wird jedoch über einen verwalteten DNS-Dienstanbieter verwendet. Ich habe meine Antworten bearbeitet und einige Beispiele angegeben, um sie klarer darzustellen.
Ben Lessani - Sonassi
Ich bezweifle, dass es mit Datenbank großartig funktionieren würde. Sie haben die Tendenz, eine IP zu holen und dabei zu bleiben. Ein Internetauftritt hingegen würde prima funktionieren.
Antti Rytsölä Circles Consult
Das würde vom Resolver des Hostcomputers abhängen. Wenn der DNS-Resolver auf einen Nicht-Caching-Dienst eingestellt ist oder die DNS-Registrierungsdatenbank direkt abruft, funktioniert dies. Aber wie gesagt, es ist keine gute Idee , es ist nur eine Idee .
Ben Lessani - Sonassi
3

/ etc / hosts unterstützt kein Round-Robin, aber Sie können ein einfaches Bash-Skript schreiben, um einen mit einem # RoundRobin-Kommentar gekennzeichneten Eintrag zu ersetzen (oder ein anderes Tag, das Sie verwenden möchten, spiegeln Sie es einfach in der grep-Zeile des Skripts wider). .

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

Das obige Skript erfasst die Ausgabe von nslookup für sub.domain.com und speichert sie in einem Array. Anschließend wird der höchste Wert in $ new ausgegeben und der vorhandene Wert für das in / etc / hosts zugewiesene Tag #RoundRobin abgerufen. Zuletzt wird ein sed replace ausgeführt

So würde der Eintrag in der Datei / etc / hosts aussehen

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

Zuletzt platzieren Sie dieses Skript in der crontab des Roots, um es jede Stunde oder so auszuführen und Sie haben jetzt ein Round-Robin / etc / host.

Dies ist besonders nützlich, wenn Sie eine codierte Seite haben, die einige Daten von einer API abruft und die DNS-Suche nach dem API-Server viel Zeit in der Skriptausführung der Seite blockiert. Dies führt zu einem hohen CPU-Verbrauch scheint eine einfache Seite zu sein. Um die kostspielige DNS-Suche zu vermeiden (insbesondere wenn Ihre Site Hunderte davon pro Minute für hohen Datenverkehr ausführt), sollten Sie / etc / hosts verwenden, um den vollqualifizierten Domänennamen des Remote-API-Servers aufzulösen. Dadurch wird die CPU-Auslastung zum Abrufen der API-Daten und zum Generieren der Seite drastisch reduziert.

Satalink
quelle
Würde nicht DNS-Caching Ihren Fall von Hunderten von Suchvorgängen pro Minute lindern?
Xalorous
Ich kontrolliere den DNS-Server nicht. Kann ich das auf dem CentOS-Webserver einrichten?
Satalink
0

Ja, das würde funktionieren.

Der Suchmechanismus durchsucht die Liste jedoch einfach, bis eine Übereinstimmung gefunden wird.

Während die Antwort auf die Frage wie geschrieben JA lautet, wird es eine Herausforderung sein. Aber nichts unüberwindliches.

Versuchen Sie Folgendes: Jede dieser IP-Adressen muss unterschiedliche Namen haben.

SDsolar
quelle
1
Nein, es wird nicht funktionieren. Das zweite Vorkommen eines Wertes in / etc / hosts würde niemals verwendet. Und wenn er die zweite IP-Adresse mit einem anderen Hostnamen umbenennt, muss er jetzt etwas in seiner App tun, um den Lastenausgleich durchzuführen. Das wird teuer und umständlich, wenn DNS oder DNS + Load Balancer die richtige Antwort sind.
Xalorous
0

Eine einfache Möglichkeit, dies zu erreichen, besteht darin, einen öffentlichen DNS-Dienst wie AWS Route53 zu verwenden. Sie können mehrere IP-Adressen pro A-Datensatz mit Priorität eingeben

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

Solange keine Zertifikate beteiligt sind, funktioniert dies und verstößt afaik auch nicht gegen Normen oder Best Practices.

NSLookup oder andere Domänenabfragen geben beide Adressen zurück. Ihre App muss damit umgehen können. Und ja, die Domain muss öffentlich registriert sein, nicht nur ein lokaler Hostname.

bortran
quelle
Browser werden damit umgehen können, wenn 10 nicht verfügbar sind, wird es auf 20 zurückgreifen. Dies hängt sicherlich von der App ab und es sollte auch der Punkt sein, an dem Sie die Verfügbarkeit überprüfen - wenn Sie etwas Komplizierteres einrichten möchten und teuer mit Lastausgleich.
Bortran
ADatensätze haben kein Prioritätsfeld. Einige autorisierende DNS-Dienste haben eine Datensatzgewichtung, dies erfolgt jedoch durch probabilistisches Einschließen oder Ausschließen der Datensätze.
Matt Nordhoff
0

Einfach einzurichten, folgen Sie bitte den Anweisungen:

  1. Installieren Sie DNSMASQ
  2. editiere /etc/resolv.conf und setze "nameserver 127.0.0.1" als ersten DNS
  3. füge als Alternative normales DNS hinzu (zum Beispiel google one) "nameserver 8.8.8.8" als zweite Zeile
  4. Stellen Sie sicher, dass sich zwei erforderliche Datensätze in Ihrer Datei / etc / hosts befinden
  5. Überprüfen Sie jetzt mit einem Befehl host abc.efg.datastore.com,

    dass zwei Einträge mit RR-DNS beantwortet werden sollen. Wenn also ein Knoten aus der Liste ausgefallen ist, wird Ihre Anwendung mit einem anderen verbunden
Ihor Kolodyuk
quelle
1
Der IP-Stack prüft die Hosts-Datei automatisch, bevor DNS abgefragt wird. Ich glaube, es ist Teil der IP-Definition, aber ich weiß, dass sowohl Windows als auch Linux diesem Muster folgen. Er benötigt dnsmasq nicht und wenn er seine /etc/resolv.conf auf diese Weise ändert, verliert er die Verbindung zu seinem realen DNS-Server.
Xalorous
nicht wahr, er kann mehrere Zeilen in die resolv.conf schreiben, so dass die nächste Zeile "nameserver 8.8.8.8" sein kann, zum Beispiel + nscd zum Zwischenspeichern vorhandener Datensätze. Dieser Ansatz löst genau das beschriebene Problem
Ihor Kolodyuk 21.12.18
Das hast du ihm nicht gesagt. Sie haben ihm gesagt, dass er seinen Nameserver auf Loopback setzen soll. Sie haben NICHT gesagt, dass Sie Loopback als Nameserver hinzufügen. Wenn der Host jedoch nicht mit dem Namen "named" ausgeführt wird oder auch nur mit "loopback", werden DNS-Abfragen an diese Adresse nicht beantwortet. Durch einfaches Hinzufügen der Adressen zur Hosts-Datei können sie aufgelöst werden. Wenn sie jedoch denselben Hostnamen haben, wird immer nur der erste verwendet, und wir befinden uns wieder am Anfang. Die Antwort besteht darin, einen virtuellen Host in DNS mit gewichteten Aliasen einzurichten oder die Datenbank mit einem Lastenausgleich zu versehen.
Xalorous
Genau das habe ich ihm gesagt, dass dnsmasq als Nameserver-Proxy fungiert. Dieser Ansatz funktioniert.
Ihor Kolodyuk