company_banner

Что происходит, когда вы обновляете свой DNS

Автор оригинала: Julia Evans
  • Перевод

Fenix by Takeda11

Многие путаются в обновлении записей DNS, когда изменяют IP-адрес своего сайта. Почему эти записи медленно обновляются? Неужели действительно нужно ждать два дня, чтобы всё обновилось? Почему одни посетители видят новый IP, а другие — старый?

Команда Mail.ru Cloud Solutions перевела статью разработчика и автора статей Джулии Эванс, где она отвечает на эти вопросы и популярно рассказывает, что происходит во время обновления DNS с точки зрения фронтендера.

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

Как работает DNS: рекурсивные и авторитетные DNS-серверы


Во-первых, нам нужно немного объяснить систему DNS. Существует два вида DNS-серверов: авторитетные и рекурсивные.

Авторитетные DNS-серверы (также известные как серверы имен) хранят базу данных IP-адресов для каждого домена, за который они отвечают. Например, прямо сейчас авторитетный DNS-сервер для github.com — это ns-421.awsdns-52.com. Вы можете спросить у него IP-адрес github.com вот таким запросом:

dig @ns-421.awsdns-52.com github.com

Рекурсивные DNS-серверы сами по себе ничего не знают о том, кому принадлежит какой IP-адрес. Они вычисляют IP-адрес для домена, запрашивая его у соответствующих авторитетных DNS-серверов, а затем кэшируют этот IP-адрес на случай, если их снова спросят о нем. Так, 8.8.8.8 — это рекурсивный DNS-сервер.

Когда люди посещают ваш веб-сайт, они, вероятно, делают DNS-запросы к рекурсивному DNS-серверу. Итак, как же работают рекурсивные DNS-серверы? Давайте посмотрим!

Как рекурсивный DNS-сервер запрашивает IP-адрес github.com


Давайте рассмотрим пример того, что делает рекурсивный DNS-сервер (например, 8.8.8.8), когда вы запрашиваете у него IP-адрес (запись А) для github.com. Во-первых, если у него уже есть кэшированный результат, он выдаст его. Но что, если все кэши просрочены? Вот что происходит.

Шаг 1: IP-адреса для корневых DNS-серверов жестко закодированы в его исходном коде. Вы можете увидеть это в исходном коде unbound. Допустим, для начала он выберет 198.41.0.4. Вот официальный источник этих жестко закодированных IP-адресов, также известный как «корневой файл подсказок» (root hints file).

Шаг 2: Спросить корневые серверы имен о github.com.

Мы можем приблизительно воспроизвести то, что происходит, с помощью команды dig. Она выдает нам новый авторитетный сервер имен для запроса: сервер имен для .com с IP-адресом 192.5.6.30.

$ dig @198.41.0.4 github.com
...
com.			172800	IN	NS	a.gtld-servers.net.
...
a.gtld-servers.net.	172800	IN	A	192.5.6.30
...

Детали ответа DNS немного сложнее — в этом случае есть раздел авторитетности (authority section) с некоторыми записями NS и дополнительный раздел с записями A, так что вам не нужно делать дополнительный поиск, чтобы получить IP-адреса этих серверов имен.

На практике в 99,99% случаев там уже будет кэшированный адрес серверов имен .com, но мы делаем вид, что действительно начинаем с нуля.

Шаг 3: Спросить серверы имен .com о github.com.

$ dig @192.5.6.30 github.com
...
github.com.		172800	IN	NS	ns-421.awsdns-52.com.
ns-421.awsdns-52.com.	172800	IN	A	205.251.193.165
...

У нас есть новый IP-адрес для отправки запроса! Это один из серверов имен для github.com.

Шаг 4: Спросить у серверов имен github.com об адресе github.com.

Мы почти закончили!

$ dig @205.251.193.165 github.com

github.com.		60	IN	A	140.82.112.4

