控制InnoDB 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开销,则当工作负载减少时,提交可能会变得很少。作为安全措施,后台线程会定期定期提交通过内存缓存 API 进行的更改。间隔由innodb_api_bk_commit_interval
配置选项,默认设置为5
秒。
当memcached操作在基础InnoDB
表中插入或更新数据时,更改的数据将立即对其他memcached请求可见,因为新值保留在内存缓存中,即使尚未在MySQL端提交。
交易隔离
当诸如Memcached的操作(例如get
或incr
在基础InnoDB
表上引起查询或DML操作)时,您可以控制该操作是否看到写入表的最新数据,仅已提交的数据或事务隔离级别的其他变化。使用innodb_api_trx_level
配置选项来控制此功能。为此选项指定的数值对应于隔离级别,例如REPEATABLE READ
。innodb_api_trx_level
有关其他设置的信息,请参见该选项的说明。
严格的隔离级别可确保您检索的数据不会回滚或突然更改,以免后续查询返回不同的值。但是,严格的隔离级别需要更大的锁定开销,这可能会导致等待。对于不使用长时间运行的事务的NoSQL风格的应用程序,通常可以使用默认隔离级别或切换到不太严格的隔离级别。
为内存缓存的DML操作禁用行锁
innodb_api_disable_rowlock
当通过插件的内存缓存请求daemon_memcached
导致DML操作时,该选项可用于禁用行锁。默认情况下innodb_api_disable_rowlock
设置为OFF
,这意味着memcached请求行锁定get
和set
操作。当innodb_api_disable_rowlock
设置为时ON
,memcached请求表锁而不是行锁。
该innodb_api_disable_rowlock
选项不是动态的。必须在启动时在mysqld命令行上指定它,或在MySQL配置文件中输入它。
允许或禁止DDL
默认情况下,您可以对插件使用的表执行DDL 操作。为避免将这些表用于高吞吐量应用程序时潜在的速度降低,请在启动时启用这些表以禁用DDL操作。通过memcached和SQL 访问同一表时,此选项不太合适,因为它会阻止表上的语句,这对于运行报表查询可能很重要。ALTER TABLE
daemon_memcached
innodb_api_enable_mdl
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_policiesSET set_policy = 'caching'WHERE policy_name = 'cache_policy';
innodb_memcache.cache_policies
值仅在启动时读取。更改此表中的值后,请卸载并重新安装daemon_memcached
插件以确保更改生效。
mysql>UNINSTALL PLUGIN daemon_memcached; mysql>INSTALL PLUGIN daemon_memcachedsoname "libmemcached.so";