PHP -> Mysql постоянный пул соединений БЕЗ mysql_pconnect - возможно?

12

Я уже давно пытаюсь найти хороший способ сделать это. Но было трудно найти правильные части, чтобы сделать это. Я предполагаю, что это должно быть возможно.

Проще говоря, вот что я хотел бы сделать:

PHP / Other front end -> [SOCKET] ->

Locally hosted 'pooler' -> [Pool of persistent TCP/IP connection(s)]->

Externally hosted MySQLD

Существует ли такой инструмент / способ ведения дел?

Мы бы хотели реализовать постоянные подключения mysql БЕЗ использования mysql_pconnect.

Я с уважением прошу, чтобы мы не начали обсуждать, почему постоянные связи не нужны и т. Д. Они есть. У нас заканчиваются порты TIME_WAIT, и у нас возникают другие проблемы, которые могли бы быть решены, если бы был внедрен этот тип системы.

Итак, подведем итоги ... Мы хотели бы реализовать диспетчер соединений mysql, который является сокетом на основе локального конца и сохраняет соединения, которые сделаны с (LAN) внешним сервером mysql.

Мы не используем транзакции или что-либо еще, что может быть затронуто из-за перезапуска соединений mysql.

Мы запускаем linux на внешнем интерфейсе с кластером master + master percona 5.5.

Благодарность!

анонимные один
источник

Ответы:

12

После долгих поисков я наконец нашел решение.

Я не большой писатель, поэтому я сделаю все возможное, чтобы сделать это как можно более кратким.

Итак, насколько я мог найти, есть 2 возможных решения:

SQL Relay

http://sqlrelay.sourceforge.net/

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

PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL

Так что это потребовало бы переписать весь наш код с mysql на sql relay. Не вариант в нашем случае.

При этом, если кто-то планирует новый крупномасштабный проект, который требует какой-либо из многочисленных функций, которые имеет SQL Relay, это звучит прекрасно.

Mysql Proxy

http://forge.mysql.com/wiki/MySQL_Proxy

Это решение, которое мы в конечном итоге использовали.

Ключом к тому, чтобы сделать то, что мы хотим, является пул LUA-скрипт для прокси-сервера mysql.

Это расширение LUA можно найти по адресу:

https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua

Не вдаваясь в подробности, вот некоторые основные статистические данные ... Имейте в виду, это проверяется при НИЗКОМ времени использования:

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537

После переключения на mysql-proxy и разрешения проблем:

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
     32     192    2848

Как вы можете ясно видеть, порты TIME_WAIT для mysql упали почти до нуля.

Соединения теперь фактически постоянны БЕЗ использования mysql_pconnect / mysqli_connect (... p: hostname ...).

Стоит упомянуть, что в верхней части скрипта pooler lua есть несколько настраиваемых параметров.

локальные min_idle_connections

и

локальные max_idle_connections

Они кажутся довольно понятными. Кроме этого: может показаться, что каждая комбинация имени пользователя (и пароля? Непроверенный ... скорее всего, не tho.) Создает свой собственный набор постоянных соединений.

Так что умножьте max_idle_connections на количество уникальных пользователей mysql, которые будут подключаться к базе данных. И это должно дать вам представление о том, сколько свободных соединений у вас будет.

Итак, позвольте мне повторить, чтобы этот небольшой всплеск попал в ключевые слова для тех, кто ищет через Google:

При использовании PHP возможно ли иметь постоянные соединения mysql БЕЗ mysql_pconnect?

Да, это можно сделать с помощью SQL Relay, если вы не возражаете перестроить большую часть своего кода для передачи запросов через их расширение ИЛИ прозрачно, используя mysql-proxy со скриптом ro-pooling.lua.

Мы хотели чего-то подобного уже около года.

НАСЛАЖДАТЬСЯ!

анонимные один
источник
Почему бы просто не использовать функциональность очистки (как указано в ответе ниже), предоставляемую постоянной функцией mysqli ? Если у вас нет доступа к mysqli, почему бы просто не использовать mysql_pconnectи не запускать каждое соединение с некоторыми «функциями очистки»?
Pacerier
4
  1. Поддержка постоянных соединений была введена в PHP 5.3 для mysqliрасширения. Поддержка уже присутствовала в PDO MYSQL и ext / mysql. Идея постоянных соединений заключается в том, что клиентский процесс может повторно использовать соединение между клиентским процессом и базой данных, а не создавать и уничтожать несколько раз. Это уменьшает накладные расходы на создание новых соединений каждый раз, когда они требуются, поскольку неиспользуемые соединения кэшируются и готовы к повторному использованию.

  2. В отличие от расширения mysql, mysqliне предоставляет отдельной функции для открытия постоянных соединений. Чтобы открыть постоянное соединение, вы должны добавить p: к имени хоста при подключении.

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

Постоянное соединение расширения mysqli обеспечивает встроенный код обработки очистки. Очистка, выполняемая mysqli, включает в себя:

Rollback active transactions

Close and drop temporary tables

Unlock tables

Reset session variables

Close prepared statements (always happens with PHP)

Close handler

Release locks acquired with `GET_LOCK()`

Это гарантирует, что постоянные соединения находятся в чистом состоянии по возвращении из пула соединений до того, как клиентский процесс использует их.

Расширение mysqli выполняет эту очистку, автоматически вызывая функцию C-API mysql_change_user().

Функция автоматической очистки имеет свои преимущества и недостатки. Преимущество заключается в том, что программисту больше не нужно беспокоиться о добавлении кода очистки, поскольку он вызывается автоматически. Однако недостатком является то, что код потенциально может быть немного медленнее, поскольку код для выполнения очистки должен запускаться каждый раз, когда соединение возвращается из пула соединений.

Можно отключить код автоматической очистки, скомпилировав PHP с MYSQLI_NO_CHANGE_USER_ON_PCONNECTзаданным значением.

Замечания:

Расширение mysqli поддерживает постоянные соединения при использовании MySQL Native Driver или MySQL Client Library.

Также вы можете ссылаться на эти ссылки: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

Махеш Патил
источник