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