Spec-Zone.ru › MySQL 9.2

7.1.12.3 Проверка DNS-записей и кэш хостов

Сервер MySQL поддерживает кэш хостов в оперативной памяти, содержащий информацию о клиентах: IP-адрес, имя хоста и информацию об ошибках. Таблица Performance Schema host_cache предоставляет содержимое кэша хостов, которое можно просмотреть с помощью операторов SELECT. Это может помочь в диагностике причин проблем с подключением. См. Раздел 29.12.22.3, «Таблица host_cache».

В следующих разделах рассматривается работа кэша хостов, а также другие темы, такие как настройка и мониторинг кэша.

  • Работа кэша хостов

  • Настройка кэша хостов

  • Мониторинг кэша хостов

  • Очистка кэша хостов

  • Работа с заблокированными хостами

Работа кэша хостов

Сервер использует кэш хостов только для нелокальных TCP-соединений. Он не использует кэш для TCP-соединений, созданных с использованием адреса интерфейса обратной связи (например, 127.0.0.1 или ::1), или для соединений, созданных с использованием файла сокета Unix, именованной трубы или общей памяти.

Сервер использует кэш хостов для нескольких целей:

  • Кэшируя результаты поиска IP-адреса по имени хоста, сервер избегает выполнения запроса к системе доменных имен (DNS) для каждого клиентского соединения. Вместо этого для заданного хоста ему требуется выполнить поиск только для первого соединения с этого хоста.

  • Кэш содержит информацию об ошибках, возникающих во время процесса подключения клиента. Некоторые ошибки считаются «блокирующими». Если слишком много таких ошибок происходит последовательно с определенного хоста без успешного подключения, сервер блокирует дальнейшие подключения с этого хоста. Система переменная max_connect_errors определяет допустимое количество последовательных ошибок перед блокировкой.

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

Сервер выполняет разрешение имен хостов с помощью системного вызова getaddrinfo().

Сервер обрабатывает записи в кэше хостов следующим образом:

  1. Когда первое TCP-соединение клиента достигает сервера с заданного IP-адреса, создается новая запись в кэше, чтобы записать IP-адрес клиента, имя хоста и флаг валидации поиска клиента. Изначально имя хоста устанавливается в NULL, а флаг — в false. Эта запись также используется для последующих TCP-соединений клиентов с того же исходного IP-адреса.

  2. Если флаг валидации для записи IP-адреса клиента равен false, сервер пытается выполнить разрешение IP-адреса на имя хоста и обратно на IP-адрес через DNS. Если это успешно, имя хоста обновляется с разрешенным именем хоста, а флаг валидации устанавливается в true. Если разрешение не выполнено, действия зависят от того, является ли ошибка постоянной или временной. Для постоянных ошибок имя хоста остается NULL, а флаг валидации устанавливается в true. Для временных ошибок имя хоста и флаг валидации остаются неизменными. (В этом случае следующая попытка разрешения DNS происходит в следующий раз, когда клиент подключается с этого IP-адреса.)

  3. Если при обработке входящего клиентского соединения с заданного IP-адреса возникает ошибка, сервер обновляет соответствующие счетчики ошибок в записи для этого IP-адреса. Для описания записываемых ошибок см. Раздел 29.12.22.3, «Таблица host_cache».

Чтобы разблокировать заблокированные хосты, очистите кэш хостов; см. Работа с заблокированными хостами.

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

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

  • Если удаленная запись относится к заблокированному хосту, этот хост становится разблокированным.

Некоторые ошибки подключения не связаны с TCP-соединениями, возникают очень рано в процессе подключения (даже до того, как известен IP-адрес) или не специфичны для какого-либо конкретного IP-адреса (например, проблемы с недостатком памяти). Для получения информации об этих ошибках проверьте переменные состояния Connection_errors_xxx (см. Раздел 7.1.10, «Переменные состояния сервера»).

Настройка кэша хостов

Кэш хостов включен по умолчанию. Переменная системы host_cache_size управляет его размером, а также размером таблицы Performance Schema host_cache, которая предоставляет содержимое кэша. Размер кэша можно установить при запуске сервера и изменить во время работы. Например, чтобы установить размер в 100 при запуске, добавьте эти строки в файл конфигурации сервера my.cnf:

