MySQL Native Driver プラグインAPI

目次

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/mysqlext/mysqliPDO_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 - ユーザーハンドラープラグイン