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

Отработка отказа DNS на основе браузера с использованием нескольких записей A

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

Итак, я попробовал проверить это:

  1. Я загрузил страницу из нашего домена
  2. Отметил, какой из наших серверов обслуживал страницу
  3. Выключил веб-сервер на этом хосте
  4. Перезагрузил страницу

И действительно, браузер автоматически пытался загрузить страницу с другого сервера. Это работало в Opera, Safari, IE и Firefox. Только Chrome не смог попробовать другой сервер.

Но оставив этот сервер в автономном режиме на несколько минут и просмотрев журналы доступа, я обнаружил, что количество запросов к другим серверам существенно не увеличилось. Когда 1 из 3 серверов отключен, я ожидал, что доступ к каждому из оставшихся 2 серверов увеличится примерно на 50%, но вместо этого я увидел только 7-10%. Это может означать только то, что отказоустойчивый DNS в браузере не работает для большинства браузеров / посетителей, что прямо противоречит тому, что я только что протестировал.

Кто-нибудь знает, что происходит с отказоустойчивым поведением браузеров DNS? Какая возможная причина может быть, почему автоматическое переключение при отказе работает для меня, но не для большинства наших посетителей?

изменить: Чтобы пояснить, я сделал абсолютно без изменений в наши настройки DNS; здесь нет проблемы TTL или распространения, все дело в том, как клиент обрабатывает несколько записей A.

Хорошо, я собираюсь начать с того, что DNS никоим образом не является хорошей системой аварийного переключения, вам нужен обратный прокси-сервер или балансировщик нагрузки. Есть несколько причин, почему опыт не такой. Прежде всего, в Chrome он использует ОС для получения информации DNS, так что IP-адреса зависят от ОС, поэтому ОС в этом случае может дать ей только один IP.

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

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

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

Для меня это отличное решение, если вы не хотите платить за дорогие балансировщики нагрузки. См. Мой ответ о том, как с этим справляется браузеры: https://serverfault.com/a/868535/114520

Теперь, к вашему сведению, как вы отслеживали accesses? Был ли он размером с какой-то access_log? Было ли это количество запросов в секунду на вашем веб-сервере?

Возможно, у вас есть какое-то решение для кеширования на веб-сервере, которое не попадет на ваш динамический сервер (PHP, Java ...), если запрос уже находится в кеше. Чем больше серверов, тем больше запросов перед кешированием (если они не используют общий кеш).

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

Я много лет использую и использую эту установку с удовольствием. Я только добавил еще несколько решений для аварийного переключения:

  • Круговой алгоритм на 2 или 3 узлах
  • каждый узел имеет:
    • Лак с директором / пробниками на все бэкенды
    • lighttpd (подойдет Apache или nginx!) на другом порту с fastcgi
    • Пул PHP-FPM

Если один PHP-FPM выйдет из строя, зонд Varnish откажет и удалит бэкэнд, пока зонд снова не станет исправным. Если Varnish не работает, браузер Round-Robin + обработает изменение для другого узла.

Браузеры обычно довольно агрессивно пытаются использовать альтернативные записи, когда одна из них не отвечает.

Пара вещей:

  1. Ваша проблема с Chrome может быть связана с тем, как он кэширует DNS - он выполняет свое собственное кеширование и довольно агрессивен в этом отношении; могла ли она потенциально иметь кешированную запись до того, как у вас было несколько записей A?
  2. Точно так же вы ждали хотя бы TTL зоны DNS после добавления дополнительных записей для проверки пользователей, входящих извне?
  3. Также убедитесь, что нагрузка между серверами была равномерной; если на один сервер приходилось только 10% трафика, то можно было бы ожидать лишь умеренного увеличения на другом узле, когда он умирает.

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