Призначте кілька IP-адрес на 1 запис у файлі хостів


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

Файл хостів не забезпечує такий механізм. Якщо ви перерахуєте два IP-адреси з тим самим іменем, буде використовуватися лише перший. Отже, не існує такого поняття, як первинні та вторинні ІС.

Також файл хостів не обробляє URL-адреси. Він просто обробляє назви, подібні до тих, які вказані в питанні. URL-адреса містить повний шлях і такий протокол, як http://host/path/to/resource.


Відредагований заголовок та найменування в ОП питання для усунення плутанини щодо URL-адрес / хостів.
dmourati

14

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

Натомість ваші варіанти ... (не в конкретному порядку)

  1. Налаштуйте мережу належним чином, щоб маршрути мінялися при відхиленні посилання
  2. Використовуйте балансування навантаження DNS-кругової машини (не хороша ідея TM ) за допомогою керованої послуги (наприклад, loaddns.com або dnsmadeeasy.com тощо)
  3. Використовуйте локальний балансир навантаження L3 для вихідного трафіку (HAProxy?) Із зворотними кінцями, визначеними за необхідності
  4. Зробіть стійкість у своєму веб-додатку

Збалансування навантаження круглоробочного навантаження DNS зазвичай не є стійким. Один вибирається, а інші не пробуються.
Antti Rytsölä Circles Consult

Іншим варіантом може бути використання netcat або іншого програмного забезпечення для пересилання зв'язку в IP. Потім змініть вперед, якщо втрачено одне IP.
Antti Rytsölä Circles Consult

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

Я сумніваюся, що це буде чудово працювати з базою даних. Вони мають тенденцію отримати один ІР та дотримуватися його. З іншого боку, веб-сайт працював би чудово.
Antti Rytsölä Circles Consult

Це залежало б від роздільної здатності хост-машини. Якщо для DNS-резолюції встановлено службу, що не кешує, - або запитує БД реєстраторів DNS безпосередньо, то це буде працювати. Але, як я вже сказав, це не дуже гарна ідея , це просто ідея .
Бен Лессані - Сонассі

3

/ 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

Нарешті, помістіть цей скрипт у коронну версію кореня, щоб він працював щогодини або близько того, і тепер у вас з'явиться / etc / host круглобітка.

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


Чи не буде керування ДНС полегшити ваш випадок сотень пошукових запитів на хвилину?
Xalorous

Я не контролюю DNS-сервер, це те, що я можу налаштувати на веб-сервері CentOS?
Саталінк


0

Так, спрацювало б.

Однак механізм пошуку просто робить список, поки не знайде відповідності.

Тож як відповідь на написане запитання - ТАК, це стане проблемою. Але нічого непереборного.

Спробуйте: Кожна з цих IP-адрес дійсно повинна мати різні імена.


1
Ні, це не спрацює. Друге виникнення значення в / etc / hosts ніколи не буде використовуватися. І якщо він перейменовує другу IP-адресу з іншим іменем хоста, тепер він повинен зробити щось у своєму додатку, щоб зробити балансування завантаження. Це буде дорого і неприємно, коли правильна відповідь DNS або DNS + Balancer Loader.
Xalorous

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 один) "сервер імен 8.8.8.8" як другий рядок
  4. переконайтеся, що два необхідні записи знаходяться у вашому / etc / hosts файлі
  5. тепер перевірте у хоста команд abc.efg.datastore.com,

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

1
IP стек автоматично перевіряє файл хостів перед тим, як звернутися до DNS. Я вважаю, що це частина визначення IP, але я знаю, що Windows і Linux дотримуються цієї схеми. Йому не потрібен dnsmasq, і якщо таким чином змінити /etc/resolv.conf, він втратить зв’язок зі своїм реальним сервером DNS.
Xalorous

неправда, він може поставити кілька рядків до reslav.conf, тому наступним рядком може бути "nameserver 8.8.8.8", наприклад, + nscd для кешування існуючих записів; такий підхід точно вирішує проблему, яку було описано
Ігор Колодюк

Це не те, що ти йому сказав. Ви сказали йому, щоб він встановив його сервер імен на циклічне відтворення. Ви НЕ сказали додати loopback як сервер імен. Але якщо хост не працює з ім'ям, або навіть якщо він є, і він не слухається при зворотному циклі, запити dns на цю адресу не відповідатимуть. Просто додавання адрес у файл хостів дозволить їх вирішити, але якщо вони будуть однаковими іменами хостів, буде використано лише перше, і ми повернемося на початку. Відповідь полягає у налаштуванні віртуального хоста в DNS із зваженими псевдонімами або в передачі бази даних з балансиром навантаження.
Xalorous

Саме це я йому сказав, dnsmasq виступає як проксі-сервер імен. Такий підхід працює.
Ігор Колодюк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.