mysqlnd_ms
PHP Manual

導入

このプラグインは、MySQL のレプリケーション機能を mysqlnd を使うすべての PHP MySQL 拡張モジュールで容易に使えるようにします。

PHP 5.3.3 以降で、PHP の MySQL Native Driver (mysqlnd) は C の内部プラグイン API を提供するようになりました。 レプリケーションおよびロードバランシング用プラグインのように C でプラグインを書いて、 mysqlnd の機能を拡張できるようになったのです。

MySQL Native Driver は C のライブラリで、PHP 5.3.0 以降で PHP に同梱されるようになりました。MySQL Client Library (libmysql/libmysqlclient) の代替として機能します。mysqlnd を使う利点はいろいろあります。 PHP に同梱されているので追加のダウンロードが不要であること、 PHP ライセンスで公開されていること、メモリの消費量が抑えられること、 そして非同期クエリなどの新たな機能が含まれていることなどです。

mysqlnd_ms のような mysqlnd 用プラグインの機能の大部分は、 ユーザーの視点からはプラグインの存在を意識せずに使えます。このプラグインはすべての PHP アプリケーションをサポートし、そしてすべての MySQL 用 PHP 拡張モジュールに対応します。既存の API には何も手を加えません。 そのため、既存の PHP アプリケーションにも容易に組み込めます。

注意:

このプラグインはベータ版であり、まだ機能的には不完全です。

主要な機能

PECL/mysqlnd_ms の主要な機能をまとめます。

制限

このプラグインでは、複数マスタ構成での MySQL のレプリケーションには対応していません。 実験的な設定項目 mysqlnd_ms.multi_master がバージョン 1.1.0-beta で追加され、 この制限をなくして MySQL Cluster のような同期クラスタを使えるようにしようとしているところです。

読み込み/書き込みの分離の仕組みとして組み込まれている機能は、非常に基本的なものです。 SELECT で始まるクエリは読み込みリクエストとみなして MySQL のスレーブサーバーに送り、それ以外のすべてのクエリは (SHOW ステートメントなども含めて) 書き込みリクエストとみなして MySQL マスタサーバーに送ります。 この組み込みの挙動を上書きするために、 SQL ヒント やユーザー定義の コールバック関数 を使えます。

読み込み/書き込みの分離機能は、複数ステートメントの場合を考慮しません。 複数のステートメントも単一のステートメントとみなします。 そして、その先頭の文字を見て、どこで実行させるのかを判断します。たとえば mysqli_multi_query() を使って SELECT id FROM test ; INSERT INTO test(id) VALUES (1) を実行したとすると、この処理はスレーブサーバーに送られます。先頭が SELECT で始まるからです。後半には INSERT ステートメントも含まれていますが、 これもそのままスレーブサーバー上で実行されます。

1.1.0-beta より前のバージョンでは、このプラグインは ネイティブのプリペアドステートメントに対応していませんでした。 PDO_MySQL はデフォルトで、クライアント側でプリペアドステートメントをエミュレートしていたことに注意しましょう。 クライアント側でエミュレートしたプリペアドステートメントについては、 このプラグインのすべてのバージョンで対応しています。 このエミュレーションはネイティブのプリペアドステートメントを使っていないからです。 PHP ベースのデータベース抽象化ライブラリを使う場合は、 クライアント側でのプリペアドステートメントのエミュレーションを行っているのかどうかをマニュアルで調べましょう。

注意:

アプリケーション側では、ロードバランシングのための接続の切り替えが発生することを想定しなければなりません。 マニュアルの 接続プーリングと切り替えトランザクションの処理フェイルオーバーロードバランシング そして 読み込み/書き込みの分離 を確認しましょう。

名前の由来

mysqlnd_msmysqlnd master slave plugin の略です。 概念実証のためのコードをざっと書きあげるときに、この名前を選びました。 当時は、まさかそのコードを使い続けることになるとは思わなかったのです。


mysqlnd_ms
PHP Manual