
У меня есть 100 клиентских ПК, подключающихся к MySQL по локальной сети.
Они запускают запросы INSERT без определенного периода. По статистике, одновременно не более 10 ПК пытаются запустить запрос INSERT. Это не ограничение по замыслу, просто выполнение запросов зависит от активности каждого пользователя ПК.
Каждый клиент подключается и отключается каждый раз, когда ему необходимо выполнить запрос INSERT (подключение - вставка - отключение).
Все работало нормально несколько месяцев, но несколько дней назад клиент начал сбоить при подключении.
Примерно дважды в день, в течение 5-10 минут, клиенты не могут подключиться. Они получают ошибки тайм-аута. Все клиенты ПК не могут подключиться в этот период времени. Ни один из них не может подключиться.
Время сбоя случайно. Иногда это происходит в 09:00, иногда в 13:00 и т. д. Активность каждого пользователя довольно регулярна, поэтому нет особых различий от одного дня к другому. Я имею в виду, что время дня, похоже, не имеет значения.
Глядя на серверную сторону, я не вижу ошибок в журналах mysql, никаких сбоев сервиса, никаких перезагрузок сервера. У меня включен только журнал ошибок (журнал запросов, журнал медленных запросов).
Затем я стал искать проблему с сетью, но трассировки от ПК к серверу и от сервера к ПК оказались правильными.
Я сделал сетевой захват на сервере (с помощью Wireshark), чтобы посмотреть, смогу ли я найти там ошибку.
В течение периода ошибки (те 5-10 минут) я вижу, что соединения с ПК-клиентов застревают в сообщении "приветствия". Клиентский ПК не отправляет запрос "входа" в ответ.
решение1
Анализируя сетевые трассировки, я обнаружил некоторые проблемы с разрешением имен.
Я использую версию MySQL Community Edition 5.1.41. Не знаю, относится ли это к более актуальным релизам, но в этой версии функция «разрешения имен» включена по умолчанию.
Если разрешение имен включено, то при каждом запуске сетевого соединения MySQL пытается определить имя ПК клиента по его IP-адресу.
Если при разрешении имен по какой-либо причине происходит сбой или задержка, это может привести к проблемам с подключением.
При отключении разрешения имен мы получаем больше неудачных и задержанных подключений при каждой повторной попытке клиентского ПК, и в конечном итоге сетевое подключение не устанавливается вообще.
Решение — отключить разрешение имен. Эта функция важна, если у вас есть привилегии, определенные для некоторых пользователей MySQL, которые полагаются на имя хоста клиента. Но поскольку у нас нет никаких привилегий, основанных на имени хоста клиента (вместо этого мы используем IP-адрес), мы можем безопасно отключить функцию «разрешение имен».
Вот ссылка, которая это объясняет и указывает мне правильное направление и то, что искать в сетевых захватах: