MySQL Native Driver プラグインAPI
目次
- mysqlndプラグイン と MySQL Proxyの比較
- mysqlnd plugin APIを取得する
- MySQL Native Driverプラグイン のアーキテクチャ
- mysqlnd のプラグインAPI
- mysqlndプラグインの開発をはじめよう
The MySQL Native Driver プラグインAPI は MySQL Native Driver、略して mysqlnd
が持つ機能の一つです。mysqlnd
プラグインは、PHPアプリケーションと MySQL サーバーの間にあるレイヤで動きます。これは MySQL Proxy と比較できます。MySQL Proxy はあらゆる MySQL クライアントアプリケーション、たとえば PHPアプリケーション と MySQL サーバーの間のレイヤで動きます。mysqlnd
プラグインは典型的な MySQL Proxy のタスク、たとえばロードバランシングやモニタリング、パフォーマンスの最適化をこなせます。アーキテクチャや置かれる場所が異なるため、mysqlnd
プラグインは MySQL Proxy が持ついくつかの欠点がありません。たとえば、プラグインを使えば、単一障害点が存在しませんし、専用のプロキシサーバーをデプロイする必要もありませんし、新しいプログラミング言語(Lua) を学ぶ必要もありません。
mysqlnd
プラグインは mysqlnd
の拡張と考えることができます。プラグインは 多くの mysqlnd
関数の制御を奪い取ることができます。mysqlnd
関数は ext/mysql
や ext/mysqli
、PDO_MYSQL
のような PHP の MySQL拡張モジュールによって呼び出されます。その結果として、mysqlnd
プラグイン はクライアントアプリケーションからこれらの拡張モジュールへの呼び出しの制御をすべて奪うことができるのです。
内部的な mysqlnd
関数の呼び出しも制御を奪ったり、処理を置き換えたりすることができます。mysqlnd
の内部的な関数テーブルを管理することに関しても全く制限がありません。ある mysqlnd
関数が mysqlnd
を使う拡張モジュールによって呼び出される場合に、適切な mysqlnd
プラグインの適切な関数に処理を転送するようにセットアップすることが可能です。このように、mysqlnd
の内部関数テーブルを管理できることで、プラグインの柔軟性が最大限に発揮できるのです。
mysqlnd
プラグインは、実際は mysqlnd
のプラグインAPI (これは MySQL Native Driver, 略して mysqlnd
に組み込まれています) を使い、C言語 で書かれた PHP拡張モジュール です。 プラグインは PHPアプリケーションに対して 100% 透過的です。つまり、プラグインがPHPアプリケーションとは異なるレイヤで動作するため、アプリケーションを変更する必要がないのです。mysqlnd
プラグイン は、mysqlnd
のひとつ下のレイヤで動くと考えることができます。
mysqlnd
プラグインで実現可能なアプリケーションのリストをいくつか以下に示します
-
ロードバランシング
-
読み取り/書き込み の分割。例として、PECL/mysqlnd_ms (Master Slave) が挙げられます。この 拡張モジュール は 読み取り/書き込み のクエリをレプリケーションのセットアップ向けに分割します。
-
フェイルオーバー
-
ラウンドロビン, 負荷が一番低いサーバーへの転送
-
-
サーバーの監視
-
クエリのロギング
-
クエリの分析
-
クエリの監査。例として、PECL/mysqlnd_sip (SQL Injection Protection) が挙げられます。この 拡張モジュール はクエリを調べ、ルールセットに従って許可されたクエリのみを実行します。
-
-
パフォーマンスの向上
-
キャッシュ。例として、PECL/mysqlnd_qc (Query Cache) が挙げられます。
-
トラフィックの調整
-
シャーディング。例として、PECL/mysqlnd_mc (Multi Connect) が挙げられます。この拡張モジュール は、SELECT ステートメントを SELECT ... LIMIT part1, SELECT LIMIT part_n という形でn個に分割します。そしてクエリを別々の MySQLサーバーに送り、結果をクライアント側でマージします。
-
利用可能な MySQL Native Driverプラグイン
既にたくさんの mysqlnd プラグインが利用可能になっています。以下が含まれます。
-
PECL/mysqlnd_mc - 複数接続ができるプラグイン
-
PECL/mysqlnd_ms - マスタースレーブ構成用のプラグイン
-
PECL/mysqlnd_qc - クエリキャッシュプラグイン
-
PECL/mysqlnd_pscache - プリペアドステートメントハンドルをキャッシュするプラグイン
-
PECL/mysqlnd_sip - SQLインジェクションから防御するためのプラグイン
-
PECL/mysqlnd_uh - ユーザーハンドラープラグイン