Итак, у нас есть запись А для github.com. Теперь у рекурсивного сервера есть IP-адрес github.com, и он может вернуть его вам. И он смог провернуть всю процедуру, начиная всего с нескольких жестко закодированных IP-адресов: адресов корневых серверов имен.

Как увидеть все шаги рекурсивного DNS-сервера: dig +trace


Чтобы посмотреть, что рекурсивный DNS-сервер будет делать для резолвинга домена, можно запустить:

$ dig @8.8.8.8 +trace github.com

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

Обновим записи DNS


Теперь, когда мы знаем основы работы DNS, давайте обновим некоторые записи DNS и посмотрим, что произойдет.

При обновлении записей DNS существует два основных варианта:

  1. сохранить те же серверы имен;
  2. изменить серверы имен.

Поговорим о TTL


Но мы забыли кое-что важное. Это TTL. Как мы сказали ранее, рекурсивный DNS-сервер будет кэшировать записи до истечения срока их действия. Он принимает решение об истечении срока действия записи в зависимости от ее TTL (time to live, времени жизни).

В этом примере сервер имен GitHub для его DNS-записи возвращает TTL 60, что означает 60 секунд:

$ dig @205.251.193.165 github.com

github.com.		60	IN	A	140.82.112.4

Это довольно короткий TTL. Теоретически, если бы все DNS-реализации следовали стандарту DNS, это означало бы, что если GitHub решил изменить IP-адрес для github.com, каждый получил бы новый IP-адрес в течение 60 секунд. Давайте посмотрим, как это происходит на практике.

Вариант 1: обновление записи DNS на тех же серверах имен


Во-первых, я обновила свои серверы имен (Cloudflare), чтобы получить новую запись DNS — запись A, которая сопоставляет test.jvns.ca на 1.2.3.4:

$ dig @8.8.8.8 test.jvns.ca
test.jvns.ca.		299	IN	A	1.2.3.4

Это сработало немедленно! Не было никакой необходимости ждать вообще, потому что перед этим не было никакой DNS-записи test.jvns.ca, которая могла быть кэширована. Отлично. Но похоже, что новая запись кэшируется в течение примерно пяти минут (299 секунд).

Итак, а если мы попытаемся изменить этот IP-адрес? Я изменила его на 5.6.7.8, а затем запустила тот же DNS-запрос:

$ dig @8.8.8.8 test.jvns.ca
test.jvns.ca.		144	IN	A	1.2.3.4

Похоже, что на этом DNS-сервере запись 1.2.3.4 всё еще кэшируется в течение 144 секунд. Интересно, что если запросить 8.8.8.8 несколько раз, вы получите противоречивые результаты — иногда он выдает новый IP, а иногда старый. Вероятно, 8.8.8.8 на самом деле распределяет нагрузку на кучу разных бэкендов, у каждого из которых собственный кэш.

После пяти минут ожидания все кэши 8.8.8.8 обновились и всегда возвращали новую запись 5.6.7.8. Потрясающе. Это довольно быстро!

Не всегда можно полагаться на TTL


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

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

Вариант 2: обновление ваших серверов имен


Итак, мы видели, что когда вы обновляете IP-адрес, не меняя свои серверы имен, многие DNS-серверы довольно быстро получают новый IP-адрес. Отлично. Но что произойдет, если вы измените свои серверы имен? Давайте попробуем!

Я не хотела обновлять серверы имен для своего блога, поэтому вместо этого взяла другой свой домен и использовала его в примерах для журнала по HTTP это examplecat.com.

Раньше мои серверы были установлены на dns1.p01.nsone.net. Я решила изменить их на серверы Google с адресами ns-cloud-b1.googledomains.com и так далее.

Когда я внесла изменения, мой доменный регистратор несколько зловеще высветил сообщение: «Изменения в examplecat.com сохранены. Они вступят в силу в течение ближайших 48 часов». Затем я установила новую запись A для домена, чтобы она указывала на 1.2.3.4.

