14.21.5.4 控制 InnoDB 内存缓存插件的事务行为
与传统的 memcached 不同,daemon_memcached
插件允许您控制通过调用add
,set
,incr
等产生的数据值的持久性。默认情况下,通过 memcached 接口写入的数据存储在磁盘上,对get
的调用返回磁盘中的最新值。尽管默认行为不能提供最佳的原始性能,但与InnoDB
table 的 SQL 接口相比,它仍然较快。
当您获得使用daemon_memcached
插件的经验时,可以考虑放宽对非关键数据类的持久性设置,否则可能会因断电而丢失某些更新值,或者返回的数据有些过时。
提交频率
耐久性和原始性能之间的权衡之一是新数据和更改后的数据committed的频率。如果数据很关键,应立即提交,以确保在崩溃或中断时安全。如果数据不太重要,例如在崩溃后重置计数器或记录可能会丢失的数据,则您可能希望使用较高的原始吞吐量,而提交频率较低。
当 memcached 操作插入,更新或删除基础InnoDB
table 中的数据时,更改可能会立即(如果daemon_memcached_w_batch_size=1)或一段时间(如果daemon_memcached_w_batch_size值大于 1)提交给InnoDB
table。无论哪种情况,更改都无法回滚。如果增加daemon_memcached_w_batch_size的值以避免在繁忙时间增加 I/O 开销,则当工作负载减少时,提交可能变得很少。为了安全起见,后台线程会定期自动提交通过 memcached API 进行的更改。该间隔由innodb_api_bk_commit_interval配置选项控制,该选项的默认设置为5
秒。
当 memcached 操作在基础InnoDB
table 中插入或更新数据时,更改后的数据将立即对其他 memcached 请求可见,因为新值仍保留在内存高速缓存中,即使尚未提交 MySQL 方面。
Transaction Isolation
当诸如get
或incr
之类的“ memcached”操作导致对基础InnoDB
table 的查询或 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 请求get
和set
操作的行锁。当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_policies
table 指定是否将通过 memcached 接口写入的数据存储到磁盘(默认为innodb_only
);仅在内存中,与传统的 memcached (cache_only
)相同;或两者(caching
)。
使用caching
设置,如果 memcached 无法在内存中找到键,它将在InnoDB
table 中搜索值。如果在InnoDB
table 中的磁盘上更新了值,但尚未从内存高速缓存中过期,则在caching
设置下从get
调用返回的值可能是过期的。
可以为get
,set
(包括incr
和decr
),delete
和flush
操作分别设置缓存策略。
例如,您可能允许get
和set
操作同时(使用caching
设置)查询或更新 table 和 memcached 内存高速缓存,同时使delete
,flush
或两者仅在内部使用-内存副本(使用cache_only
设置)。这样,删除或刷新项目只会使该项目从缓存中过期,并且下次请求该项目时,InnoDB
table 将返回最新值。
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";