Назначить несколько IP-адресов для одной записи в файле hosts


29

У меня есть веб-сервер, который подключается к внутренней базе данных через VPN. В базе данных есть 2 IP-адреса (основной и дополнительный) с веб-сервера. Как я могу настроить свой файл / etc / hosts так, чтобы, если основной IP-адрес был недоступен, использовался дополнительный IP-адрес?

Будет ли это работать для моего файла хостов?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary

Ответы:


26

Файл hosts не предоставляет такой механизм. Если вы укажете два IP-адреса для одного и того же имени, будет использоваться только первый. Таким образом, не существует такой вещи, как первичные и вторичные IP-адреса.

Кроме того, файл hosts не обрабатывает URL-адреса. Он просто обрабатывает имена, подобные тем, которые указаны в вопросе. URL содержит полный путь и протокол, например http://host/path/to/resource.


Отредактированный заголовок и вопрос об именах в OPs, чтобы избежать путаницы относительно URL / хостов.
— dmourati

14

Вы не можете обеспечить устойчивость или циклическую балансировку нагрузки через /etc/hostsфайл - он не предназначен для этой цели.

Вместо этого ваши варианты ... (без определенного порядка)

  1. Правильно настройте свою сеть, чтобы при удалении ссылки маршруты изменялись
  2. Использовать циклическое распределение нагрузки DNS (не A Good Idea TM ) с использованием управляемой службы (например, loaddns.com или dnsmadeeasy.com и т. Д.)
  3. Используйте локальный балансировщик нагрузки L3 для исходящего трафика (HAProxy?) С серверными областями, определенными как необходимые
  4. Внедрите устойчивость в свое веб-приложение

Циклическая балансировка нагрузки DNS обычно не является устойчивой. Один выбран, а другие не пробовали.
— Antti Rytsölä Circles Consult 19.09.12

Другим вариантом может быть использование netcat или другого программного обеспечения для пересылки соединения по IP. Затем измените переадресацию, если один IP потерян.
— Antti Rytsölä Circles Consult 19.09.12

1
@anttiR DNS RR один не имеет устойчивости, но используется через управляемого поставщика услуг DNS. Я отредактировал свои ответы и привел несколько примеров, которые будут понятнее.
— Бен Лессани - Сонасси

Я сомневаюсь, что это будет прекрасно работать с базой данных. Они имеют тенденцию получать один IP и придерживаться его. Интернет-сайт, с другой стороны, будет отлично работать.
— Antti Rytsölä Circles Consult 19.09.12

Это будет зависеть от решателя хост-машины. Если DNS-преобразователь настроен как служба без кэширования или опрашивает базу данных DNS-регистраторов напрямую, он будет работать. Но, как я уже сказал, это не очень хорошая идея , это просто идея .
— Бен Лессани - Сонасси

3

/ etc / hosts не поддерживает циклический перебор, но вы можете написать простой скрипт bash, который заменяет запись, помеченную комментарием #RoundRobin (или любым другим тегом, который вы хотите использовать, просто отразите его в строке grep в сценарии) ,

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

Приведенный выше скрипт получает вывод nslookup для sub.domain.com и сохраняет его в массиве. Затем он печатает самое верхнее значение в $ new и извлекает существующее значение для тега #RoundRobin, назначенного в / etc / hosts ... и, наконец, выполняет sed-замену

Запись файла / etc / hosts будет выглядеть так

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

Наконец, поместите этот скрипт в crontab для запуска каждый час или около того, и теперь у вас будет / etc / host round-robin.

Это особенно полезно, если у вас есть закодированная страница, которая извлекает некоторые данные из API, и поиск DNS для сервера API вызывает много времени зависания при выполнении скрипта страницы ... что приводит к высокому потреблению ЦП для того, что в противном случае кажется простой страницей. Чтобы избежать дорогостоящего поиска DNS (особенно если ваш сайт выполняет сотни из них в минуту при интенсивном трафике), вы должны использовать / etc / hosts для разрешения полного доменного имени удаленного сервера API. Это значительно сократит использование ЦП для извлечения данных API и создания страницы.


