従来の memcached とは異なり、InnoDB
+ memcached の組み合わせを使用すると、add
、set
、incr
などの呼び出しを使用して生成されたデータ値の「永続性」を制御できます。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 側でまだコミットされていなくてもメモリーキャッシュ内に残っているためです。
トランザクションの分離
get
や incr
などの 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_rowlock
は OFF
に設定されており、memcached が get および set 操作の行ロックをリクエストします。innodb_api_disable_rowlock
を ON
に設定すると、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
テーブルで更新され、メモリーキャッシュでまだ期限切れとなっていない場合、値が最新でないことがあります。
キャッシュポリシーは、get
、set
(incr
および decr
を含む)、delete
、および flush
操作で個々に設定できます。例:
get
およびset
操作では、(caching
設定を使用して) テーブルおよび memcached メモリーキャッシュへのクエリー実行または更新を同時に実行しながら、delete
、flush
、またはこれらの両方を (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)