Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  InnoDB および memcached の統合のアーキテクチャー

14.18.2 InnoDB および memcached の統合のアーキテクチャー

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

memcached は MySQL Server と統合すると、MySQL プラグインデーモンとして実装され、InnoDB ストレージエンジンに直接アクセスして SQL レイヤーをバイパスします。

memcached サーバーが統合された MySQL Server のアーキテクチャー図

現在のリリースで提供される機能:

  • mysqld のデーモンプラグインとしての memcached: mysqld および memcached は両方とも同じプロセス空間で実行し、非常に短い待機時間でデータにアクセスします。

  • SQL パーサー、オプティマイザ、さらにハンドラ API レイヤーもバイパスして、InnoDB テーブルに直接アクセスします。

  • テキストベースプロトコルとバイナリプロトコルの両方からなる標準の memcached プロトコル。InnoDB + memcached の組み合わせは、memcapable コマンドの 55 個すべての互換性テストに合格しています。

  • 複数カラムのサポート: 複数のカラムをキー/値ストアの部分にマップでき、カラム値はユーザー指定の区切り文字によって区切られます。

  • デフォルトでは、memcached プロトコルを使用して、InnoDB からデータを直接読み取ったり書き込んだりし、MySQL で InnoDB バッファープールを介してインメモリーキャッシュを管理します。デフォルト設定は、データベースアプリケーションに対する予想外の動作を最小限に抑えた信頼性の高い組み合わせになっています。たとえばデフォルト設定では、データベース側でデータがコミットされなかったり、memcached get リクエストに対して古くなったデータが返されたりすることがないようになっています。

  • 上級ユーザーは、従来の memcached サーバーとしてシステムを構成し、すべてのデータを memcached デフォルトエンジン (メモリー) にのみキャッシュするか、memcached デフォルトエンジン (メモリーキャッシュ) と InnoDB memcached エンジン (バックエンド永続ストレージとしての InnoDB) の組み合わせを使用できます。

  • innodb_api_bk_commit_intervaldaemon_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 に組み込まれている memcachedInnoDB 統合機能を使用する場合について説明します。各項目の最初のリンクから、従来の memcached サーバーに関する関連情報にアクセスできます。

  • インストール: memcached ライブラリは MySQL Server に付属しているため、インストールおよびセットアップは簡単明瞭です。使用する memcached 用のテーブルをセットアップするための SQL スクリプトを実行し、1 回かぎりの install plugin ステートメントを発行して memcached を使用可能にし、MySQL 構成ファイルまたは起動オプションに、別のポートを使用するなどの必要な memcached オプションを追加します。通常の memcached 配布をインストールして、memcpmemcatmemcapable などの追加のユーティリティーを取得する場合もあります。

  • 配備: 通常は、能力の低い多数の memcached サーバーを実行します。InnoDB + memcached の組み合わせでは、データベースと memcached サーバーの比率が 1:1 になるため、通常の配備では、MySQL をすでに実行している中程度あるいは高い能力を持つ少数のサーバーマシンが含まれます。このサーバー構成の利点は、多数のサーバーにわたって未使用メモリーを活用したり、検索を分散させたりすることよりも、個々のデータベースサーバーそれぞれの効率を高めることの方が上回ります。デフォルト構成では、memcached にはメモリーがほとんど使用されず、インメモリー検索は InnoDB バッファープールから提供され、このバッファープールは、最近使用されたデータと頻繁に使用されるデータを自動的にキャッシュします。従来の MySQL Server インスタンスと同じように、innodb_buffer_pool_size 構成オプションの値を (OS レベルでのページングを発生させない) 実用的なできるだけ高い値に維持し、これによりできるだけ多くのワークロードがメモリー内で実行されるようにします。

  • 期限切れ: デフォルトでは (キャッシュポリシー innodb_only を使用)、InnoDB テーブルから最新データが常に返されるため、期限切れオプションは事実上影響ありません。キャッシュポリシーを caching または cache-only に変更した場合、期限切れオプションは通常どおり機能しますが、リクエストされたデータが、メモリーキャッシュ内で期限切れになる前に基礎テーブル内で更新された場合、データが古くなっている可能性があります。

  • ネームスペース: memcached は 1 つの巨大なディレクトリに似ており、ここではファイルが互いに矛盾しないように、プリフィクスとサフィクスを使用した複雑な名前を指定する場合があります。InnoDBmemcached による統合サーバーでは、キーに同じ命名規則を使用できますが、追加の規則が 1 つあります。@@table_id.key.table_id という形式のキー名は、innodb_memcache.containers テーブルからのマッピングデータを使用して、特定のテーブルを参照するようにデコードされます。key は指定されたテーブル内で参照されるか、このテーブルに書き込まれます。

    @@ 表記は、getadd、および set 関数に対する個別の呼び出しにのみ機能し、incrdelete などのほかの関数には機能しません。セッション内の後続の memcached 操作に対してデフォルトテーブルを指定するには、@@ 表記とテーブル ID を使用し、キーの部分は指定せずに get リクエストを実行します。例:

    get @@table_x

    後続の getsetincrdelete およびその他の操作は、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 操作: getsetadddelete などのよく使用される操作を使用できます。シリアライズ (複雑なデータ構造を表す正確な文字列書式) は言語インタフェースによって異なります。

  • MySQL フロントエンドとしての memcached の使用: InnoDBmemcached と統合させるということは、まさにこのことです。これらのコンポーネントを一緒に配置することで、アプリケーションのパフォーマンスが改善されます。InnoDB によってメモリーとディスク間のデータ転送が処理されるため、アプリケーションのロジックが簡素化されます。

  • ユーティリティー: MySQL Server は libmemcached ライブラリを含んでいますが、追加のコマンド行ユーティリティーを含んでいません。memcpmemcatmemcapable コマンドなどのコマンドを取得するには、完全な memcached 配布をインストールします。memrm および memflush がキャッシュから項目を削除すると、項目はベースとなる InnoDB テーブルからも削除されます。

  • プログラミングインタフェース: いつも使用している言語と同じ言語である、C および C++JavaPerlPythonPHP、および Ruby を使用して、InnoDB および memcached の組み合わせから MySQL Server にアクセスできます。ほかの memcached サーバーと同じように、サーバーホスト名およびポートを指定します。デフォルトでは、統合化された memcached サーバーは、通常と同じポートである 11211 をリッスンします。テキストプロトコルとバイナリプロトコルの両方を使用できます。memcached 関数の動作を実行時にカスタマイズできます。シリアライズ (複雑なデータ構造を表す正確な文字列書式) は言語インタフェースによって異なります。

  • よくある質問: MySQL では、複数のリリースで、広範囲にわたる memcached FAQ が用意されています。MySQL 5.6 でも回答はおおむね変わっていませんが、InnoDB テーブルを memcached データのストレージメディアとして使用することで、この組み合わせを読み取り専用キャッシュとしてではなく、書き込み処理が多いアプリケーションに使用できるようになっています。

この機能のしくみについて詳しくは、セクション14.18.7「InnoDB memcached プラグインの内部構造」を参照してください。