PHP -> trwałe buforowanie połączeń Mysql BEZ mysql_pconnect - Możliwe?

12

Od jakiegoś czasu próbuję znaleźć dobry sposób na zrobienie tego. Ale trudno było znaleźć odpowiednie elementy do tego celu. Myślę, że to musi być możliwe.

Krótko mówiąc, chciałbym to osiągnąć:

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

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

Externally hosted MySQLD

Czy istnieje takie narzędzie / sposób robienia rzeczy?

Zasadniczo chcielibyśmy zaimplementować trwałe połączenia mysql BEZ użycia mysql_pconnect.

Z szacunkiem proszę, abyśmy nie zaczęli rozmawiać o tym, jak trwałe połączenia nie są potrzebne itp. Są. Kończy nam się porty TIME_WAIT i mamy inne problemy, które zostałyby rozwiązane, gdyby ten typ systemu został wdrożony.

Tak, podsumowując ... Zaimplementowalibyśmy pulę połączeń mysql, która jest gniazdem opartym na lokalnym końcu i utrzymuje połączenia wykonane z zewnętrznie hostowanym serwerem mysql (LAN).

Nie używamy transakcji ani niczego innego, co mogłoby mieć wpływ na recykling połączeń mysql.

Na Linuksie działamy z klastrem master + master percona 5.5.

Dzięki!

anonimowy-jeden
źródło

Odpowiedzi:

12

Po wielu poszukiwaniach w końcu znalazłem rozwiązanie.

Nie jestem pisarzem, więc dołożę wszelkich starań, aby uczynić to tak zwięzłym, jak to możliwe.

O ile mogłem znaleźć, istnieją 2 możliwe rozwiązania:

Przekaźnik SQL

http://sqlrelay.sourceforge.net/

Robi to dokładnie to, o co pytano i wiele innych. Nie będę zbyt szczegółowo omawiał tego, co udało mi się o tym dowiedzieć, ale wspomnę, że nie było to realne rozwiązanie, ponieważ nie jest przejrzyste. Oznacza to, że przepływ jest następujący:

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

Oznaczałoby to przepisanie całego naszego kodu z mysql na przekaźnik sql. W naszym przypadku nie ma takiej opcji.

To powiedziawszy, jeśli ktoś planuje nowy projekt na dużą skalę, który wymaga dowolnej z licznych funkcji SQL Relay, brzmi pięknie.

Proxy MySQL

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

To jest rozwiązanie, z którego ostatecznie skorzystaliśmy.

Kluczem do zrobienia tego, co chcemy, jest pula skryptów LUA dla proxy mysql.

To rozszerzenie LUA można znaleźć pod adresem:

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

Bez wchodzenia w zbyt wiele szczegółów, oto kilka podstawowych statystyk ... Pamiętaj, że jest to testowane przy NISKIM czasie użytkowania:

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

Po przejściu na mysql-proxy i pozostawieniu rzeczy do rozwiązania:

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

Jak wyraźnie widać, porty TIME_WAIT do mysql spadły prawie do zera.

Połączenia są teraz w rzeczywistości trwałe BEZ użycia mysql_pconnect / mysqli_connect (... p: nazwa hosta ...).

Warto wspomnieć, że wydaje się, że istnieje kilka konfigurowalnych ustawień w górnej części skryptu lua poolera.

lokalne min_idle_connections

i

lokalne max_idle_connections

Te wydają się dość oczywiste. Tyle że: Wygląda na to, że każda kombinacja nazwy użytkownika (i hasła? Nieprzetestowane ... najprawdopodobniej nie) tworzy własny zestaw trwałych połączeń.

Pomnóż więc max_idle_connections przez liczbę unikalnych użytkowników mysql, którzy będą łączyć się z bazą danych. To powinno dać ci wyobrażenie o liczbie bezczynnych połączeń.

Powtórzę więc, aby ten mały napis trafił kilka słów kluczowych dla osób szukających za pośrednictwem Google:

Czy używając PHP można mieć trwałe połączenia mysql BEZ mysql_pconnect?

Tak, można to zrobić za pomocą przekaźnika SQL, jeśli nie masz nic przeciwko przebudowaniu większości kodu, aby przesyłać zapytania przez ich rozszerzenie LUB przejrzyście, używając mysql-proxy ze skryptem ro-pooling.lua.

Chcemy czegoś takiego od około roku.

CIESZYĆ SIĘ!

anonimowy-jeden
źródło
Dlaczego nie skorzystać z funkcji czyszczenia (jak podano w odpowiedzi poniżej) zapewnianej przez trwałą funkcję mysqli ? Jeśli nie masz dostępu do mysqli, dlaczego po prostu nie użyjesz mysql_pconnecti nie uruchomisz każdego połączenia za pomocą niektórych „funkcji czyszczenia”?
Pacerier
4
  1. Stała obsługa połączeń została wprowadzona w PHP 5.3 dla mysqlirozszerzenia. Wsparcie było już obecne w PDO MYSQL i ext / mysql. Idea trwałych połączeń polega na tym, że połączenie między procesem klienta a bazą danych może być ponownie wykorzystane przez proces klienta, a nie wielokrotnie tworzone i niszczone. Zmniejsza to narzut związany z tworzeniem nowych połączeń za każdym razem, gdy jest to wymagane, ponieważ nieużywane połączenia są buforowane i gotowe do ponownego użycia.

  2. W przeciwieństwie do rozszerzenia mysql, mysqlinie zapewnia osobnej funkcji do otwierania trwałych połączeń. Aby otworzyć trwałe połączenie, musisz połączyć p: z nazwą hosta podczas łączenia.

  3. Problem z trwałymi połączeniami polega na tym, że klienci mogą pozostawić je w nieprzewidzianych stanach. Na przykład blokada tabeli może zostać aktywowana, zanim klient nieoczekiwanie zakończy pracę. Nowy proces klienta wykorzystujący to trwałe połączenie uzyska połączenie „tak jak jest”. Proces czyszczenia musiałby zostać przeprowadzony przez nowy proces klienta, zanim będzie mógł dobrze wykorzystać trwałe połączenie, zwiększając obciążenie programisty.

Trwałe połączenie rozszerzenia mysqli zapewnia jednak wbudowany kod obsługi czyszczenia. Oczyszczanie przeprowadzone przez mysqli obejmuje:

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

Zapewnia to, że trwałe połączenia są w stanie czystym po powrocie z puli połączeń, zanim proces klienta ich użyje.

Rozszerzenie mysqli wykonuje to czyszczenie, automatycznie wywołując funkcję C-API mysql_change_user().

Funkcja automatycznego czyszczenia ma jednak zalety i wady. Zaletą jest to, że programista nie musi się już martwić dodaniem kodu czyszczącego, ponieważ jest on wywoływany automatycznie. Wadą jest jednak to, że kod może być nieco wolniejszy, ponieważ kod wykonujący czyszczenie musi być uruchamiany za każdym razem, gdy połączenie jest zwracane z puli połączeń.

Możliwe jest wyłączenie kodu automatycznego czyszczenia, kompilując PHP ze MYSQLI_NO_CHANGE_USER_ON_PCONNECTzdefiniowanym.

Uwaga:

Rozszerzenie mysqli obsługuje trwałe połączenia przy użyciu MySQL Native Driver lub MySQL Client Library.

Możesz również skorzystać z tych linków: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

Mahesh Patil
źródło