mysql — mysqli php ошибка случайного подключения

Я получаю сообщение об ошибке ниже случайным образом из заданий бэкэнда php и журналов веб-страниц php. Иметь сервер приложений, который запускает бэкенд-задания php и веб-серверы php. Оба подключаются к одному серверу базы данных. Использование php mysqli объектно-ориентированной библиотеки для подключения к базе данных. В my.cnf установили максимальное количество подключений до 750. Не вижу, что много связей достигнуто.

Предупреждение PHP: mysqli :: mysqli (): (HY000 / 2003): не удается подключиться к серверу MySQL в ’77 .777.120.81 ‘(99) в /usr/local/dev/classes/Admin.php в строке 15

Не удалось подключиться к MySQL: не удается подключиться к серверу MySQL в ’77 .777.120.81 ‘(99)

8

Решение

Как отлично описано в этом Блог производительности базы данных Percona статья, ваша проблема в том, что ваше приложение не может открыть другое соединение с сервером MySQL. У вас заканчиваются локальные порты TCP. В качестве решения я бы предложил Твик настройки параметров TCP

  • tcp_tw_reuse (Boolean; по умолчанию: отключено; начиная с Linux 2.4.19 / 2.6)
    Разрешить повторное использование сокетов TIME_WAIT для новых соединений, когда это
    безопасен с точки зрения протокола. Не должно быть изменено
    без совета / запроса технических экспертов.

    Можно заставить ядро ​​повторно использовать зависание соединения в состоянии TIME_WAIT, установив / proc / sys / net / ipv4 / tcp_tw_reuse в 1. Что на практике происходит, так это то, что закрытые соединения будут висеть в TIME_WAIT до тех пор, пока они не будут истекает или запрашивается новое соединение. В последнем случае соединение будет «восстановлено».

  • tcp_tw_recycle (Boolean; по умолчанию: отключено; начиная с Linux 2.4)
    Включите быструю утилизацию сокетов TIME_WAIT. Включение этого
    опция не рекомендуется, так как это вызывает проблемы, когда
    работа с NAT (трансляция сетевых адресов).

    При включении / proc / sys / net / ipv4 / tcp_tw_recycle закрытые соединения больше не будут отображаться в TIME_WAIT — они вообще исчезают из netstat. Но как только вы откроете новое соединение (в пределах 60 секунд), оно перезапустит одно из них. Но каждый, кто пишет об этой альтернативе, похоже, не советует ее использовать. Итог: предпочтительнее повторно использовать соединение, чем перерабатывать его.

  • tcp_max_tw_buckets (целое число; по умолчанию: см. ниже; начиная с Linux 2.4)
    Максимальное количество сокетов в состоянии TIME_WAIT, разрешенное в
    система. Этот предел существует только для предотвращения простого
    сервисные атаки. Значением по умолчанию NR_FILE * 2 является
    регулируется в зависимости от памяти в системе. Если это
    номер превышен, розетка закрыта и предупреждение
    распечатаны.

    Этот параметр определяет, сколько соединений может оставаться в состоянии TIME_WAIT одновременно: ядро ​​будет
    просто убейте соединения, висящие в таком состоянии выше этого числа. Например, в сценарии, где сервер имеет диапазон портов TCP, состоящий только из 6 портов, если /proc/sys/net/ipv4/tcp_max_tw_buckets установлен на 5, затем откройте 6 одновременных подключений с MySQL, а затем немедленно закройте все 6, вы найдете только 5 из них, висящие в состоянии TIME_WAIT — как с tcp_tw_recycleодин из них просто исчезнет из netstat выход. Эта ситуация позволяет немедленно открыть новое соединение, не дожидаясь минут *.

    • Когда дело доходит до подключения к серверам баз данных, многие приложения предпочитают открывать новое соединение только для одного запроса, закрывая его сразу после обработки запроса. Даже если клиент закрывает соединение (приложение), локальный порт, который он использовал, не сразу освобождается ОС для повторного использования другим соединением: он будет находиться в состоянии TIME_WAIT (обычно) 60 секунд — это значение не может быть легко меняется, так как он жестко закодирован в ядре.

    Однако второе соединение не сможет открыться до тех пор, пока не истечет срок действия одного из 5 других подключений в TIME_WAIT и не освободится используемый локальный порт. Таким образом, секрет здесь заключается в том, чтобы найти компромисс между количеством доступных сетевых портов и количеством соединений, которым мы позволяем оставаться в состоянии TIME_WAIT. Значение по умолчанию для этого параметра равно 65536, что означает, что по умолчанию система разрешает всем возможным соединениям переходить через состояние TIME_WAIT при закрытии.

PS: Есть более возможные решения вашей проблемы, прочитайте статью полностью для подробного описания проблемы.

6

Другие решения

Обновление 1:

tcp_tw_reuse выглядит лучшее решение. Здесь описано почему:

tcp_tw_reuse vs tcp_tw_recycle: что использовать (или оба)?

Оригинальный ответ:

Ошибка MySQL (99) означает, что у вас не хватает портов TCP.

Включение tcp recycle должно исправить это.

echo 1 >/proc/sys/net/ipv4/tcp_tw_recycle

кредиты.

1

ссылка обращаться

Я могу подключиться из локальной оболочки, поэтому сначала подумал, что если что-то не так с недавним обновлением Zend Framework, но через некоторое время я понял, что ответ очень прост — SELinux блокировал удаленные подключения из сценариев PHP, выполняемых веб-сервером Apache. Код ошибки (13) в конце сообщения об ошибке означает «отказано в разрешении», так что это означает, что у вас есть аналогичная проблема или нет.

В любом случае, войдите как root и сделайте

setsebool -P httpd_can_network_connect=1

чтобы это работало.

Конечно, подумайте дважды, потому что вы делаете веб-сервер немного менее безопасным, поэтому не делайте этого, если вы не уверены, что он вам нужен.

-2
По вопросам рекламы [email protected]