[mysqld]
host_cache_size=200

Чтобы изменить размер на 300 во время работы, сделайте следующее:

SET GLOBAL host_cache_size=300;

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

Изменение размера кэша во время работы приводит к неявной очистке кэша хостов, очистке таблицы host_cache и разблокированию любых заблокированных хостов; см. Очистка кэша хостов.

Чтобы отключить поиск по DNS имен хостов, запустите сервер с включенной системной переменной skip_name_resolve. В этом случае сервер использует только IP-адреса, а не имена хостов, чтобы сопоставлять подключающиеся хосты со строками в таблицах разрешений MySQL. Можно использовать только учетные записи, указанные в этих таблицах с использованием IP-адресов. (Клиент может не иметь возможности подключиться, если не существует учетной записи, указывающей IP-адрес клиента.)

Если у вас очень медленный DNS и много хостов, вы можете улучшить производительность, включив skip_name_resolve для отключения поиска по DNS или увеличив значение host_cache_size для увеличения размера кэша хостов.

Чтобы полностью запретить TCP/IP-соединения, запустите сервер с включенной системной переменной skip_networking.

Чтобы настроить допустимое количество последовательных ошибок подключения перед блокировкой хоста, установите системную переменную max_connect_errors. Например, чтобы установить значение при запуске, добавьте эти строки в файл конфигурации сервера my.cnf:

[mysqld]
max_connect_errors=10000

Чтобы изменить значение во время работы, сделайте следующее:

SET GLOBAL max_connect_errors=10000;
Мониторинг кэша хостов

Таблица Performance Schema host_cache предоставляет содержимое кэша хостов. Эту таблицу можно просмотреть с помощью операторов SELECT, что может помочь в диагностике причин проблем с подключением. Подробную информацию об этой таблице см. в Разделе 29.12.22.3, «Таблица host_cache».

Очистка кэша хостов

Очистка кэша хостов может быть желательной в следующих ситуациях:

  • Некоторые из ваших клиентских хостов изменили IP-адрес.

  • Появляется сообщение об ошибке Host 'host_name' is blocked для подключений с законных хостов. (См. Обработка заблокированных хостов.)

Очистка кэша хостов приводит к следующим результатам:

  • Очищается кэш хостов в оперативной памяти.

  • Удаляются все строки из таблицы Performance Schema host_cache, которая отображает содержимое кэша.

  • Разблокируются все заблокированные хосты. Это позволит выполнять дальнейшие попытки подключения с этих хостов.

Для очистки кэша хостов можно использовать следующие методы:

  • Изменить значение системной переменной host_cache_size. Для этого требуется привилегия SYSTEM_VARIABLES_ADMIN (или устаревшая привилегия SUPER).

  • Выполнить оператор TRUNCATE TABLE, который обнуляет таблицу Performance Schema host_cache. Для этого требуется привилегия DROP для таблицы.

  • Выполнить команду mysqladmin flush-hosts. Для этого требуется привилегия DROP для таблицы Performance Schema host_cache или привилегия RELOAD.

Обработка заблокированных хостов

Сервер использует кэш хостов для отслеживания ошибок, возникающих во время процесса подключения клиента. Если появляется следующая ошибка, это означает, что mysqld получил множество запросов на подключение с данного хоста, которые были прерваны посредине:

Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

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

Для разблокировки заблокированных хостов очистите кэш хостов; см. Очистка кэша хостов.

В качестве альтернативы, чтобы избежать появления сообщения об ошибке, установите значение max_connect_errors, как описано в Настройка кэша хостов. Значение по умолчанию для max_connect_errors составляет 100. Увеличение значения max_connect_errors до большого значения уменьшает вероятность того, что хост достигнет порога и станет заблокированным. Однако, если появляется сообщение об ошибке Host 'host_name' is blocked, сначала проверьте, нет ли проблем с TCP/IP-соединениями с заблокированных хостов. Нет смысла увеличивать значение max_connect_errors, если есть проблемы с сетью.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/host-cache.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API