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