PHP-> mysql永続接続プーリングmysql_pconnectなし-可能ですか?


12

しばらくの間、これを行うための良い方法を見つけようとしてきました。しかし、これを行うための適切なピースを見つけるのに苦労しました。私はこれが可能でなければならないと推測しています。

ここで簡単に言えば、私が達成したいことです。

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

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

Externally hosted MySQLD

そのようなツール/物事を行う方法は存在しますか?

基本的に、mysql_pconnectを使用せずに永続的なmysql接続を実装したいと思います。

永続的な接続が必要ないなどについて議論し始めないように、私は丁重にお願いします。TIME_WAITポートが不足しており、このタイプのシステムが実装された場合に解決される他の問題があります。

つまり、要約すると...ローカルエンドに基づいたソケットであるmysql接続プーラーを実装し、外部でホストされた(LAN)mysqlサーバーへの接続を維持します。

mysql接続がリサイクルされることで影響を受けるトランザクションやその他のものは使用しません。

マスター+マスターpercona 5.5クラスターを使用して、フロントエンドでLinuxを実行しています。

ありがとう!

回答:


12

よく調べた結果、最終的に解決策を見つけました。

私はあまり作家ではないので、できるだけ簡潔にするために最善を尽くします。

だから私が見つけることができる限り、2つの可能な解決策があります:

SQLリレー

http://sqlrelay.sourceforge.net/

これは、質問が求めていたものを正確に実行し、さらに多くを行います。私はこれについて何を見つけることができたかについてあまり詳しくは述べませんが、それは透明ではないので実行可能な解決策ではなかったことに言及します。フローが次のとおりであることを意味します。

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

そのため、これにはすべてのコードをmysqlからsql relayに書き換える必要がありました。私たちの場合はオプションではありません。

そうは言っても、誰かがSQLリレーが持つ多数の機能のいずれかを必要とする新鮮な大規模プロジェクトを計画している場合、それは美しいように聞こえます。

Mysqlプロキシ

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

これが最終的に使用したソリューションです。

これを実行するためのキーは、mysqlプロキシ用のLUAスクリプトをプールすることです。

この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-proxyに切り替えて、物事を落ち着かせた後:

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

明らかなように、mysqlへのTIME_WAITポートはほとんどありません。

現在、接続はmysql_pconnect / mysqli_connect(... p:hostname ...)を使用せずに永続的になっています。

言及する価値があるのは、pooler luaスクリプトの上部近くにいくつかの構成可能な設定があるようです。

ローカルmin_idle_connections

そして

ローカルmax_idle_connections

これらは自明のようです。それを除いて:各ユーザー名(およびパスワード?テストされていない...おそらくそうではない)の組み合わせは、永続的な接続の独自のセットを作成します。

したがって、max_idle_connectionsに、データベースに接続する一意のmysqlユーザーの数を掛けます。そして、これにより、アイドル状態の接続がいくつになるかがわかります。

繰り返しになりますが、この小さな宣伝文句は、Google経由で検索しているユーザーの一部のキーワードに当てはまります。

PHPを使用する場合、mysql_pconnectなしで永続的なmysql接続を確立できますか?

はい。これは、拡張機能を介してクエリをパイプするためにコードの大部分を再構築する必要がない場合、またはmysql-proxyをro-pooling.luaスクリプトとともに透過的に使用する場合、SQLリレー経由で実行できます。

私たちは約1年間、このようなものを望んでいます。

楽しい!


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

ただし、自動クリーンアップ機能には長所と短所があります。利点は、自動的に呼び出されるため、プログラマがクリーンアップコードの追加を心配する必要がなくなることです。ただし、デメリットは、接続プールから接続が返されるたびにクリーンアップを実行するコードを実行する必要があるため、コードが少し遅くなる可能性があることです。

MYSQLI_NO_CHANGE_USER_ON_PCONNECT定義済みのPHPをコンパイルすることにより、自動クリーンアップコードをオフにすることができます。

注意:

mysqli拡張機能は、MySQL Native DriverまたはMySQL Client Libraryを使用する場合の永続的な接続をサポートします。

また、次のリンクも参照できます。http//www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.