DNS Round Robin: браузеры придерживаются одного IP, пока он онлайн?

14

Как ведет себя большинство браузеров, если они получают несколько A-записей с DNS-сервера? Придерживайтесь ли вы одного IP-адреса, пока он доступен (и используйте другой, только если IP-адрес не работает)? Или они переключаются все время без причины?

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

HiPerFreak
источник
1
Я не могу ответить на ваш вопрос напрямую, но я укажу вам, что вам приходится иметь дело с кэшированием как на уровне браузера, так и на уровне ОС! Веселитесь :)
SpacemanSpiff
1
@Iain - Потрясающая ссылка
SpacemanSpiff
Сколько машин у вас есть для бэкэнда? Если 2 машины с active-passive в порядке, получите третий IP-адрес и используйте heartbeat для переключения его между физическими машинами. В качестве альтернативы я думаю, что ultramonkey поддерживает присвоение бэкэндам на основе исходного IP-адреса, который практически идентичен одному клиенту. Вероятно, вы могли бы также что-то взломать, если бы каждый бэкэнд устанавливал уникальный куки-файл и имел прокси веб-сервера внешнего интерфейса для бэкэнда в зависимости от куки-файла. (Apache mod_rewrite, вероятно, может сделать это.)
Джон
Не существует единого правила, охватывающего все браузеры, поэтому, по крайней мере, вам нужно указать, какой из них / вас интересует.
John Gardeniers

Ответы:

7

У каждого браузера есть свой собственный метод обработки циклического DNS, я провел сегодня некоторое время, исследуя эту проблему, и буду продолжать обновлять свой ответ, когда найду подтверждение реализации, которое ограничит мои ответы браузерами, раскрывающими их поведение.

Гугл Хром

Google Chrome (используется v58) запросит все записи хоста для адреса (A, AAAA, CNAME) и поместит их в массив ( address_list ). Затем Chrome попытается открыть сокет на каждом IP-адресе в порядке от первого к последнему, Chrome не будет пытаться использовать самый быстрый или ближайший IP-адрес, он предполагает, что первый IP-адрес (предоставленный вашими исходящими средствами разрешения DNS) является лучшим IP-адресом. В моих тестах серверы bind и windows dns выделяли разные IP-адреса для каждого поиска, давая каждому 50-процентное разделение полосы пропускания. Эта функциональность выставлена ​​вchrome://net-internals/#events&q=type:SOCKET%20is:active

Curl (libcurl / 7.54.0)

У Curl также есть эта функция --connect-timeoutпереключения при отказе, но она намного длиннее, чем по умолчанию в Chrome, Chrome переключается сразу же, Curl - нет. Если вы используете libcurl и хотите выжить в циклическом экземпляре DNS, когда один IP-адрес не работает (работает в chrome, но не в коде), обязательно укажите это значение ниже.

DEFAULT_CONNECT_TIMEOUT: 0 заставил меня думать, что это невозможно с curl.

* After 149990ms connect time, move on!

В обоих браузерах IP не был привязан , они следовали TTL, заданному в DNS, и после истечения времени ttl (Chrome поддерживает это внутренне, запросы curl запрашиваются при каждом запросе), выбор ip выполняется каждый раз, как описано выше.

Что это значит? DNS-RR подходит для некоторых систем, но он не предназначен для восстановления после отказа. Следует ожидать, что все результаты поиска DNS являются (источником правды) действительными и доступными для обслуживания трафика. Существует много способов обеспечения доступности IP-адресов, таких как виртуальные плавающие IP-адреса, приемы BGP / Routing и т. Д. Используйте их .

Все тесты, выполненные только в среде IPv4, будут возвращаться с результатами с двумя стеками, как только будет доступно достаточно инфраструктуры для тестирования.

Я предполагаю, что эти изменения являются побочным эффектом Happy Eyeballs IPv6-Fallback RFC

Обновление Полезно учитывать, что DNS RR может помочь только с балансировкой нагрузки, а не со сбоями приложений, если у одного из ваших узлов 503, вы будете обслуживать 40-60%, если ваш трафик 503. Предполагается, что все перечисленные IP-адреса являются действительными рабочими конечными точками, если они достижимы.