Разве DNS-кеширование не облегчит ваш случай сотен поисков в минуту?
— Ксалори

Я не контролирую DNS-сервер, это то, что я могу настроить на веб-сервере CentOS?
— Satalink


0

Да, это будет работать.

Тем не менее, механизм поиска просто выполняет список, пока не найдет совпадение.

Таким образом, хотя ответ на поставленный вопрос - ДА, это будет вызов. Но ничего непреодолимого.

Попробуйте это: каждый из этих IP-адресов действительно должен иметь разные имена.


1
Нет, это не сработает. Второе вхождение значения в / etc / hosts никогда не будет использовано. И если он переименовывает второй IP-адрес с другим именем хоста, теперь он должен сделать что-то в своем приложении для балансировки нагрузки. Это будет дорогостоящим и трудным делом, когда DNS или DNS + Load Balancer - правильный ответ.
— Ксалори

0

Простой способ добиться этого - использовать общедоступную службу DNS, например AWS Route53. Вы можете ввести несколько IP-адресов для каждой записи с приоритетом

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

Пока сертификаты не задействованы, это работает и даже не противоречит каким-либо нормам или лучшим практикам.

NSLookup или другие запросы домена вернут оба адреса. Ваше приложение должно быть в состоянии справиться с этим. И да, домен должен быть публично зарегистрированным, а не только локальным именем хоста.


Браузеры смогут справиться с этим, если 10 недоступно, то будет откат на 20. Это, безусловно, зависит от приложения, и также должна быть точка, где вы должны проверить доступность - если вы хотите обойти настройку чего-то более сложного и дорого с балансировкой нагрузки.
— Бортран

Aзаписи не имеют поля приоритета. Некоторые авторитетные службы DNS имеют взвешивание записей, но это делается путем вероятностного включения или исключения записей.
— Мэтт Нордхофф

0

Простота установки, пожалуйста, следуйте инструкциям:

  1. установить dnsmasq
  2. отредактируйте /etc/resolv.conf и установите «nameserver 127.0.0.1» в качестве первого DNS
  3. добавить нормальный DNS в качестве альтернативы (например, google one) "nameserver 8.8.8.8" в качестве второй строки
  4. убедитесь, что в вашем файле / etc / hosts есть две необходимые записи
  5. Теперь проверьте с помощью команды host abc.efg.datastore.com,

    которая должна ответить на две записи с помощью RR-DNS, так что если один узел из списка не работает - ваше приложение будет подключено к другому.

1
Стек IP автоматически проверяет файл hosts перед обращением к DNS. Я считаю, что это часть определения IP, но я знаю, что Windows и Linux следуют этой схеме. Ему не нужен dnsmasq, и если он таким образом изменит свой /etc/resolv.conf, он потеряет соединение со своим настоящим DNS-сервером.
— Ксалори

это не так, он может поместить несколько строк в resolv.conf, так что следующей строкой может быть «nameserver 8.8.8.8», например, + nscd для кэширования существующих записей, этот подход точно решает проблему, которая была описана
— Игорь Колодюк

Это не то, что вы сказали ему сделать. Вы сказали ему установить свой сервер имен в петлю. Вы НЕ сказали добавить петлю в качестве сервера имен. Но если хост не работает по имени, или даже если это так, и он не прослушивает обратную связь, то DNS-запросы на этот адрес останутся без ответа. Простое добавление адресов в файл hosts позволит разрешить их, но если у них одинаковое имя хоста, будет использовано только первое, и мы вернемся в начало. Ответ заключается в настройке виртуального хоста в DNS с взвешенными псевдонимами или в обращении к базе данных с помощью балансировщика нагрузки.
— Ксалори

Это именно то, что я сказал ему, dnsmasq действует как прокси сервера имен. Этот подход работает.
— Игорь Колодюк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.