14.21.5.4 控制 InnoDB 内存缓存插件的事务行为

与传统的 memcached 不同,daemon_memcached插件允许您控制通过调用addsetincr等产生的数据值的持久性。默认情况下,通过 memcached 接口写入的数据存储在磁盘上,对get的调用返回磁盘中的最新值。尽管默认行为不能提供最佳的原始性能,但与InnoDBtable 的 SQL 接口相比,它仍然较快。

当您获得使用daemon_memcached插件的经验时,可以考虑放宽对非关键数据类的持久性设置,否则可能会因断电而丢失某些更新值,或者返回的数据有些过时。

提交频率

耐久性和原始性能之间的权衡之一是新数据和更改后的数据committed的频率。如果数据很关键,应立即提交,以确保在崩溃或中断时安全。如果数据不太重要,例如在崩溃后重置计数器或记录可能会丢失的数据,则您可能希望使用较高的原始吞吐量,而提交频率较低。

memcached 操作插入,更新或删除基础InnoDBtable 中的数据时,更改可能会立即(如果daemon_memcached_w_batch_size=1)或一段时间(如果daemon_memcached_w_batch_size值大于 1)提交给InnoDBtable。无论哪种情况,更改都无法回滚。如果增加daemon_memcached_w_batch_size的值以避免在繁忙时间增加 I/O 开销,则当工作负载减少时,提交可能变得很少。为了安全起见,后台线程会定期自动提交通过 memcached API 进行的更改。该间隔由innodb_api_bk_commit_interval配置选项控制,该选项的默认设置为5秒。

memcached 操作在基础InnoDBtable 中插入或更新数据时,更改后的数据将立即对其他 memcached 请求可见,因为新值仍保留在内存高速缓存中,即使尚未提交 MySQL 方面。

Transaction Isolation

当诸如getincr之类的“ memcached”操作导致对基础InnoDBtable 的查询或 DML 操作时,您可以控制该操作是否看到写入 table 的最新数据,仅看到已提交的数据,还是其他 Transactionisolation level的变化。使用innodb_api_trx_level配置选项可以控制此功能。为此选项指定的数值对应于隔离级别,例如REPEATABLE READ。有关其他设置的信息,请参见innodb_api_trx_level选项的描述。

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

为行缓存的 DML 操作禁用行锁

当通过daemon_memcached插件发出的 memcached 请求导致 DML 操作时,可以使用innodb_api_disable_rowlock选项禁用行锁。默认情况下,innodb_api_disable_rowlock设置为OFF,这意味着 memcached 请求getset操作的行锁。当innodb_api_disable_rowlock设置为ON时, memcached 请求 table 锁而不是行锁。

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

允许或禁止 DDL

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

将数据存储在磁盘,内存中或同时存储在两者中

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

使用caching设置,如果 memcached 无法在内存中找到键,它将在InnoDBtable 中搜索值。如果在InnoDBtable 中的磁盘上更新了值,但尚未从内存高速缓存中过期,则在caching设置下从get调用返回的值可能是过期的。

可以为getset(包括incrdecr),deleteflush操作分别设置缓存策略。

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

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值仅在启动时读取。更改此 table 中的值后,请卸载并重新安装daemon_memcached插件以确保更改生效。

mysql> UNINSTALL PLUGIN daemon_memcached;

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