InnoDB内存缓存架构
InnoDB
分布式缓存插件实现的memcached作为一个MySQL插件守护进程访问该InnoDB
存储引擎直接绕过MySQL的SQL层。
下图说明了daemon_memcached
与SQL相比,应用程序如何通过插件访问数据。
图15.4带有集成memcached服务器的MySQL 服务器

该功能daemon_memcached
插件:
- memcached作为 mysqld的守护程序插件。双方的mysqld和memcached的在同一个进程空间中运行,具有非常低的延迟对数据的访问。
- 直接访问
InnoDB
表,绕过SQL解析器,优化器甚至Handler API层。 - 标准的内存缓存协议,包括基于文本的协议和二进制协议。该
daemon_memcached
插件通过了memcapable命令的所有55个兼容性测试。 - 多列支持。您可以将多个列映射到键值存储的“ value ”部分,其中列值由用户指定的分隔符分隔。
- 默认情况下,memcached协议用于直接读写数据
InnoDB
,从而使MySQL使用InnoDB
缓冲池管理内存中的缓存。默认设置代表了高可靠性和数据库应用程序最少的惊喜。例如,默认设置可避免数据库端的未提交数据,或为内存缓存get
请求返回的陈旧数据。 - 高级用户可以将系统配置为传统的Memcached服务器,所有数据仅缓存在Memcached引擎中(内存缓存),也可以结合使用“memcached Engine ”(内存缓存)和
InnoDB
memcached引擎(InnoDB
作为后端持久存储)存储)。
- 控制数据如何往往之间来回传递
InnoDB
和memcached的通过操作innodb_api_bk_commit_interval
,daemon_memcached_r_batch_size
以及daemon_memcached_w_batch_size
配置选项。批次大小选项默认为1,以获得最大的可靠性。 - 通过配置参数指定memcached选项的能力
daemon_memcached_option
。例如,您可以更改memcached侦听的端口,减少同时连接的最大数量,更改键值对的最大内存大小,或为错误日志启用调试消息。 - 的
innodb_api_trx_level
配置选项控制事务隔离级别上通过处理的查询memcached的。尽管memcached没有事务的概念,但是您可以使用此选项来控制memcached多久才能看到daemon_memcached插件使用的表上发出的SQL语句引起的更改。默认情况下,innodb_api_trx_level
设置为READ UNCOMMITTED
。 - 该
innodb_api_enable_mdl
选项可用于将表锁定在MySQL级别,以便DDL无法通过SQL接口删除或更改映射的表。没有锁,该表可以从MySQL层删除,但可以保留在InnoDB
存储器中,直到内存缓存或其他用户停止使用它为止。“ MDL ”代表“元数据锁定”。
InnoDB内存缓存和传统内存缓存之间的区别
您可能已经熟悉使用memcached的使用MySQL,如在使用MySQL与memcached的。本节描述集成的InnoDB
memcached插件的功能与传统的有何不同memcached
。
安装:memcached库随MySQL服务器一起提供,使安装和设置相对容易。安装包括运行
innodb_memcached_config.sql
脚本以创建demo_test
供memcached使用的表,发布一条INSTALL PLUGIN
语句以启用该daemon_memcached
插件,以及向MySQL配置文件或启动脚本中添加所需的memcached选项。您可能仍会安装传统的memcached发行版,以获取其他实用程序,例如memcp,memcat和memcapable。要与传统的memcached进行比较,请参阅安装memcached。
部署:使用传统的memcached时,通常运行大量低容量的memcached服务器。
daemon_memcached
但是,该插件的典型部署涉及较少数量的已经在运行MySQL的中型或高性能服务器。这种配置的好处是可以提高单个数据库服务器的效率,而不是利用未使用的内存或在大量服务器之间分布查找。在默认配置中,很少有内存用于memcached,并且从缓冲池中提供内存中查找InnoDB
,它会自动缓存最近使用过的数据。与传统的MySQL服务器实例一样,请保持innodb_buffer_pool_size
配置选项的值尽可能高(不引起操作系统级别的分页),以便在内存中执行尽可能多的工作。要与传统的memcached进行比较,请参阅memcached部署。
到期时间:默认情况下(即使用
innodb_only
缓存策略),InnoDB
总是返回表中的最新数据,因此到期时间选项没有实际作用。如果将缓存策略更改为caching
或cache_only
,则到期选项将照常工作,但是如果请求的数据在从内存缓存中过期之前在基础表中进行了更新,则请求的数据可能会过时。要与传统的memcached进行比较,请参阅数据过期。
命名空间:memcached就像一个大目录,在其中您可以给文件提供精美的名称(带有前缀和后缀),以防止文件冲突。该
daemon_memcached
插件使您可以对密钥使用类似的命名约定,并增加了一个。键名格式。使用表中的映射数据将其解码以引用特定的表。该被查找或写入到指定的表。@@table_id.key
table_id
innodb_memcache.containers
key
该
@@
符号仅适用于对get
,add
和set
函数的单独调用,而不适用于诸如incr
或的其他调用delete
。要为会话中的后续memcached操作指定默认表,get
请使用@@
带有符号的符号执行请求table_id
,但不包含键部分。例如:get @@table_id
随后
get
,set
,incr
,delete
,等操作使用由指定的表table_id
中的innodb_memcache.containers.name
列。要与传统的memcached进行比较,请参阅“使用命名空间”。
散列和分发:使用
innodb_only
缓存策略的默认配置适用于传统部署配置,在该传统部署配置中,所有数据(例如一组复制从属服务器)在所有服务器上都可用。如果按照分片配置在物理上划分数据,则可以在运行该
daemon_memcached
插件的多台计算机之间拆分数据,并使用传统的内存缓存哈希机制将请求路由到特定计算机。在MySQL方面,通常应通过add
对memcached的请求插入所有数据,以便将适当的值存储在适当服务器上的数据库中。要与传统的memcached进行比较,请参阅memcached散列/分发类型。
内存使用情况:默认情况下(具有
innodb_only
缓存策略),memcached协议与InnoDB
表来回传递信息,并且InnoDB
缓冲池处理内存中查找,而不是随着memcached内存使用量的增加和缩小。相对而言,内存缓存侧使用的内存很少。如果切换缓存政策
caching
或者cache_only
,正常规则memcached的内存使用情况适用。用于内存缓存的数据值的内存按“平板”进行分配。您可以控制平板大小和用于memcached的最大内存。无论哪种方式,您都可以
daemon_memcached
使用熟悉的统计系统(例如,通过telnet会话通过标准协议访问)对插件进行监视和故障排除。该daemon_memcached
插件不包含其他实用程序。您可以使用memcached-tool
脚本来安装完整的内存缓存分发。为了与传统的比较memcached的,请参阅内存分配中的memcached。
线程使用:MySQL线程和内存缓存线程共存于同一服务器上。操作系统对线程施加的限制适用于线程总数。
要与传统的memcached进行比较,请参阅memcached线程支持。
登录使用:由于memcached的守护程序同时运行MySQL服务器和写入
stderr
的-v
,-vv
和-vvv
选项写入输出记录到MySQL的错误日志。要与传统的memcached进行比较,请参阅memcached日志。
memcached的操作:熟悉memcached的操作,例如
get
,set
,add
,和delete
可用。序列化(即表示复杂数据结构的确切字符串格式)取决于语言接口。要与传统的memcached进行比较,请参阅基本的memcached操作。
将memcached用作MySQL前端:这是
InnoDB
memcached插件的主要目的。集成的memcached守护程序可提高应用程序性能,并具有InnoDB
处理内存和磁盘之间的数据传输的功能,从而简化了应用程序逻辑。要与传统的memcached进行比较,请参阅使用memcached作为MySQL缓存层。
实用程序:MySQL服务器包括该
libmemcached
库,但不包括其他命令行实用程序。要使用诸如memcp,memcat和memcapable命令之类的命令,请安装完整的memcached发行版。当memrm和memflush从缓存中删除项目时,这些项目也会从基础InnoDB
表中删除。要与传统的memcached进行比较,请参见libmemcached命令行实用程序。
编程接口:您可以
daemon_memcached
使用所有支持的语言通过插件访问MySQL服务器: C和C ++, Java, Perl, Python, PHP和 Ruby。与传统的内存缓存服务器一样,指定服务器主机名和端口。默认情况下,daemon_memcached
插件在port上监听11211
。您可以同时使用文本协议和二进制协议。您可以自定义行为的memcached函数在运行时。序列化(即表示复杂数据结构的确切字符串格式)取决于语言接口。要与传统的memcached进行比较,请参阅开发memcached应用程序。
常见问题:MySQL对于传统的memcached有广泛的FAQ 。该常见问题解答通常适用,除了将
InnoDB
表用作内存缓存数据的存储介质之外,这意味着您可以将内存缓存用于比以前更多的写密集型应用程序,而不是用作只读缓存。请参阅memcached常见问题解答。