控制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 TABLEdaemon_memcachedinnodb_api_enable_mdlCREATE 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";
