Что такое DNS Round robin?

Статья описывает одну из технологий балансировки нагрузки, которая может быть реализована средствами DNS.

Теория

Для перевода имени хоста в IP-адрес клиент DNS направляет серверу DNS рекурсивный запрос (т.е. запрос, на который сервер DNS возвращает клиенту либо ответ с IP адресом, либо ответ с ошибкой).

В подавляющем большинстве случаев в зонах DNS содержится только один IP адрес, соответствующий тому или иному имени хоста. А какой IP адрес будет возвращать клиенту сервер DNS, если зона содержит несколько записей типа A для одного и того же имени? Ответ простой: сервер DNS всегда возвращает клиенту все IP адреса, соответствующие запрашиваемому имени. А дальше клиент пытается связаться с первым IP адресом в списке и, если он не будет найден, делает попытку связаться со вторым адресом и т.д.

Предположим, у меня есть несколько зеркальных веб-сайтов по имени www.gorbunov.pro, расположенных на разных площадках и имеющих IP адреса 20.0.0.1, 30.0.0.1 и 40.0.0.1.

В ответ на рекурсивный запрос клиента об имени www.gorbunov.pro сервер DNS вернет клиенту весь набор записей из зоны:

www.gorbunov.pro 20.0.0.1
www.gorbunov.pro 30.0.0.1
www.gorbunov.pro 40.0.0.1

Поскольку адрес 20.0.0.1 идет первым в списке, клиент всегда будет пытаться связаться именно с сайтом по адресу 20.0.0.1. Получается, что сайты 30.0.0.1 и 40.0.0.1 используются только как пассивный резерв. До тех пор, пока "жив" сайт по адресу 20.0.0.1, сайты 30.0.0.1 и 40.0.0.1 не получат от клиента ни одного запроса.

Как сделать, чтобы запросы “доставались” всем хостам? Ответ простой: настроить на сервере DNS функцию Round robin.

При включенной функции Round robin сервер DNS постоянно "перемешивает" ответы клиентам, поэтому на первый запрос клиента DNS об имени www.gorbunov.pro сервер DNS вернет ответ

www.gorbunov.pro 20.0.0.1
www.gorbunov.pro 30.0.0.1
www.gorbunov.pro 40.0.0.1

На второй запрос от клиента или от другого сервера DNS будет возвращен ответ

www.gorbunov.pro 30.0.0.1
www.gorbunov.pro 40.0.0.1
www.gorbunov.pro 20.0.0.1

На третий запрос будет ответ

www.gorbunov.pro 40.0.0.1
www.gorbunov.pro 20.0.0.1
www.gorbunov.pro 30.0.0.1

В результате мы получаем динамическую балансировку запросов клиентов между несколькими хостами.

Практика

Проверка работы DNS Round robin

В Windows Server опция Enable round robin включена по умолчанию. Достаточно в консоли DNS Manager открыть свойства DNS сервера и посмотреть вкладку Advanced.

image

Для практической проверки функционала DNS Round robin создаем зону gorbunov.pro и добавляем в нее три записи для хоста www.

image

Если вы попробуете теперь “попинговать” хост www.gorbunov.pro, то с удивлением обнаружите, что клиент все время отправляет пакеты на адрес 20.0.0.1 (выделено красным). Понятно, что ответа от хоста нет, но и DNS Round robin не работает!
Sad smile

C:\>ping www.gorbunov.pro

Pinging www.gorbunov.pro [20.0.0.1] with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 20.0.0.1:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:\>ping www.gorbunov.pro

Pinging www.gorbunov.pro [20.0.0.1] with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 20.0.0.1:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:\>

Анализ кэша DNS на стороне клиента дает следующий результат:

C:\>ipconfig /displaydns

Windows IP Configuration

    www.gorbunov.pro
    ----------------------------------------
    Record Name . . . . . : www.gorbunov.pro
    Record Type . . . . . : 1
    Time To Live  . . . . : 3567
    Data Length . . . . . : 4
    Section . . . . . . . : Answer
    A (Host) Record . . . : 20.0.0.1


    Record Name . . . . . : www.gorbunov.pro
    Record Type . . . . . : 1
    Time To Live  . . . . : 3567
    Data Length . . . . . : 4
    Section . . . . . . . : Answer
    A (Host) Record . . . : 30.0.0.1


    Record Name . . . . . : www.gorbunov.pro
    Record Type . . . . . : 1
    Time To Live  . . . . : 3567
    Data Length . . . . . : 4
    Section . . . . . . . : Answer
    A (Host) Record . . . : 40.0.0.1

C:\>

Теперь становится понятно, почему мы “пингуем” один и тот же хост 20.0.0.1. Сервер DNS возвращает клиенту все записи из зоны с указанием времени кэширования, равным по умолчанию 1 часу (или 3600 секундам). Поэтому до истечения времени кэширования (TTL Time To Live) клиент больше не направляет к серверу DNS никаких новых запросов.

Сброс кэша командой ipconfig / flushdns и новая команда
ping www.gorbunov.pro приводят, наконец к желаемому результату.

C:\>ipconfig /flushdns

Windows IP Configuration
Successfully flushed the DNS Resolver Cache.

C:\>ping www.gorbunov.pro –n 1

Pinging www.gorbunov.pro [30.0.0.1] with 32 bytes of data:
Request timed out.

Ping statistics for 30.0.0.1:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:\>

Теперь ясно, что для правильной работы DNS Round robin потребуется изменение параметров кэширования, чтобы клиенты постоянно получали обновленный список с “перемешанными” записями.

Настройка времени кэширования ответов DNS