Ладно, давайте посмотрим, изменилось ли что-нибудь:

$ dig @8.8.8.8 examplecat.com
examplecat.com.		17	IN	A	104.248.50.87

Никаких изменений. Если я спрошу другой DNS-сервер, то он знает новый IP:

$ dig @1.1.1.1 examplecat.com
examplecat.com.		299	IN	A	1.2.3.4

Но 8.8.8.8 по-прежнему ничего не знает. Причина, по которой 1.1.1.1 видит новый IP, хотя я только что изменила его пять минут назад, вероятно, заключается в том, что никто никогда не спрашивал 1.1.1.1 об этом examplecat.com раньше — значит, у него в кэше ничего не было.

У серверов имен TTL намного больше


Причина, по которой мой регистратор говорил: «Это займёт 48 часов» в том, что TTL на NS-записях (сведения о том, к какому серверу имен должен обратиться рекурсивный сервер) намного больше.

Новый сервер имен определенно возвращает новый IP-адрес для examplecat.com:

$ dig @ns-cloud-b1.googledomains.com examplecat.com
examplecat.com.		300	IN	A	1.2.3.4

Но вспомните, что произошло, когда мы запросили серверы имен github.com раньше:

$ dig @192.5.6.30 github.com
...
github.com.		172800	IN	NS	ns-421.awsdns-52.com.
ns-421.awsdns-52.com.	172800	IN	A	205.251.193.165
...

172 800 секунд — это 48 часов! Таким образом, обновление сервера имен, как правило, занимает гораздо больше времени. Время нужно, чтобы закончился срок действия кэшей и распространился новый адрес. Это гораздо дольше, чем просто обновление IP-адреса без изменения вашего сервера имен.

Как обновляются ваши серверы имен


Когда я обновляю серверы имен для examplecat.com, сервер имен .com получает новую запись NS с новым доменом. Подобно этому:

dig ns @j.gtld-servers.net examplecat.com

examplecat.com.		172800	IN	NS	ns-cloud-b1.googledomains.com

Но как туда попадает эта новая запись NS? Фактически, я говорю своему регистратору доменов, какими хочу видеть новые серверы имен, обновляя их на веб-сайте, а затем мой регистратор доменов говорит серверам имен .com сделать обновление.

Для .com эти обновления происходят довольно быстро (в течение нескольких минут), но я думаю, что для некоторых других зон TLD серверы имен могут применять обновления не так быстро.

Библиотека DNS-резолвера вашей программы также может кэшировать записи DNS


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

Например, есть статья о настройке JVM TTL для поиска DNS-имен. Я сама писала не так много кода JVM для поиска DNS, но небольшой поиск в интернете о JVM и DNS создает впечатление, что вы можете настроить JVM так, чтобы он кэшировал каждый поиск DNS в течение бесконечного времени (например, см. этот тикет ElasticSearch).

Вот и всё!


Надеюсь, что это поможет вам понять, что происходит при обновлении вашего DNS.

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

После публикации этой статьи я изменила серверы имен для examplecat.com обратно к старым значениям.

Что еще почитать:

  1. Go и кеши CPU.
  2. Какую базу данных выбрать для проекта, чтобы не пришлось выбирать снова.
  3. Наш канал в Телеграме о цифровой трансформации.
Mail.ru Group
Строим Интернет

