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


14.18.5.4 InnoDB memcached プラグインのトランザクション動作の制御

従来の memcached とは異なり、InnoDB + memcached の組み合わせを使用すると、addsetincr などの呼び出しを使用して生成されたデータ値の永続性を制御できます。MySQL はデータの永続性と一貫性に高い優先順位を置いているため、デフォルトでは、memcached インタフェース経由で書き込まれるすべてのデータは常にディスクに格納され、get の呼び出しは、ディスクの最新の値を常に返します。このデフォルト設定では、本来のパフォーマンスを可能なかぎり高めることはできませんが、InnoDB テーブルの従来の SQL インタフェースと比べると、非常に高速です。

この機能を使用していくことで、機能が停止した場合に一部の更新済みの値を失ったり、古くなったデータを返したりするリスクを認識し、重要ではないデータの永続性の設定を緩和できるようになります。

コミットの頻度

永続性と本来のパフォーマンスを両立させる 1 つの条件は、新しいデータや変更されたデータがコミットされる頻度です。重要なデータの場合、データをただちにコミットして、クラッシュまたは機能停止の発生時にデータを保護する必要があります。クラッシュ後にリセットされるカウンタや、数秒分損失しても支障がないロギングデータなどのあまり重要ではないデータの場合、コミットの頻度を下げて本来のスループットを高めた方がよいこともあります。

memcached 操作によって、ベースとなる InnoDB テーブル内で挿入、更新、または削除を行う場合、その変更は即座に (daemon_memcached_w_batch_size=1 の場合) またはしばらくしてから (この構成オプション値が 1 より大きいとき) 基礎テーブルにコミットされます。いずれの場合も、変更はロールバックできません。混雑時の高 I/O オーバーヘッドを回避するために daemon_memcached_w_batch_size=1 の値を増やすと、ワークロードの減少時にコミットの頻度が非常に低下する可能性があります。安全策として、バックグラウンドスレッドで、memcached API 経由で行なった変更を一定の間隔で自動的にコミットします。間隔は innodb_api_bk_commit_interval 構成オプションで制御され、デフォルトは 5 秒です。

memcached 操作によって、ベースとなる InnoDB テーブルに挿入または更新が発生した場合、変更されたデータはほかの memcached リクエストによってすぐに表示されます。これは、新しい値は MySQL 側でまだコミットされていなくてもメモリーキャッシュ内に残っているためです。

トランザクションの分離

getincr などの memcached 操作によって、ベースとなる InnoDB テーブルでクエリーまたは DML 操作を実行する場合、テーブルに書き込まれた最新データの表示、コミットされたデータのみの表示、ほかのトランザクション分離レベルの表示を制御できます。この機能は innodb_api_trx_level 構成オプションを使用して制御します。このオプションで指定される数値は、REPEATABLE READ のようなわかりやすい分離レベル名に対応します。全リストについては、innodb_api_trx_level オプションの説明を参照してください。

分離レベルの厳密性が高くなると、取得したデータが突然ロールバックしたり変更したりして後続のクエリーで異なる値が表示されることがなくなります。ただし、厳密性が高いと ロックによるオーバーヘッドが大きくなり待機が発生します。長期間にわたるトランザクションを使用しない NoSQL スタイルのアプリケーションでは、通常はデフォルトの分離レベルのままにするか、低い厳密性に切り換えることができます。

memcached DML 操作の行ロックの無効化

innodb_api_disable_rowlock オプションでは、InnoDB memcached が DML 操作を実行するときに行ロックを無効化できます。デフォルトでは、innodb_api_disable_rowlockOFF に設定されており、memcached が get および set 操作の行ロックをリクエストします。innodb_api_disable_rowlockON に設定すると、memcached は行ロックの代わりに、テーブルロックをリクエストします。

innodb_api_disable_rowlock オプションは動的ではありません。mysqld コマンド行で起動時に指定するか、MySQL 構成ファイルに入力する必要があります。

DDL の許可または禁止

デフォルトでは、InnoDB memcached プラグインによって使用されるテーブル上で ALTER TABLE などの DDL 操作を実行できます。スループットの高いアプリケーションでのテーブル使用時の潜在的な速度低下を回避するには、innodb_api_enable_mdl 構成オプションを起動時にオンにすると、テーブル上の DDL 操作を無効にできます。このオプションは、memcached インタフェースおよび SQL の両方で同じ基礎テーブルにアクセスする場合はあまり適切ではありません。このオプションでは、レポート作成クエリーを実行するシステムの構成で重要になる、テーブルの CREATE INDEX ステートメントをブロックするためです。

ディスク、メモリー、または両方へのデータの格納

テーブル innodb_memcache.cache_policies は、memcached から書き込まれるデータが、ディスク上に格納されるか (デフォルト、innodb_only)、従来の memcached のようにメモリーのみに格納されるか (cache-only)、または両方に格納されるか (caching) を指定します。

caching 設定では、memcached がメモリー内からキーを検出できない場合、InnoDB テーブル内から値を検索します。caching 設定で get 呼び出しから返された値は、ディスク上の InnoDB テーブルで更新され、メモリーキャッシュでまだ期限切れとなっていない場合、値が最新でないことがあります。

キャッシュポリシーは、getset (incr および decr を含む)、delete、および flush 操作で個々に設定できます。例:

  • get および set 操作では、(caching 設定を使用して) テーブルおよび memcached メモリーキャッシュへのクエリー実行または更新を同時に実行しながら、deleteflush、またはこれらの両方を (cache_only 設定を使用して) インメモリーコピー上でのみ動作できます。こうすることで、項目を削除またはフラッシュすると単にキャッシュで期限切れになり、項目が次回要求されたときに最新の値が InnoDB テーブルから返されます。

mysql> desc innodb_memcache.cache_policies;
+---------------+-------------------------------------------------------+------+-----+---------+-------+
| Field         | Type                                                  | Null | Key | Default | Extra |
+---------------+-------------------------------------------------------+------+-----+---------+-------+
| policy_name   | varchar(40)                                           | NO   | PRI | NULL    |       |
| get_policy    | enum('innodb_only','cache_only','caching','disabled') | NO   |     | NULL    |       |
| set_policy    | enum('innodb_only','cache_only','caching','disabled') | NO   |     | NULL    |       |
| delete_policy | enum('innodb_only','cache_only','caching','disabled') | NO   |     | NULL    |       |
| flush_policy  | enum('innodb_only','cache_only','caching','disabled') | NO   |     | NULL    |       |
+---------------+-------------------------------------------------------+------+-----+---------+-------+

mysql> select * from innodb_memcache.cache_policies;
+--------------+-------------+-------------+---------------+--------------+
| policy_name  | get_policy  | set_policy  | delete_policy | flush_policy |
+--------------+-------------+-------------+---------------+--------------+
| cache_policy | innodb_only | innodb_only | innodb_only   | innodb_only  |
+--------------+-------------+-------------+---------------+--------------+

mysql> update innodb_memcache.cache_policies set set_policy = 'caching'
    -> where policy_name = 'cache_policy';

cache_policies 値は起動時にのみ読み取られ、memcached プラグインの動作と強固に統合されています。このテーブル中の値を変更したあと、プラグインをアンインストールし再インストールします。

mysql> uninstall plugin daemon_memcached;
Query OK, 0 rows affected (2.00 sec)
mysql> install plugin daemon_memcached soname "libmemcached.so";
Query OK, 0 rows affected (0.00 sec)

User Comments
Sign Up Login You must be logged in to post a comment.