У меня есть несколько серверов с большим исходящим трафиком с использованием nginx. Когда полоса пропускания исчерпана (1 Гбит), у меня возникают проблемы с подключением к моему серверу mysql с этих серверов.
Подключение всегда завершается ошибкой со следующим сообщением:
Ошибка подключения mysql с SQLSTATE [HY000] [2013] Потеряно соединение с сервером MySQL при «чтении пакета авторизации»,
Пропускная способность исчерпана, но я бы ожидал, что соединение и передача данных будут медленнее. Но соединяется полностью. После нескольких попыток иногда это срабатывает. после подключения он работает нормально.
Все остальные службы (Ssh, http) тоже работают нормально.
Что я могу сделать, чтобы решить эту проблему и почему она возникает?
Из-за вашего ошибочного соединения с сервером mysql соединение прерывается сервером, вероятно, с "плохим рукопожатием". вы увидите эту ошибку, потому что сервер решит больше ничего не записывать в сокет, поскольку он ничего не видел со стороны клиента, и установит флаг «net-> error = 2» (это можно увидеть в функции 'my_real_read 'в net_serv.cc).
Этот флаг имеет эффект, что даже если сервер вызывает функцию, которая записывает в сеть обратно клиенту с фактической документированной ошибкой, она будет отброшена. Обычно документируемая ошибка «Плохое рукопожатие» для таймаутов насыщенной сети.
Тайм-аут соединения MySQL довольно мал. Я считаю, что по умолчанию на 5 секунд вы можете увеличить его в my.cnf с помощью системной переменной "connect_timeout" с 5 по умолчанию до 20. Это должно помочь, как только соединение будет установлено, вы отключитесь по тайм-ауту в насыщенной сети. Установите второй сетевой путь к серверу БД.
Если соединение действительно насыщено до такой степени, что оно не может больше загружать данные по конвейеру, вы потеряете пакеты. Если для одного и того же соединения за короткий период времени потеряно достаточное количество пакетов, то это соединение, скорее всего, будет разорвано из-за известной механики TCP.
Как решить ...
Во-первых, очевидное: получите соединение, способное обрабатывать трафик. Если он перегружен, он перегружен.
Во-вторых, если возможно, вы можете / должны установить выделенное соединение для подключения к базе данных. Разделите трафик таким образом, чтобы заполнение одного гигабитного канала не мешало работе другого.
В-третьих, выясните, что на самом деле использует всю полосу пропускания. Если это нежелательный трафик, заблокируйте его. Если он поступает из Интернета в целом, попросите вашего провайдера восходящего потока / полосы пропускания заблокировать его.