Комментарии 10

    0
    1. В статье написано всё верно, но я не понял цель и смысл её публикования (да ещё и предварительного перевода). Или нам ждать от mail.ru в следующей статье информацию с доказательствами теоремы Пифагора ?
    2. Если же уж опубликовали, то в конце статьи уже от собственного лица дали бы рекомендации вебмастерам в разрезе dns — как то: a) не размещать DNS-records на ns-серверах хостера б) пользоваться специализированными DNS-хостингами (с кучей anycast серверов) причём их (dns-хостингов) должно быть как минимум два разных — связанных связкой: Primary/Secondary — тогда и ns-сервера менять часто не придётся (при смене хостинга) да и вероятность проблем с доступностью сайта из-за dns сведётся практически к нулю.
      0
      не размещать DNS-records на ns-серверах хостера — почему?
        0
        1. Первая причина понятна из статьи — решите Вы хостинг поменять — придётся и ns-сервера менять а это долго !
        2. Как правило у хостеров (даже больших) ns-сервера расположены максимум на двух физических серверах. Соответственно вероятность сбоя существена (например за полгода два раза уже сайты размещённые на Бегете были недоступны именно из-за падения ns-серверов).
        3. Этот пункт не особо важен, но как правило ns-сервера хостеров поддерживают исключительно только самые распростанённые dns-records (к примеру dnssec, tlsa и srv — не поддерживают). Но повторюсь что этот пункт не так уж важен.
          0

          Часто один из днс серверов физически расположен там же где и ваш сайт.
          Спрашивается, в случае его падения, вам будет легче от того что днс работает, но сам сайт нет? В большинстве случаев без разницы, упал ли сайт с днс или только сайт, а днс нормально работает… направляя посетителей на нерабочий ip.
          Исключение может быть лишь если у вас на уровне днс реализовано какое-то жонглирование хостингами какраз на случай падения одного из них. Или же если MX направлена куда-то в другое место, тогда да, даже если сайт упадет, хотелось бы чтоб почта продолжала работать.


          Но не забываем за минусы стороннего днс хостинга:
          а) Это всеж дополнительное звено цепи и потенциальная point of failure. Даже у великолепных cloudflare с гуглами случаются проблемы.
          б) Масштабы несоизмеримы. Прикиньте количество доменов у днс хостинга и хостинга вашего сайта. Скорость ответа наверняка будет достаточно заметна.
          в) В случае ЧП или просто какой-то технической необходимости хостер сможет оперативно сменить ip вашего сайта без вашего участия. В противном случае вы сами себе увеличиваете время даунтайма если вдруг будет необходимость смены ip сайта — сервер упал/заддосен и всех быстро переключили на другой ip… кроме вас потому что вы самый умный и пользуетесь чужими ns. :)

            0
            1. а) Есть разница по времени простоя когда оно состоит только из разворачивания бекапа у стороннего хостера или из разворачивиния бекапа ПЛЮС время пока новые ns поменяются?
              б) Вот в последних двух сбоях у Бегета сами сервера с сайтами работали а падали только ns-ки


            2. Я же писал в первом сообщении:


              причём их (dns-хостингов) должно быть как минимум два разных — связанных связкой: Primary/Secondary


            Уж всяко надёжнее чем у "обычных" хостеров!
            3.
            Куча anycast серверов по всему миру у нормальных dns-хостеров даст "скорость" всяко лучше чем стандартные два сервера у "обычных" хостеров отведённые под ns.

      +1
      Спасибо за ликбез, очень полезно!
        +3

        Вот отлично, изучили принципы работы DNS по выводу команды dig! А если бы был nslookup, так и не судьба? Остались бы мы жить непросвещёнными?


        Без описания записи SOA и её полей serial, refresh, retry, expire и ttl эта статья в значительной степени бесполезна, а в некоторых аспектах и вредна.


        Кратенький совет: если вы видите, что после обновления какой-либо записи в DNS зоне вашего домена, serial значение не изменилось, то меняйте DNS провайдера — их уровень компетенции ниже плинтуса.

          +2
          Почему-то «We’ve forgotten something important though! TTLs!» переведено как «Но мы забыли кое-что важное. Это пакеты TTL». Откуда тут взялись пакеты? Ну то есть, у IP-пакета есть поле TTL, но это совсем другой TTL, который никакого отношения к TTL записей DNS не имеет. Поправьте, что ли…
            0
            Угу, спасибо, исправил
            0
            Что происходит, когда вы обновляете свой DNS


            Происходит полный треш! Так и надо было написать.

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

            Самое читаемое