Przypisz wiele adresów IP do 1 wpisu w pliku hosts

29

Mam serwer internetowy, który łączy się z wewnętrzną bazą danych za pośrednictwem sieci VPN. Istnieją dwa adresy IP (pierwotny i wtórny) do bazy danych z serwera WWW. Jak mogę skonfigurować mój plik / etc / hosts, aby jeśli podstawowy adres IP był niedostępny, użyty zostanie drugi adres IP?

Czy to zadziała dla mojego pliku hosts?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary
Mike T.
źródło

Odpowiedzi:

26

Plik hosts nie zapewnia takiego mechanizmu. Jeśli podasz dwa adresy IP dla tej samej nazwy, użyty zostanie tylko pierwszy. Tak więc nie ma czegoś takiego jak pierwotne i wtórne adresy IP.

Ponadto plik hosts nie obsługuje adresów URL. Po prostu obsługuje nazwy takie jak te podane w pytaniu. Adres URL zawiera pełną ścieżkę i protokół, taki jak http://host/path/to/resource.

Khaled
źródło
Edytowany tytuł i nazewnictwo w pytaniach PO, aby wyeliminować nieporozumienia dotyczące adresów URL / hostów.
dmourati
14

Za pomocą /etc/hostspliku nie można zapewnić odporności lub równoważenia obciążenia za pomocą okrągłego robina - nie jest on przeznaczony do tego celu.

Zamiast tego masz do wyboru ... (w określonej kolejności)

  1. Skonfiguruj sieć poprawnie, aby trasy zmieniały się po zerwaniu łącza
  2. Korzystaj z równoważenia obciążenia round-robin DNS (nie A Good Idea TM ) przy użyciu usługi zarządzanej (np. Loaddns.com lub dnsmadeeasy.com itp.)
  3. Użyj lokalnego modułu równoważenia obciążenia L3 dla ruchu wychodzącego (HAProxy?) Z zapleczami zdefiniowanymi jako konieczne
  4. Zbuduj odporność na samą aplikację
Ben Lessani - Sonassi
źródło
Równoważenie obciążenia round-robin DNS zwykle nie jest odporne. Jeden jest wybrany, a inne nie są próbowane.
Antti Rytsölä Circles Consult Consult
Inną opcją może być użycie netcat lub innego oprogramowania do przekazania połączenia na adres IP. Następnie zmień naprzód, jeśli jedno IP zostanie utracone.
Antti Rytsölä Circles Consult Consult
1
@anttiR DNS RR sam nie ma odporności, ale jest używany przez zarządzanego dostawcę usług DNS. Zredagowałem swoje odpowiedzi i podałem kilka przykładów, aby były jaśniejsze.
Ben Lessani - Sonassi
Wątpię, czy zadziałałoby świetnie z bazą danych. Mają tendencję do pobierania jednego adresu IP i trzymania się go. Z drugiej strony strona internetowa działałaby świetnie.
Antti Rytsölä Circles Consult Consult
To zależy od resolvera komputera-hosta. Jeśli program rozpoznawania nazw DNS jest ustawiony jako usługa niebuforująca - lub bezpośrednio sonduje bazę danych rejestratorów DNS, to zadziała. Ale jak powiedziałem, to nie jest dobry pomysł , to tylko pomysł .
Ben Lessani - Sonassi
3

/ etc / hosts nie obsługuje round robin, ale możesz napisać prosty skrypt bash, aby zastąpić wpis oznaczony komentarzem #RoundRobin (lub dowolnym innym znacznikiem, którego chcesz użyć, po prostu odzwierciedl go w wierszu grep w skrypcie) .

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

Powyższy skrypt pobiera dane wyjściowe nslookup dla sub.domain.com i przechowuje je w tablicy. Następnie drukuje najwyższą wartość do $ new i pobiera istniejącą wartość dla tagu #RoundRobin przypisanego w / etc / hosts ... na koniec wykonuje zamianę sed

Wpis pliku / etc / hosts wyglądałby tak

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

Na koniec umieść ten skrypt w crontabie roota, aby uruchamiał się co około godzinę, a teraz będziesz mieć okrągły / robin / etc / host.

Jest to szczególnie przydatne, jeśli masz zakodowaną stronę, która pobiera niektóre dane z interfejsu API, a wyszukiwanie DNS dla serwera API powoduje długi czas oczekiwania na wykonanie skryptu strony ... co powoduje wysokie zużycie procesora w stosunku do tego, co inaczej wydają się być prostą stroną. Aby uniknąć kosztownego wyszukiwania DNS (szczególnie jeśli twoja witryna robi setki z nich na minutę, aby zrobić duży ruch), powinieneś użyć / etc / hosts, aby rozwiązać FQDN zdalnego serwera API. Znacząco zmniejszy to użycie procesora do pobierania danych API i generowania strony.

