PHP -> Mysql pooling koneksi persisten TANPA mysql_pconnect - Kemungkinan?

12

Saya telah mencoba mencari cara yang bagus untuk melakukan ini untuk sementara waktu sekarang. Tetapi mengalami kesulitan menemukan potongan yang tepat untuk melakukan ini. Saya kira ini pasti mungkin.

Singkatnya, inilah yang ingin saya capai:

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

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

Externally hosted MySQLD

Apakah ada alat / cara untuk melakukan sesuatu?

Kami pada dasarnya ingin menerapkan koneksi mysql persisten TANPA menggunakan mysql_pconnect.

Dengan penuh hormat saya meminta agar kita tidak mulai membahas tentang bagaimana koneksi yang gigih tidak diperlukan dll. Kami kehabisan port TIME_WAIT, dan mengalami masalah lain yang akan dipecahkan jika sistem jenis ini diterapkan.

Jadi ya, untuk meringkas ... Kami akan mengimplementasikan pooler koneksi mysql yang soket berdasarkan pada ujung lokal, dan tetap koneksi yang dibuat ke (LAN) server mysql yang di-host secara eksternal.

Kami tidak menggunakan transaksi atau hal lain yang akan terpengaruh dari koneksi mysql yang didaur ulang.

Kami menjalankan linux di ujung depan dengan klaster master + master percona 5.5.

Terima kasih!

anonim-satu
sumber

Jawaban:

12

Setelah banyak mencari, akhirnya saya menemukan solusinya.

Saya tidak terlalu penulis, jadi saya akan melakukan yang terbaik untuk membuat ini sesingkat mungkin.

Sejauh yang saya bisa temukan, ada 2 solusi yang mungkin:

Relay SQL

http://sqlrelay.sourceforge.net/

Ini melakukan persis apa yang ditanyakan, dan banyak lagi. Saya tidak akan membahas terlalu banyak tentang apa yang saya dapat temukan tentang ini tetapi akan menyebutkan bahwa itu bukan solusi yang layak karena tidak transparan. Artinya alirannya adalah sebagai berikut:

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

Jadi ini akan melibatkan penulisan ulang semua kode kami dari mysql ke sql relay. Bukan pilihan dalam kasus kami.

Semua itu dikatakan, jika seseorang merencanakan segar proyek skala besar yang membutuhkan salah satu dari banyak fitur yang SQL Relay memiliki, kedengarannya indah.

Proksi Mysql

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

Ini adalah solusi yang akhirnya kami gunakan.

Kunci untuk melakukan ini melakukan apa yang kita inginkan adalah skrip penyatuan LUA untuk proxy mysql.

Perpanjangan LUA ini dapat ditemukan di:

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

Tanpa terlalu rinci, berikut adalah beberapa statistik dasar ... Ingat, ini diuji pada waktu penggunaan RENDAH:

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

Setelah beralih ke mysql-proxy, dan membiarkan semuanya beres:

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

Seperti yang Anda lihat dengan jelas, port TIME_WAIT ke mysql telah turun hampir tidak ada.

Koneksi sekarang sebenarnya persisten TANPA menggunakan mysql_pconnect / mysqli_connect (... p: nama host ...).

Layak disebutkan ada beberapa pengaturan yang dapat dikonfigurasi di dekat bagian atas script pooler lua.

min_idle_connections lokal

dan

max_idle_connections lokal

Ini tampaknya cukup jelas. Kecuali itu: Akan muncul bahwa setiap kombinasi nama pengguna (dan kata sandi? Belum teruji ... kemungkinan besar bukan.) Menciptakan rangkaian koneksi persistennya sendiri.

Jadi gandakan max_idle_connections dengan jumlah pengguna mysql unik yang akan terhubung ke database. Dan itu akan memberi Anda gambaran tentang berapa banyak koneksi idle Anda akhirnya akan memiliki.

Jadi, izinkan saya mengulangi kembali sehingga sedikit uraian singkat ini mengenai beberapa kata kunci untuk mereka yang mencari melalui google:

Ketika menggunakan PHP, apakah mungkin untuk memiliki koneksi mysql persisten TANPA mysql_pconnect?

Ya, ini bisa dilakukan melalui SQL Relay jika Anda tidak keberatan membangun kembali sebagian besar kode Anda untuk mengirimkan pertanyaan melalui ekstensi ATAU secara transparan menggunakan mysql-proxy dengan skrip ro-pooling.lua.

Kami telah menginginkan sesuatu seperti ini selama sekitar satu tahun sekarang.

NIKMATI!

anonim-satu
sumber
Mengapa tidak menggunakan fungsionalitas pembersihan (seperti yang dinyatakan oleh jawaban di bawah) yang disediakan oleh fungsi persisten mysqli ? Jika Anda tidak memiliki akses ke mysqli, Mengapa tidak menggunakan mysql_pconnectdan memulai setiap koneksi dengan beberapa "fungsi pembersihan"?
Pacerier
4
  1. Dukungan koneksi gigih diperkenalkan di PHP 5.3 untuk mysqliekstensi. Dukungan sudah ada di PDO MYSQL dan ext / mysql. Gagasan di balik koneksi persisten adalah bahwa koneksi antara proses klien dan database dapat digunakan kembali oleh proses klien, daripada dibuat dan dihancurkan beberapa kali. Ini mengurangi overhead untuk membuat koneksi baru setiap kali diperlukan, karena koneksi yang tidak digunakan di-cache dan siap untuk digunakan kembali.

  2. Berbeda dengan ekstensi mysql, mysqlitidak menyediakan fungsi terpisah untuk membuka koneksi persisten. Untuk membuka koneksi persisten, Anda harus menambahkan p: ke nama host saat menghubungkan.

  3. Masalah dengan koneksi terus-menerus adalah bahwa mereka dapat dibiarkan dalam keadaan yang tidak terduga oleh klien. Misalnya, kunci meja mungkin diaktifkan sebelum klien berhenti secara tak terduga. Proses klien baru menggunakan kembali koneksi persisten ini akan mendapatkan koneksi "apa adanya". Pembersihan apa pun perlu dilakukan oleh proses klien baru sebelum dapat memanfaatkan koneksi persisten dengan baik, sehingga menambah beban pada programmer.

Sambungan terus-menerus dari ekstensi mysqli menyediakan kode penanganan pembersihan bawaan. Pembersihan yang dilakukan oleh mysqli meliputi:

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()`

Ini memastikan bahwa koneksi yang persisten berada dalam kondisi bersih saat kembali dari kumpulan koneksi, sebelum proses klien menggunakannya.

Ekstensi mysqli melakukan pembersihan ini dengan secara otomatis memanggil fungsi C-API mysql_change_user().

Fitur pembersihan otomatis memiliki kelebihan dan kekurangan. Keuntungannya adalah bahwa programmer tidak perlu lagi khawatir tentang menambahkan kode pembersihan, seperti yang disebut secara otomatis. Namun, kerugiannya adalah bahwa kode berpotensi menjadi sedikit lebih lambat, karena kode untuk melakukan pembersihan perlu dijalankan setiap kali koneksi dikembalikan dari kumpulan koneksi.

Dimungkinkan untuk mematikan kode pembersihan otomatis, dengan mengkompilasi PHP dengan yang MYSQLI_NO_CHANGE_USER_ON_PCONNECTditentukan.

catatan:

Ekstensi mysqli mendukung koneksi persisten saat menggunakan Driver Native MySQL atau Library Klien MySQL.

Anda juga dapat merujuk tautan ini: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

Mahesh Patil
sumber