Назад | Перейти на главную страницу

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

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

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

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary

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

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

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

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

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

/ etc / hosts не поддерживает циклический перебор, но вы можете написать простой сценарий bash, чтобы sed заменить запись, помеченную комментарием #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.

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

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

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

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

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

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

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

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

Обратите внимание, что, по крайней мере, в macOS, вопреки тому, что говорят другие ответы, системный преобразователь вернет все записи, связанные с именем хоста в / etc / hosts, вместо того, чтобы останавливаться на первом.

Да, это сработает.

Однако механизм поиска просто просматривает список, пока не найдет совпадение.

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

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

Да, несколько IP-адресов в / etc / hosts работают. Пример и тест;

> 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