PHP -> Mysql kalıcı bağlantı havuz mysql_pconnect OLMADAN - Mümkün mü?


12

Bir süredir bunu yapmanın güzel bir yolunu bulmaya çalışıyorum. Ancak bunu yapmak için doğru parçaları bulmakta zorlandınız. Bunun mümkün olabileceğini tahmin ediyorum.

Burada basit terimlerle ifade etmek gerekirse:

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

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

Externally hosted MySQLD

Böyle bir araç / iş yapmanın yolu var mı?

Biz temelde mysql_pconnect kullanarak OLMADAN kalıcı mysql bağlantıları uygulamak istiyoruz.

Saygıdeğer bağlantıların nasıl gerekli olmadığı vb. Hakkında tartışmaya başlamadığımızı saygıyla soruyorum. TIME_WAIT bağlantı noktalarımız tükeniyor ve bu tür bir sistem uygulandığında çözülecek başka sorunlar yaşıyoruz.

Yani evet, özetlemek gerekirse ... Biz yerel uca dayalı soket olan ve (LAN) harici olarak barındırılan bir mysql sunucusuna yapılan bağlantıları devam eden bir mysql bağlantı havuzcu uygulamak olacaktır.

Geri dönüştürülen mysql bağlantılarından etkilenecek işlemleri veya başka bir şey kullanmıyoruz.

Linux + master percona 5.5 kümesiyle ön uçta çalışıyoruz.

Teşekkürler!

Yanıtlar:


12

Çok araştırma yaptıktan sonra sonunda bir çözüm buldum.

Ben bir yazar değilim, bu yüzden bunu olabildiğince özlü hale getirmek için elimden geleni yapacağım.

Bulabildiğim kadarıyla, 2 olası çözüm var:

SQL Geçişi

http://sqlrelay.sourceforge.net/

Bu tam olarak sorunun sorduğunu ve daha fazlasını yapar. Bu konuda ne bulabildim konusunda çok fazla ayrıntıya girmeyeceğim, ancak şeffaf olmadığı için uygulanabilir bir çözüm olmadığını söyleyeceğim. Akışın şu şekilde olduğu anlamına gelir:

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

Bu, mysql'den sql rölesine tüm kodumuzu yeniden yazmayı gerektiriyordu. Bizim durumumuzda bir seçenek değil.

Tüm bunlar söyleniyor, eğer birisi SQL Relay'ın sahip olduğu sayısız özellikten herhangi birini gerektiren taze büyük ölçekli bir proje planlıyorsa , kulağa hoş geliyor.

MySQL Proxy

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

Sonunda kullandığımız çözüm bu.

Bunu yapmak istediğimiz şeyi yapmanın anahtarı, mysql proxy için havuzlama LUA komut dosyasıdır.

Bu LUA uzantısı şu adreste bulunabilir:

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

Çok fazla ayrıntıya girmeden, bazı temel istatistikler şunlardır ... Unutmayın, bu DÜŞÜK kullanım zamanında test edilir:

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

Mysql-proxy'ye geçtikten ve bir şeylerin yerleşmesine izin verdikten sonra:

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

Gördüğünüz gibi, mysql'e giden TIME_WAIT bağlantı noktaları neredeyse hiçine düşmedi.

Artık bağlantılar mysql_pconnect / mysqli_connect (... p: hostname ...) kullanarak OLMADAN kalıcıdır .

Bahsetmeye değer, havuzcu lua betiğinin üst kısmında birkaç yapılandırılabilir ayar olduğu görülmektedir.

yerel min_idle_connections

ve

yerel max_idle_connections

Bunlar oldukça açıklayıcı görünüyor. Bunun dışında: Her kullanıcı adı (ve parola? Denenmemiş ... büyük olasılıkla tho değil) kombinasyonunun kendi kalıcı bağlantıları oluşturduğu anlaşılıyor.

Yani max_idle_connections veritabanına bağlanacak benzersiz mysql kullanıcı sayısı ile çarpın. Ve bu size kaç tane boşta bağlantı kuracağınız konusunda bir fikir verecektir.