Satalink
źródło
Czy buforowanie DNS nie zmniejszyłoby liczby setek wyszukiwań na minutę?
Xalorous,
Nie kontroluję serwera DNS, czy to coś, co mogę skonfigurować na serwerze sieciowym CentOS?
Satalink
0

Tak, to by zadziałało.

Jednak mechanizm wyszukiwania po prostu idzie, robi listę, aż znajdzie dopasowanie.

Tak więc, chociaż odpowiedź na pytanie w formie pisemnej brzmi TAK, będzie to wyzwanie. Ale nic nie do pokonania.

Spróbuj tego: każdy z tych adresów IP naprawdę musi mieć różne nazwy.

SDsolar
źródło
1
Nie, to nie zadziała. Drugie wystąpienie wartości w / etc / hosts nigdy nie zostanie użyte. A jeśli zmieni nazwę drugiego adresu IP na inną nazwę hosta, teraz musi zrobić coś w swojej aplikacji, aby przeprowadzić równoważenie obciążenia. To będzie kosztowne i kłopotliwe, gdy DNS lub DNS + Load Balancer to właściwa odpowiedź.
Xalorous,
0

Łatwym sposobem na osiągnięcie tego byłoby po prostu skorzystanie z publicznej usługi DNS, takiej jak AWS Route53. Możesz wprowadzić wiele adresów IP na rekord A z priorytetem

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

Tak długo, jak nie są zaangażowane żadne certyfikaty, działa to i nie narusza nawet żadnych norm ani najlepszych praktyk.

NSLookup lub inne zapytania domeny zwrócą oba adresy. Twoja aplikacja musi sobie z tym poradzić. I tak, domena musi być domeną publicznie zarejestrowaną, a nie tylko lokalną nazwą hosta.

bortran
źródło
Przeglądarki będą w stanie sobie z tym poradzić, jeśli 10 nie jest dostępne, nastąpi powrót do 20. Z pewnością zależy to od aplikacji i powinien być również punkt, w którym sprawdzasz dostępność - jeśli chcesz obejść się z konfigurowaniem czegoś bardziej skomplikowanego i droga z równoważeniem obciążenia.
bortran
Arekordy nie mają pola pierwszeństwa. Niektóre autorytatywne usługi DNS mają ważenie rekordów, ale odbywa się to poprzez probabilistyczne włączenie lub wyłączenie rekordów.
Matt Nordhoff,
0

Łatwy w konfiguracji, postępuj zgodnie z instrukcją:

  1. zainstaluj dnsmasq
  2. edytuj /etc/resolv.conf i ustaw „nameserver 127.0.0.1” jako pierwszy DNS
  3. dodaj normalny DNS jako alternatywny (na przykład google) „nameserver 8.8.8.8” jako drugi wiersz
  4. upewnij się, że dwa wymagane rekordy znajdują się w pliku / etc / hosts
  5. teraz sprawdź za pomocą komendy host abc.efg.datastore.com,

    która powinna odpowiedzieć na dwa rekordy za pomocą RR-DNS, więc jeśli jeden węzeł z listy nie działa - Twoja aplikacja zostanie połączona z innym
Ihor Kolodyuk
źródło
1
Stos IP automatycznie sprawdza plik hosts przed skonsultowaniem się z DNS. Wierzę, że jest to część definicji IP, ale wiem, że zarówno Windows, jak i Linux stosują ten wzór. Nie potrzebuje dnsmasq, a jeśli zmieni w ten sposób swój plik /etc/resolv.conf, utraci połączenie ze swoim prawdziwym serwerem DNS.
Xalorous,
nie prawda, może wstawić wiele linii do resolv.conf, więc następną linią może być „nameserver 8.8.8.8”, na przykład + nscd do buforowania istniejących rekordów, to podejście dokładnie rozwiązuje problem, który został opisany
Ihor Kolodyuk
Nie tak mu kazałeś. Powiedziałeś mu, żeby ustawił jego serwer nazw na loopback. NIE powiedziałeś „dodaj pętlę zwrotną” jako serwer nazw. Ale jeśli host nie działa o nazwie, a nawet jeśli tak jest i nie nasłuchuje na sprzężeniu zwrotnym, zapytania dns na ten adres pozostaną bez odpowiedzi. Po prostu dodanie adresów do pliku hosts pozwoli na ich rozwiązanie, ale jeśli mają tę samą nazwę hosta, tylko pierwsza z nich zostanie użyta i wrócimy na początek. Odpowiedź polega na skonfigurowaniu wirtualnego hosta w DNS z ważonymi aliasami lub na przodzie bazy danych za pomocą modułu równoważenia obciążenia.
Xalorous,
Dokładnie to mu powiedziałem, dnsmasq działa jako serwer proxy serwera nazw. To podejście działa.
Ihor Kolodyuk