Возможные варианты:

  • постоянный сброс кэша на стороне клиента (плохой вариант);
  • установка времени кэширования, равное нулю, в свойствах зоны (плохой вариант, поскольку влияет на всю зону);
  • установка индивидуального времени кэширования на отдельных записях (хороший вариант).

Для настройки индивидуального времени кэширования в консоли DNS Manager требуется сначала включить режим View –> Advanced. Затем последовательно открываем свойства записей (в нашем примере это три записи www) и ставим время кэширования, равное нулю.

image

Проверка работы дает в конце концов желаемый результат!

C:\>ping www.gorbunov.pro –n 1

Pinging www.gorbunov.pro [20.0.0.1] with 32 bytes of data:
Request timed out.

Ping statistics for 20.0.0.1:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:\>ping www.gorbunov.pro –n 1

Pinging www.gorbunov.pro [30.0.0.1] with 32 bytes of data:
Request timed out.

Ping statistics for 30.0.0.1:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:\>ping www.gorbunov.pro –n 1

Pinging www.gorbunov.pro [40.0.0.1] with 32 bytes of data:
Request timed out.

Ping statistics for 40.0.0.1:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:\>

Файл зоны на сервере DNS при этом будет выглядеть так:

;
;  Database file gorbunov.pro.dns for gorbunov.pro zone.
;      Zone version:  7
;

@   IN  SOA dc01.contoso.com. hostmaster.contoso.com. (
                                7            ; serial number
                                900          ; refresh
                                600          ; retry
                                86400        ; expire
                                3600       ) ; default TTL

www                     0    A    20.0.0.1
                        0    A    30.0.0.1
                        0    A    40.0.0.1

Добавления нуля в записи типа A можно сделать и вручную непосредственно в файле зоны.

Исключения

В настройках сервера DNS по умолчанию включена и опция Enable netmask ordering. Смысл опции заключаются в том, что при наличии нескольких IP адресов для одного и того же имени хоста сервер DNS анализирует из какой сети пришел запрос от клиента. Если IP сеть клиента совпадает с номером сети одного из IP адресов хоста, то такой IP всегда возвращается первым. Проще говоря, если в нашем примере клиент с адресом 30.67.98.123 будет запрашивать имя www.gorbunov.pro, то ему всегда первым в списке будет возвращаться адрес 30.0.0.1.

В серверах Windows опция Enable netmask ordering перебивает опцию Enable round robin. Т.е. клиентам DNS первым всегда возвращается адрес ближайшего хоста, даже несмотря на правильно настроенную функцию DNS Round robin.

Выводы

Технология DNS Round robin часто применяется для динамической балансировки нагрузки между зеркальными хостами. Она значительно проще в реализации, чем вариант настройки для тех же целей кластера NLB. При настройке DNS Round robin на серверах Windows не забывайте, что настройки по умолчанию для сервера DNS не позволяют в полной мере реализовать балансировку запросов и требуется ручная конфигурация сервера.

9 комментариев:

  1. Спасибо, отличная статья, в официальном курсе для самоподготовки к экзамену этой информации не нашла.

    ОтветитьУдалить
  2. Отличная и понятная статья.
    Спасибо!

    ОтветитьУдалить
  3. Просто и наглядно.
    Спасибо.

    ОтветитьУдалить
  4. Из вики:

    Хотя Round robin DNS (RR DNS) легко реализовать, всё же этот алгоритм имеет несколько проблематичных недостатков, связанных с кэшированием записи в иерархии RR DNS самого себя, а также с кэшированием на стороне клиента, выданного адреса и его повторного использования, сочетание которых трудно управляемо. RR DNS не опирается на доступность услуг. К примеру, если сервис на одном из адресов недоступен, RR DNS будет продолжать раздавать этот адрес и клиенты будут по-прежнему пытаться соединиться с неработающим сервером.

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

    Существуют методы, чтобы преодолеть такие ограничения. Например, модифицированные DNS-сервера (такие, как lbnamed) могут регулярно опрашивать зеркала серверов для проверки их доступности и нагруженности. Если сервер не отвечает по мере необходимости, сервер может быть временно удалён из пула DNS, пока он не сообщит, что опять работает в соответствии со спецификацией.

    ОтветитьУдалить
  5. удобный инструмент аналог dDNS http://dns-ip.ru/Home/DynDns

    ОтветитьУдалить
  6. Добрый день!

    Мне отправили этот пост в качестве примера того, как нужно настраивать DNS для отказоустойчивости.

    Хочу сделать несколько критических комментариев:
    1. Чем меньше TTL в DNS-записях, тем больше нагрузка на DNS-сервера, т.к. вместо того, чтобы взять из кеша, клиент (и каждый промежуточный DNS-сервер) будет запрашивать адрес заново
    2. В случае проблем с DNS-ами, ваш сайт становится недоступным сразу для всех, хотя обычно он был бы еще час или сутки доступен из кеша.
    3. Отказоустойчивость в RoundRobin DNS некорректно проверять пингом. Если вы попробуете в вашей конфигурации сделать telnet на ваш сайт (на тот же 80-й порт), и он не ответит, то после 2-х перепосылок на первый адрес, клиент будет пробовать подключиться ко второму, дальше - к третьему. Т.е. в данном случае переключение будет осуществляться протоколом TCP, который отвечает за доставку, а не IСMP, который отвечает за диагностику (и не отвечает за доставку). Я это проверил в WireShark - работает!

    ОтветитьУдалить
  7. Gorbunov.Pro: Что Такое Dns Round Robin? >>>>> Download Now

    >>>>> Download Full

    Gorbunov.Pro: Что Такое Dns Round Robin? >>>>> Download LINK

    >>>>> Download Now

    Gorbunov.Pro: Что Такое Dns Round Robin? >>>>> Download Full

    >>>>> Download LINK

    ОтветитьУдалить