このセクションでは memcached デーモンが MySQL Server にどのように統合されるかについて説明します。これは、このアプローチと NoSQL コンポーネントまたはインタフェースを MySQL バックエンドに結合するほかの技法とを比べてその優劣を理解するのに役立ちます。
memcached は MySQL Server と統合すると、MySQL プラグインデーモンとして実装され、InnoDB
ストレージエンジンに直接アクセスして SQL レイヤーをバイパスします。

現在のリリースで提供される機能:
mysqld のデーモンプラグインとしての memcached: mysqld および memcached は両方とも同じプロセス空間で実行し、非常に短い待機時間でデータにアクセスします。
SQL パーサー、オプティマイザ、さらにハンドラ API レイヤーもバイパスして、
InnoDB
テーブルに直接アクセスします。テキストベースプロトコルとバイナリプロトコルの両方からなる標準の memcached プロトコル。
InnoDB
+ memcached の組み合わせは、memcapable コマンドの 55 個すべての互換性テストに合格しています。複数カラムのサポート: 複数のカラムをキー/値ストアの「値」部分にマップでき、カラム値はユーザー指定の区切り文字によって区切られます。
デフォルトでは、memcached プロトコルを使用して、
InnoDB
からデータを直接読み取ったり書き込んだりし、MySQL でInnoDB
バッファープールを介してインメモリーキャッシュを管理します。デフォルト設定は、データベースアプリケーションに対する予想外の動作を最小限に抑えた信頼性の高い組み合わせになっています。たとえばデフォルト設定では、データベース側でデータがコミットされなかったり、memcachedget
リクエストに対して古くなったデータが返されたりすることがないようになっています。上級ユーザーは、従来の memcached サーバーとしてシステムを構成し、すべてのデータを memcached デフォルトエンジン (メモリー) にのみキャッシュするか、「memcached デフォルトエンジン」 (メモリーキャッシュ) と
InnoDB
memcached エンジン (バックエンド永続ストレージとしてのInnoDB
) の組み合わせを使用できます。
innodb_api_bk_commit_interval
、daemon_memcached_r_batch_size
、およびdaemon_memcached_w_batch_size
構成オプションを使用して、InnoDB
と memcached の操作間のデータがやり取りされる頻度を制御できます。最大限の信頼性を得るには、両方のバッチサイズオプションのデフォルト値を 1 にします。MySQL 構成変数
daemon_memcached_option
から memcached 構成オプションを指定できます。たとえば、memcached が待機するポートを変更したり、同時接続の最大数を削減したり、鍵と値のペアの最大メモリーサイズを変更したり、エラーログに関するメッセージのデバッグを有効にしたりします。構成オプション
innodb_api_trx_level
を使用すると、ユーザーは memcached インタフェースによって処理されるクエリーのトランザクション分離レベルを制御できます。memcached にはトランザクションの概念がありませんが、このプロパティーを使用すると、memcached がインタフェースするテーブルと同じテーブル上で DML ステートメントを発行した場合、SQL ステートメントによって発生した変更が memcached で表示されるまでの速さを制御できます。デフォルトでは、これはREAD UNCOMMITTED
に設定されています。別の構成オプションは
innodb_api_enable_mdl
です。「MDL」は「メタデータロック」を表します。これは基本的に MySQL レベルでテーブルをロックするため、マップされたテーブルを、SQL インタフェース経由で DDL によってドロップしたり変更したりできません。ロックがなければテーブルを MySQL レイヤーからドロップできますが、memcached またはほかのユーザーがテーブルの使用を停止するまで InnoDB ストレージ内に保持されます。
memcached のスタンドアロンでの使用と InnoDB との併用の違い
セクション16.6「MySQL と memcached の併用」に記載されているように、MySQL ユーザーは、memcached を MySQL とともに使用することをすでに熟知している場合があります。このセクションでは、セクション内の情報の類似点および相違点と、MySQL に組み込まれている memcached の InnoDB
統合機能を使用する場合について説明します。各項目の最初のリンクから、従来の memcached サーバーに関する関連情報にアクセスできます。
インストール: memcached ライブラリは MySQL Server に付属しているため、インストールおよびセットアップは簡単明瞭です。使用する memcached 用のテーブルをセットアップするための SQL スクリプトを実行し、1 回かぎりの
install plugin
ステートメントを発行して memcached を使用可能にし、MySQL 構成ファイルまたは起動オプションに、別のポートを使用するなどの必要な memcached オプションを追加します。通常の memcached 配布をインストールして、memcp、memcat、memcapable などの追加のユーティリティーを取得する場合もあります。配備: 通常は、能力の低い多数の memcached サーバーを実行します。
InnoDB
+ memcached の組み合わせでは、データベースと memcached サーバーの比率が 1:1 になるため、通常の配備では、MySQL をすでに実行している中程度あるいは高い能力を持つ少数のサーバーマシンが含まれます。このサーバー構成の利点は、多数のサーバーにわたって未使用メモリーを活用したり、検索を分散させたりすることよりも、個々のデータベースサーバーそれぞれの効率を高めることの方が上回ります。デフォルト構成では、memcached にはメモリーがほとんど使用されず、インメモリー検索はInnoDB
バッファープールから提供され、このバッファープールは、最近使用されたデータと頻繁に使用されるデータを自動的にキャッシュします。従来の MySQL Server インスタンスと同じように、innodb_buffer_pool_size
構成オプションの値を (OS レベルでのページングを発生させない) 実用的なできるだけ高い値に維持し、これによりできるだけ多くのワークロードがメモリー内で実行されるようにします。期限切れ: デフォルトでは (キャッシュポリシー
innodb_only
を使用)、InnoDB
テーブルから最新データが常に返されるため、期限切れオプションは事実上影響ありません。キャッシュポリシーをcaching
またはcache-only
に変更した場合、期限切れオプションは通常どおり機能しますが、リクエストされたデータが、メモリーキャッシュ内で期限切れになる前に基礎テーブル内で更新された場合、データが古くなっている可能性があります。-
ネームスペース: memcached は 1 つの巨大なディレクトリに似ており、ここではファイルが互いに矛盾しないように、プリフィクスとサフィクスを使用した複雑な名前を指定する場合があります。
InnoDB
と memcached による統合サーバーでは、キーに同じ命名規則を使用できますが、追加の規則が 1 つあります。@@
.table_id
.key
table_id
という形式のキー名は、innodb_memcache.containers
テーブルからのマッピングデータを使用して、特定のテーブルを参照するようにデコードされます。key
は指定されたテーブル内で参照されるか、このテーブルに書き込まれます。@@
表記は、get
、add
、およびset
関数に対する個別の呼び出しにのみ機能し、incr
やdelete
などのほかの関数には機能しません。セッション内の後続の memcached 操作に対してデフォルトテーブルを指定するには、@@
表記とテーブル ID を使用し、キーの部分は指定せずにget
リクエストを実行します。例:get @@table_x
後続の
get
、set
、incr
、delete
およびその他の操作は、innodb_memcache.containers.name
カラム内でtable_x
によって指定されたテーブルを使用します。 -
ハッシュおよび配布: キャッシュポリシー
innodb_only
を使用したデフォルト構成は、レプリケーションスレーブサーバーのセットなど、サーバー上ですべてのデータが使用できる従来の配備構成に適しています。データをシャード構成のように物理的に分割する場合、
InnoDB
および memcached を組み合わせたサーバーを実行するいくつかのマシンでデータを分割でき、従来の memcached ハッシュメカニズムを使用するとリクエストを特定のマシンに送信できます。MySQL 側では、通常、memcached へのadd
リクエストによってすべてのデータを挿入するため、適切なサーバー上のデータベース内に適切な値が保管されます。これらのタイプの配備のベストプラクティスが、引き続き体系化されています。
-
メモリーの使用: デフォルトでは (キャッシュポリシー
innodb_only
を使用)、memcached プロトコルはInnoDB
テーブル間で情報をやり取りし、memcached のメモリー使用量を増加および減少させるのではなく、固定サイズのInnoDB
バッファープールでインメモリー検索を処理します。相対的には、memcached 側ではメモリーをほとんど使用しません。キャッシュポリシーを
caching
またはcache-only
に切り換えた場合、memcached メモリー使用量の通常のルールが適用されます。memcached データ値のメモリーは、「スラブ」を利用して割り当てられます。memcached で使用されるスラブサイズおよび最大メモリーを制御できます。いずれの場合も、たとえば telnet セッションを介した標準プロトコル経由でアクセスされる、使い慣れた統計システムを使用して、統合された memcached デーモンをモニターおよびトラブルシューティングできます。統合型デーモンとともに追加のユーティリティーが含まれているわけではないため、
memcached-tool
スクリプトを使用するには、完全な memcached 配布をインストールします。 スレッドの使用: MySQL スレッドおよび memcached スレッドは同一サーバー上に共存する必要があるため、オペレーティングシステムでスレッドに課されるすべての制限は、この合計の数値に適用されます。
ログの使用: memcached デーモンは MySQL Server とともに実行し、
stderr
に書き込むため、ロギングのための-v
、-vv
、および-vvv
オプションによって、これらの出力が MySQL エラーログに書き込まれます。memcached 操作:
get
、set
、add
、delete
などのよく使用される操作を使用できます。シリアライズ (複雑なデータ構造を表す正確な文字列書式) は言語インタフェースによって異なります。MySQL フロントエンドとしての memcached の使用:
InnoDB
を memcached と統合させるということは、まさにこのことです。これらのコンポーネントを一緒に配置することで、アプリケーションのパフォーマンスが改善されます。InnoDB
によってメモリーとディスク間のデータ転送が処理されるため、アプリケーションのロジックが簡素化されます。ユーティリティー: MySQL Server は
libmemcached
ライブラリを含んでいますが、追加のコマンド行ユーティリティーを含んでいません。memcp、memcat、memcapable コマンドなどのコマンドを取得するには、完全な memcached 配布をインストールします。memrm および memflush がキャッシュから項目を削除すると、項目はベースとなるInnoDB
テーブルからも削除されます。プログラミングインタフェース: いつも使用している言語と同じ言語である、C および C++、Java、Perl、Python、PHP、および Ruby を使用して、
InnoDB
および memcached の組み合わせから MySQL Server にアクセスできます。ほかの memcached サーバーと同じように、サーバーホスト名およびポートを指定します。デフォルトでは、統合化された memcached サーバーは、通常と同じポートである11211
をリッスンします。テキストプロトコルとバイナリプロトコルの両方を使用できます。memcached 関数の動作を実行時にカスタマイズできます。シリアライズ (複雑なデータ構造を表す正確な文字列書式) は言語インタフェースによって異なります。よくある質問: MySQL では、複数のリリースで、広範囲にわたる memcached FAQ が用意されています。MySQL 5.6 でも回答はおおむね変わっていませんが、
InnoDB
テーブルを memcached データのストレージメディアとして使用することで、この組み合わせを読み取り専用キャッシュとしてではなく、書き込み処理が多いアプリケーションに使用できるようになっています。
この機能のしくみについて詳しくは、セクション14.18.7「InnoDB memcached プラグインの内部構造」を参照してください。