与传统的memcached不同,该
daemon_memcached
插件允许您控制通过调用
add
、set
、
incr
等生成的数据值的持久性。默认情况下,通过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 操作时,您可以控制该操作是看到写入表的最新数据,还是只看到已提交的数据,或者事务
隔离级别的其他变体。使用
配置选项来控制此功能。为此选项指定的数值对应于隔离级别,例如
. 有关其他设置的信息,
请参阅该选项的说明
。get
incr
InnoDB
innodb_api_trx_level
REPEATABLE READ
innodb_api_trx_level
严格的隔离级别可确保您检索的数据不会回滚或突然更改,从而导致后续查询返回不同的值。但是,严格的隔离级别需要更大的锁定 开销,这会导致等待。对于不使用长时间运行事务的 NoSQL 样式应用程序,您通常可以使用默认隔离级别或切换到不太严格的隔离级别。
为 memcached DML 操作禁用行锁
当memcached通过
插件请求导致 DML 操作时,
该innodb_api_disable_rowlock
选项可用于禁用行锁
。默认情况下,设置为这意味着
memcached请求行锁
和操作。当设置为 时
,memcached请求表锁而不是行锁。
daemon_memcached
innodb_api_disable_rowlock
OFF
get
set
innodb_api_disable_rowlock
ON
该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
下的调用
返回的值可能已过期。caching
InnoDB
可以为
get
、set
(包括
incr
和decr
)、
delete
、 和flush
操作独立设置缓存策略。
例如,您可能允许get
和
set
操作同时查询或更新表和memcached内存缓存(使用caching
设置),同时使
delete
、flush
或两者仅对内存中的副本进行操作(使用
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";