У меня есть веб-сервер, который подключается к внутренней базе данных через 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
файл - он не предназначен для этой цели.
Вместо, ваши варианты ... (в произвольном порядке)
/ 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 и создания страницы.
Простота настройки, следуйте инструкциям:
Простой способ добиться этого - просто использовать общедоступную службу 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