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, яке є сокетом, заснованим на локальному кінці, і зберігає з'єднання, які здійснюються до (локальної мережі) зовнішнього розміщеного mysql-сервера.

Ми не використовуємо транзакції чи інше, що впливало б на обробку MySQL-з'єднань.

Ми працюємо на передньому кінці Linux з кластером master + master percona 5.5.

Дякую!

Відповіді:


12

Після довгих пошуків я нарешті знайшов рішення.

Я не дуже письменник, тому зроблю все можливе, щоб зробити це максимально стислим.

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

Реле SQL

http://sqlrelay.sourceforge.net/

Це робить саме те, про що задавали питання, і ще багато. Я не буду надто детально описувати те, що мені вдалося дізнатися про це, але зазначу, що це не було життєздатним рішенням, оскільки воно не прозоре. Значить, потік такий:

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

Отже, це передбачало б переписання всього нашого коду з mysql на реле sql. У нашому випадку це не варіант.

Все, що говорити, якщо хтось планує свіжий масштабний проект, який вимагає будь-якої з численних функцій, які має 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

Не вдаючись до занадто багато деталей, ось основні статистичні дані ... Майте на увазі, це перевірено в низький час використання:

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

Після переходу на mysql-проксі і дозволити всім вирішуватися:

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

Як ви добре бачите, TIME_WAIT портів до mysql впав майже до жодного.

Підключення фактично стійкі БЕЗ використання mysql_pconnect / mysqli_connect (... p: ім'я хоста ...).

Варто згадати, що, здається, є кілька настроюваних налаштувань біля верхньої частини скрипту lua у пулі.

локальні min_idle_connections

і

локальні max_idle_connections

Вони здаються досить зрозумілими. За винятком цього: Здається, що кожне ім'я користувача (і пароль? Неперевірений ... швидше за все, не тхо.) Поєднання створює власний набір стійких з'єднань.

Отже, помножте 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.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.