10bet网址
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr)- 26.8Mb
PDF (A4)- 26.8Mb


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

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

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

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

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

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

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

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

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

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

  • 上級ユーザーは、従来のmemcachedサーバーとしてシステムを構成し、すべてのデータをmemcachedデフォルトエンジン (メモリー) にのみキャッシュするか、memcachedデフォルトエンジン(メモリーキャッシュ) とInnoDBmemcachedエンジン (バックエンド永続ストレージとしての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、および鲁比(人名)を使用して、InnoDBおよびmemcachedの組み合わせから MySQL Server にアクセスできます。ほかのmemcachedサーバーと同じように、サーバーホスト名およびポートを指定します。デフォルトでは、統合化されたmemcachedサーバーは、通常と同じポートである11211をリッスンします。テキストプロトコルとバイナリプロトコルの両方を使用できます。memcached関数の動作を実行時にカスタマイズできます。シリアライズ (複雑なデータ構造を表す正確な文字列書式) は言語インタフェースによって異なります。

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

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