Джейкоб Эванс
источник
2

редактировать: редактирование моего ответа, так как HiPerFreak обучил меня.

DNS-серверы вернут список всех записей A, которые он имеет для данного имени хоста. То, что входит в циклический перебор, заключается в том, что он вращается по порядку списка. Ссылка, размещенная на сайте, является отличным примером того, как веб-браузеры будут использовать этот список.

Round Robinning можно использовать для очень примитивной формы балансировки нагрузки, но это очень плохая замена для реальной балансировки нагрузки, так как если один из хостов в циклическом циклическом переключении выйдет из строя, DNS-сервер не будет мудрым и все равно поместите IP-адрес сбитого узла в список.

Райан Райс
источник
DNS-сервер всегда раздает ВСЕ адреса. Браузер - тот, кто решает, какой из них будет использован (как часто обсуждается здесь и в других местах). Также ОС передает все IP-адреса в браузер.
HiPerFreak
2
@HiPerFreak Часто встречающаяся конфигурация (особенно для большого количества A-записей) заключается в том, что DNS передает некоторые адреса (хотя и не все, обычно для того, чтобы убедиться, что они вписываются в пакет UDP объемом 512 байт и не несут ненужных накладных расходов). обычно в изменяющемся порядке.
the-wabbit
Я думал о 2 или 3 IP.
HiPerFreak
@HiPerFreak: Я просто хотел сказать, что вы правы в том, что DNS-сервер раздает все записи A при запросе имени, если существует несколько записей A для этого имени. У меня есть DNS-сервер, и я только что перехватил пакет с помощью Wireshark, пока я пинговал имя хоста для подтверждения. Спасибо - я сегодня кое-что узнал! :)
Райан Райс
2

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

Коротко - круговой робин днс вообще не улучшает доступность. Браузер выбирает один IP и придерживается его, даже если он не отвечает. (Проверено с FF и хромом).

По истечении срока действия DNS-кэша браузера имя хоста разрешается снова, и процесс повторяется, независимо от того, ответил IP или нет.

Для базового HA вы можете использовать динамический DNS или различные подходы на основе IP.

РЕДАКТИРОВАТЬ: Это поведение будет иметь место, когда недоступный хост действует как «черная дыра». Если вместо этого хост принудительно отклоняет входящие соединения, браузер попытается использовать один IP-адрес, получит отказ и сразу же использует другой IP-адрес, и, таким образом, он достаточно хорошо переключится.

Sandman4
источник
2
Возможно, это изменилось в последние годы, но я могу подтвердить, что после нескольких обновлений в Firefox, IP действительно меняется, хотя и не слишком часто. Возможно, этот ответ устарел?
Йети
Мое исследование (с 2015 года) заключается в том, что Chrome, Firefox и MSIE НЕ ведут себя так, как описывает Sandman4. MSIE заметно отличается тем, что ему требуется полный таймаут TCP перед попыткой подключения к следующему указанному адресу в случае сбоя первого.
Symcbean
0

Они переключают IP-адреса, это не отказоустойчивое решение.

Браузеры позволяют ОС разрешать имена, и, например, Linux всегда рандомизирует IP-адреса, попробуйте хост google.com несколько раз. IP будут приходить в случайном порядке.

Камень
источник
Почему они делают это случайно и без причины? Разве не имеет смысла повторно использовать интеллектуальный IP-адрес, пока он работает?
HiPerFreak
1
Это для балансировки нагрузки.
Камень
@HiPerFreak Смотри также: en.wikipedia.org/wiki/Round-robin_DNS
voretaq7
@HiPerFreak: Причина, по которой он не привязан к известным IP-адресам, заключается в том, что разрешение имен ничего не знает о том, работает этот IP сейчас или имеет в прошлом. Браузер не привязан к одному IP, потому что разрешение имен говорит ему использовать разные IP. :-)
Шон Рейфшнейдер
@Sean: Как уже говорилось в ответном ответе, разрешение имени дает браузеру ВСЕ IP-адреса, и браузер решает, какой из них использовать. И браузер знает, какие IP-адреса работали, а какие нет. Так что это не может быть причиной.
HiPerFreak
0

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

Laurent
источник