Прямой ответ
Разрешение имени в адрес выполняется до установки соединения, поэтому задержка разрешения добавляется к времени запроса. Результат кэшируется на время жизни записи.
# Время разрешения и время жизни записи
dig +stats example.com | grep -E 'Query time|ANSWER SECTION' -A2
# Настройка резолвера
cat /etc/resolv.conf
| Этап | Где выполняется |
|---|---|
| Кэш приложения | Процесс, выполняющий запрос |
| Кэш резолвера узла | Локальная служба разрешения |
| Запрос к вышестоящему серверу | Внешний сервер |
Время жизни записи определяет, как долго результат хранится в кэше, поэтому изменение адреса обнаруживается не сразу. Об устройстве разрешения — в статье про DNS для разработчика.
Кэширование на узле и влияние на переключение
Два аспекта определяют, как быстро изменение адреса обнаруживается приложением.
Время жизни записи. Запись хранится в кэше в течение указанного времени, поэтому изменение адреса на сервере не влияет на кэш до истечения срока. Сокращение времени жизни ускоряет обнаружение изменения.
Кэш резолвера узла. Локальная служба разрешения хранит ответы, поэтому повторные запросы не уходят во внешнюю сеть. Кэш сокращает задержку, но удерживает прежний адрес после изменения.
Практическое следствие: при плановом переключении адреса время жизни записи сокращается заранее, чтобы кэши обновились до переключения.
Отдельный аспект — повторное разрешение. Приложение, удерживающее соединение длительное время, не выполняет разрешение повторно, поэтому изменение адреса не обнаруживается до переподключения.
Три признака проблемы с разрешением.
Задержка разрешения сопоставима с временем запроса. Разрешение выполняется для каждого обращения, поэтому кэш не используется.
Прежний адрес после переключения. Кэш удерживает запись до истечения времени жизни, поэтому обращение идёт на прежний адрес.
Отсутствие резервного сервера разрешения. Единственный сервер недоступен, поэтому разрешение завершается ошибкой.
О таймаутах операций — в статье про сетевые таймауты; о распределении задержек — в статье про диагностику задержек.
Отрицательное кэширование и повторные запросы
Ответ об отсутствии записи также кэшируется, поэтому повторные запросы не уходят во внешнюю сеть.
Кэширование отсутствия записи. Ответ о несуществовании имени хранится в течение времени жизни отрицательной записи, поэтому повторный запрос обслуживается из кэша. Отсутствие кэширования приводит к повторным внешним запросам для несуществующего имени.
Влияние на время ожидания. Запрос к недоступному серверу разрешения выполняется с таймаутом, поэтому ожидание добавляется к времени обращения. Кэшированный ответ исключает ожидание.
Порядок источников. Файл локальных соответствий проверяется до обращения к серверу разрешения, поэтому запись в файле обслуживается без внешнего запроса.
Практическое следствие: отрицательное кэширование сокращает число внешних запросов для несуществующих имён, поэтому задержка повторных обращений снижается.
Отдельный аспект — повторное разрешение при длительном удержании соединения. Приложение, удерживающее соединение, не выполняет разрешение повторно, поэтому изменение адреса не обнаруживается до переподключения.
Повторное разрешение при сбое подключения
Приложение, получившее отказ подключения, выполняет разрешение повторно, поскольку адрес мог измениться.
Повтор после отказа. Отказ подключения может указывать на устаревший адрес, поэтому повторное разрешение получает актуальную запись из кэша либо с сервера.
Ограничение числа повторов. Повторное разрешение выполняется ограниченное число раз, поскольку неограниченный повтор увеличивает задержку обращения.
Практическое следствие: повторное разрешение после отказа подключения сокращает время восстановления при изменении адреса.
Практика: настройка разрешения и кэширования
1. Используйте локальный кэш разрешения. Повторные запросы обслуживаются из кэша, поэтому задержка сокращается.
2. Сокращайте время жизни записи перед переключением. Кэши обновляются до переключения, поэтому обращение идёт на новый адрес.
3. Указывайте резервный сервер разрешения. Единственный сервер недоступен при сбое, поэтому разрешение завершается ошибкой.
4. Проверяйте время разрешения. Замер показывает долю разрешения в общем времени запроса.
5. Переподключайтесь при длительном удержании соединения. Приложение не выполняет разрешение повторно, поэтому изменение адреса не обнаруживается.
6. Проверяйте ответ при диагностике. Утилита разрешения показывает адрес и время жизни записи, поэтому расхождение видно.
7. Учитывайте порядок источников конфигурации. Файл локальных соответствий проверяется до обращения к серверу разрешения.
Рекомендации:
- Различайте разрешение и подключение. Разрешение выполняется до установки соединения, поэтому задержка добавляется к времени запроса.
- Учитывайте время жизни записи. Изменение адреса обнаруживается после истечения срока хранения в кэше.
- Проверяйте кэш резолвера узла. Локальная служба хранит ответы, поэтому прежний адрес удерживается после изменения.
- Фиксируйте резервный сервер. Единственный источник разрешения делает разрешение недоступным при сбое сервера.
- Пересматривайте при изменении топологии. Добавление промежуточного узла изменяет путь разрешения.
Практический сценарий: часть запросов шла на прежний адрес
Контекст: после переключения сервиса на новый адрес часть обращений продолжала идти на прежний.
- Диагностика. Время жизни записи составляло длительный период, поэтому кэши резолверов удерживали прежний адрес. Обращения, выполненные из узлов с непросроченным кэшем, шли на прежний адрес.
- Причина. Время жизни записи не было сокращено до переключения, поэтому кэши не обновились к моменту изменения. Часть узлов использовала кэшированную запись до истечения срока.
- Действия. (а) Сократили время жизни записи заранее, чтобы кэши обновились до переключения; (б) выждали период, равный прежнему времени жизни, чтобы все кэши истекли; (в) выполнили переключение после обновления кэшей; (г) добавили проверку адреса при диагностике, чтобы подтверждать фактическое разрешение; (д) зафиксировали правило сокращения времени жизни перед плановым переключением.
- Результат. Обращения идут на новый адрес, поскольку кэши обновлены до переключения.
Вывод: кэш разрешения удерживает прежний адрес в течение времени жизни записи, поэтому переключение без сокращения срока приводит к обращениям на прежний адрес. Сокращение времени жизни заранее обеспечивает обновление кэшей до переключения.
FAQ
Когда выполняется разрешение имени? До установки соединения, поэтому задержка разрешения добавляется к времени запроса. Кэшированный результат сокращает задержку.
Как долго кэш хранит ответ? В течение времени жизни записи, указанного в ответе сервера. Изменение адреса обнаруживается после истечения срока.
Нужно ли переподключаться для применения нового адреса? Да, приложение, удерживающее соединение, не выполняет разрешение повторно, поэтому изменение адреса обнаруживается при переподключении.
Как проверить фактическое разрешение? Утилитой разрешения, которая показывает адрес и время жизни записи. Расхождение с ожидаемым адресом указывает на устаревший кэш.
Источники: resolv.conf, dig, RFC 1035 — ссылки в шапке.