Documentation Home

14.21.5.4 控制 InnoDB memcached 插件的事务行为

与传统的memcached不同,该 daemon_memcached插件允许您控制通过调用 addsetincr等生成的数据值的持久性。默认情况下,通过memcached接口写入的数据存储到磁盘,并调用get从磁盘返回最近的值。虽然默认行为不提供最佳的原始性能,但与InnoDB表的 SQL 接口相比仍然很快。

当您获得使用该 daemon_memcached插件的经验时,您可以考虑放宽对非关键数据类的持久性设置,以防在发生中断时丢失一些更新的值,或返回稍微过时的数据。

提交频率

持久性和原始性能之间的一种权衡是 提交新数据和更改数据的频率。如果数据很重要,则应立即提交,以便在意外退出或中断的情况下是安全的。如果数据不那么重要,例如在意外退出后重置的计数器或您可以承受丢失的日志数据,您可能更喜欢更高的原始吞吐量,而这些吞吐量在提交频率较低的情况下可用。

memcached操作在基础表中插入、更新或删除数据时InnoDB ,更改可能会 InnoDB立即(如果 daemon_memcached_w_batch_size=1)或稍后(如果 daemon_memcached_w_batch_size 值大于 1)提交到表。在任何一种情况下,更改都无法回滚。如果您增加 的值 daemon_memcached_w_batch_size 以避免在繁忙时间出现高 I/O 开销,那么当工作负载减少时,提交可能会变得不频繁。作为一项安全措施,后台线程会定期自动提交通过memcached API 所做的更改。间隔由控制 innodb_api_bk_commit_interval 配置选项,默认设置为 5秒。

memcached操作在基础表中插入或更新数据时InnoDB,更改的数据立即对其他 memcached请求可见,因为新值保留在内存缓存中,即使它尚未在 MySQL 端提交也是如此。

事务隔离

当诸如 or之类的memcached操作导致对基础 表进行查询或 DML 操作时,您可以控制该操作是看到写入表的最新数据,还是只看到已提交的数据,或者事务 隔离级别的其他变体。使用 配置选项来控制此功能。为此选项指定的数值对应于隔离级别,例如 . 有关其他设置的信息, 请参阅该选项的说明 。getincrInnoDBinnodb_api_trx_levelREPEATABLE READinnodb_api_trx_level

严格的隔离级别可确保您检索的数据不会回滚或突然更改,从而导致后续查询返回不同的值。但是,严格的隔离级别需要更大的锁定 开销,这会导致等待。对于不使用长时间运行事务的 NoSQL 样式应用程序,您通常可以使用默认隔离级别或切换到不太严格的隔离级别。

为 memcached DML 操作禁用行锁

当memcached通过 插件请求导致 DML 操作时, 该innodb_api_disable_rowlock 选项可用于禁用行锁 。默认情况下,设置为这意味着 memcached请求行锁 和操作。当设置为 时 ,memcached请求表锁而不是行锁。 daemon_memcachedinnodb_api_disable_rowlockOFFgetsetinnodb_api_disable_rowlockON

innodb_api_disable_rowlock选项不是动态的。它必须在启动时在 mysqld命令行上指定或输入到 MySQL 配置文件中。

允许或禁止 DDL

默认情况下,您可以执行DDL 操作,例如在插件ALTER TABLE使用的表上。daemon_memcached为避免在将这些表用于高吞吐量应用程序时可能出现的减速,请通过 innodb_api_enable_mdl在启动时启用来禁用对这些表的 DDL 操作。当通过memcached和 SQL访问相同的表时,此选项不太合适,因为它会阻止CREATE INDEX 表上的语句,这对于运行报告查询可能很重要。

将数据存储在磁盘、内存或两者中

innodb_memcache.cache_policies表指定是否将通过 memcached接口写入的数据存储到磁盘(innodb_only,默认值);仅在内存中,与传统的memcached ( cache_only) 一样;或两者 ( caching)。

通过caching设置,如果 memcached在内存中找不到键,它会在InnoDB表中搜索值。如果值已在表中的磁盘上更新 但尚未从内存缓存中过期,则从 设置get下的调用 返回的值可能已过期。cachingInnoDB

可以为 getset(包括 incrdecr)、 delete、 和flush 操作独立设置缓存策略。

例如,您可能允许getset操作同时查询或更新表和memcached内存缓存(使用caching设置),同时使 deleteflush或两者仅对内存中的副本进行操作(使用 cache_only设置)。这样,删除或刷新项目只会使缓存中的项目过期,并在InnoDB 下次请求该项目时从表中返回最新值。

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';

innodb_memcache.cache_policies值仅在启动时读取。更改此表中的值后,卸载并重新安装daemon_memcached 插件以确保更改生效。

mysql> UNINSTALL PLUGIN daemon_memcached;

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";