it-swarm.com.de

Weisen Sie 1 Eintrag in der Hosts-Datei mehrere IPs zu

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
30
Mike T

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.

Außerdem verarbeitet die Hosts-Datei keine URLs. Es werden nur Namen behandelt, wie sie in der Frage angegeben sind. Eine URL enthält einen vollständigen Pfad und ein Protokoll wie http://Host/path/to/resource.

25
Khaled

Über die Datei /etc/hosts Können Sie keine Ausfallsicherheit oder Round-Robin-Lastausgleich bereitstellen - sie ist nicht für diesen Zweck konzipiert.

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

  1. Konfigurieren Sie Ihr Netzwerk ordnungsgemäß, sodass sich die Routen ändern, wenn eine Verbindung unterbrochen wird
  2. Verwenden Sie den DNS-Round-Robin-Lastausgleich (keine gute Idee TM) Verwenden 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 Backends nach Bedarf definiert sind
  4. Bauen Sie die Ausfallsicherheit in Ihre Webanwendung selbst ein
14

/ etc/hosts unterstützt kein Round Robin, aber Sie können ein einfaches Bash-Skript schreiben, um einen Eintrag zu ersetzen, der mit einem # RoundRobin-Kommentar markiert ist (oder ein anderes Tag, das Sie verwenden möchten, spiegeln Sie es einfach in der grep-Zeile im Skript 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 gedruckt und der vorhandene Wert für das in # etc/hosts zugewiesene Tag #RoundRobin ermittelt. Zuletzt wird ein sed-Austausch durchgeführt

Der Dateieintrag/etc/hosts würde so 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, damit es ungefähr jede Stunde ausgeführt wird, und Sie haben jetzt ein/etc/Host-Round-Robin.

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

3
Satalink

Einfach einzurichten, folgen Sie bitte den Anweisungen:

  1. installiere dnsmasq
  2. bearbeiten Sie /etc/resolv.conf und legen Sie "Nameserver 127.0.0.1" als ersten DNS fest
  3. fügen Sie alternativ normales DNS hinzu (z. B. 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

    , die zwei Einträge mit RR-DNS beantworten sollen. Wenn also ein Knoten aus der Liste ausgefallen ist, wird Ihre Anwendung mit einem anderen verbunden
1
Ihor Kolodyuk

Ja, mehrere IPs in/etc/hosts funktionieren. Beispiel und 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
0
user1133275

Ja, es würde funktionieren.

Der Suchmechanismus führt jedoch einfach die Liste durch, bis eine Übereinstimmung gefunden wird.

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

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

0
SDsolar

Eine einfache Möglichkeit, dies zu erreichen, besteht darin, nur einen öffentlichen DNS-Dienst wie AWS Route53 zu verwenden. Sie können mehrere A-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 nicht einmal 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.

0
bortran

Beachten Sie, dass der System-Resolver zumindest unter macOS im Gegensatz zu den anderen Antworten alle Einträge zurückgibt, die einem Hostnamen in/etc/hosts zugeordnet sind, anstatt beim ersten anzuhalten.

0
zneak