## mysqlndプラグイン と MySQL Proxyの比較

`mysqlnd`プラグインと MySQL Proxyは、異なるアプローチを用いた異なる技術です。どちらもロードバランシングや監視、パフォーマンスの向上のような共通の様々な課題を解決するのに適したツールです。重要な違いは、MySQL Proxyがあらゆる MySQLクライアント と協調して動作するのに対して、`mysqlnd`プラグインは PHPアプリケーション との協調動作に特化しているということです。

PHP拡張モジュールとして、`mysqlnd`プラグイン はPHPの残りの部分とともに、PHPのアプリケーションサーバーにインストールされます。MySQL Proxy はPHPアプリケーションサーバー上でも動作しますし、複数のPHPアプリケーションサーバーを扱う専用マシンにもインストールできます。

MySQL Proxyをアプリケーションサーバーにデプロイすることにはふたつの利点があります:

1. 単一障害点がありません
2. スケールアウトしやすい (水平方向へのスケールアウト、クライアントによるスケーリング)

MySQL Proxy (と、`mysqlnd`プラグイン) は、他のやり方だと既存のアプリケーションを変更しなければならない問題にも容易に対処することができます。

しかし、MySQL Proxyにはいくつか欠点があります:

- MySQL Proxy のコンポーネントと技術について新たにマスターし、デプロイしなければなりません。
- MySQL Proxy は Lua スクリプト言語の知識が必要です。

MySQL Proxy は C言語と プログラミング言語 Lua によってカスタマイズできます。Lua は MySQL Proxy において好ましいスクリプト言語です。ほとんどのPHPエキスパートにとって、Lua は新しく学ばなければならない言語です。`mysqlnd`プラグインは C言語で書くことができます。» PECL/mysqlnd_uh を使って、プラグインを PHP で書くこともできます。

MySQL Proxy はデーモン - バックグラウンドのプロセスとして動作します。MySQL Proxy は初期の決定を取り消すこともできますが、すべての状態を保持することできます。しかしながら `mysqlnd`プラグインは、PHPのリクエスト単位のライフサイクルに結びついています。MySQL Proxy は一度計算された結果を複数のアプリケーションサーバーで共有できます。`mysqlnd`プラグインでこれを行うには、永続的なストレージにデータを保存する必要があります。この目的のためには Memcache のような別のデーモンが必要です。この場合は、MySQL Proxy に有利です。

MySQL Proxy は wire protocol (訳注：ネットワークを通じてデータを転送するプロトコル。» WikipediaでのWire Protocolの説明, » StackOverflow でのWire Protocolの説明) の上で動作します。MySQL Proxy を使うと、MySQLクライアントサーバープロトコルを解析し、リバースエンジニアリングしなければなりません。MySQL Proxy でできることは、通信プロトコルを管理することで達成できることに限られます。wire protocol が変更(滅多にありませんが)されると、MySQL Proxy のスクリプトも変更する必要があります。

`mysqlnd`プラグインは C言語のAPI上で動作します。このAPIは `libmysqlclient`クライアント の動きをそのままコピーしています。この C言語のAPI は、 基本的に MySQLクライアントサーバープロトコル、時に wire protocol と呼ばれるもののラッパーです。開発者は C言語のAPI呼び出しの制御を奪うことができます。それゆえに、wire protocol レベルのプログラムに一切変更を加えることなく、すべてのPHP呼び出しをフックできるのです。

`mysqlnd` は wire protocol を実装しています。そのため、プラグインは通信プロトコルを解析し、リバースエンジニアリングし、管理できるばかりか、通信プロトコルを置き換えることだってできます。ただ、こんなことをする必要は通常ありません。

プラグインが 2つのレベル(C言語のAPI と wire protocol) を使って実装できるので、MySQL Proxy よりも大きな柔軟性を得られます。 `mysqlnd`プラグインが C言語のAPI を使って実装されれば、wire protocol に対していかなる変更が行われても、プラグインへの変更は必要ありません。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open