Bu nedenle, bu küçük bulanıklığın google üzerinden arama yapanlar için bazı anahtar kelimelere çarpması için tekrar edeyim:

PHP kullanırken mysql_pconnect OLMADAN kalıcı mysql bağlantıları olması mümkün mü?

Evet, sorgularınızın çoğunu uzantıları aracılığıyla iletmek için kodunuzun çoğunu yeniden yapılandırmak veya ro-pooling.lua komut dosyasıyla mysql-proxy kullanarak şeffaf bir şekilde sakıncası yoksa bu SQL Relay ile yapılabilir.

Yaklaşık bir yıldır böyle bir şey istiyoruz.

ZEVK ALMAK!


Neden mysqli'nin kalıcı işlevi tarafından sağlanan temizleme işlevini (aşağıdaki yanıtta belirtildiği gibi) kullanmıyorsunuz ? MySQL'e erişiminiz yoksa, Neden mysql_pconnecther bağlantıyı bazı "temizleme işlevleriyle" kullanmaya başlamıyorsunuz?
Pacerier

4
  1. Kalıcı bağlantı desteği PHP 5.3'te mysqlieklenti için tanıtıldı . PDO MYSQL ve ext / mysql'de destek zaten mevcuttu. Kalıcı bağlantıların ardında yatan fikir, bir istemci işlemi ile bir veritabanı arasındaki bağlantının, birden çok kez oluşturulup imha edilmek yerine bir istemci işlemi tarafından yeniden kullanılabilmesidir. Bu, kullanılmayan bağlantılar önbelleğe alındığı ve yeniden kullanılmaya hazır olduğu için, her gerektiğinde yeni bağlantı oluşturma yükünü azaltır.

  2. Mysql uzantısının aksine, mysqlikalıcı bağlantıları açmak için ayrı bir işlev sağlamaz. Kalıcı bir bağlantı açmak için, bağlanırken ana bilgisayar adına p: eklemelisiniz.

  3. Kalıcı bağlantılardaki sorun, istemciler tarafından öngörülemeyen durumlarda bırakılabilmeleridir. Örneğin, bir istemci kilidi beklenmedik şekilde sona ermeden önce bir tablo kilidi etkinleştirilebilir. Bu kalıcı bağlantıyı yeniden kullanan yeni bir istemci işlemi, bağlantıyı "olduğu gibi" alacaktır. Kalıcı bağlantıdan faydalanabilmek için programcı üzerindeki yükü artırabilmek için herhangi bir temizleme işleminin yeni istemci işlemi tarafından yapılması gerekir.

Ancak mysqli uzantısının kalıcı bağlantısı yerleşik temizleme işleme kodu sağlar. MySQLi tarafından yapılan temizlik şunları içerir:

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

Bu, istemci işlemi kullanmadan önce kalıcı bağlantıların bağlantı havuzundan döndüğünde temiz durumda olmasını sağlar.

Mysqli uzantısı bu temizlemeyi otomatik olarak C-API işlevini çağırarak yapar mysql_change_user().

Otomatik temizleme özelliğinin avantajları ve dezavantajları vardır. Avantajı, programlayıcının otomatik olarak çağrıldığı için artık temizleme kodu ekleme konusunda endişelenmesine gerek olmamasıdır. Bununla birlikte, dezavantajı, temizleme havuzunu gerçekleştiren kodun bağlantı havuzundan her bağlantı döndüğünde çalıştırılması gerektiğinden, kodun potansiyel olarak biraz daha yavaş olabilmesidir.

MYSQLI_NO_CHANGE_USER_ON_PCONNECTTanımlanmış PHP'yi derleyerek otomatik temizleme kodunu kapatmak mümkündür .

Not:

MySQL yerel sürücüsü veya MySQL istemci kitaplığı kullanılırken mysqli uzantısı kalıcı bağlantıları destekler.

Ayrıca bu bağlantılara başvurabilirsiniz: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.