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

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

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

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

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

Externally hosted MySQLD

Есть ли такой способ /способ выполнения вещей?

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

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

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

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

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

Спасибо!

12 голосов | спросил anonymous-one 7 PMpSat, 07 Apr 2012 14:39:39 +040039Saturday 2012, 14:39:39

2 ответа


11

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

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

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

Реле SQL

http://sqlrelay.sourceforge.net/

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

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

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

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

Прокси-сервер Mysql

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

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

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

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

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

Не вдаваясь в подробности, вот некоторые основные статистические данные ... Напомним, что это проверено в LOW время использования:

[[email protected] etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537

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

[[email protected] etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
     32     192    2848

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

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

Следует упомянуть несколько настраиваемых настроек рядом с вершиной сценария пула lua.

local min_idle_connections

и

local max_idle_connections

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

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

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

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

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

Мы хотели что-то вроде этого примерно через год.

НАСЛАЖДАЙТЕСЬ!

ответил anonymous-one 12 PMpThu, 12 Apr 2012 13:12:39 +040012Thursday 2012, 13:12:39
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 /являются-PHP-стойкие-соединения-зло /

ответил Mahesh Patil 12 AMpThu, 12 Apr 2012 09:23:58 +040023Thursday 2012, 09:23:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132