Назначить несколько 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 и создания страницы.

Satalink
источник
Разве DNS-кеширование не облегчит ваш случай сотен поисков в минуту?
Ксалори
Я не контролирую DNS-сервер, это то, что я могу настроить на веб-сервере CentOS?
Satalink
0

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

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

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

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

SDsolar
источник
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 или другие запросы домена вернут оба адреса. Ваше приложение должно быть в состоянии справиться с этим. И да, домен должен быть публично зарегистрированным, а не только локальным именем хоста.

bortran
источник
Браузеры смогут справиться с этим, если 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 действует как прокси сервера имен. Этот подход работает.
Игорь Колодюк