14.21.2 InnoDB 内存缓存架构

InnoDB memcached 插件将 memcached 作为 MySQL 插件守护程序实现,可直接绕过 MySQL SQL 层直接访问InnoDB存储引擎。

下图说明了与 SQL 相比,应用程序如何通过daemon_memcached插件访问数据。

图 14.4 带有集成 memcached 服务器的 MySQL 服务器

显示使用 SQL 和 memcached 协议访问 InnoDB 存储引擎中的数据的应用程序。应用程序使用 SQL 通过 MySQL Server 和 Handler API 访问数据。应用程序使用 memcached 协议,绕过 MySQL 服务器,通过 memcached 插件和 InnoDB API 访问数据。 memcached 插件由 innodb_memcache 接口和可选的本地缓存组成。

daemon_memcached插件的功能:

  • memcached 作为mysqld的守护程序插件。 mysqldmemcached 都在同一进程空间中运行,对数据的延迟非常低。

  • 直接访问InnoDBtable,绕过 SQL 解析器,优化器甚至 Handler API 层。

  • 标准 memcached 协议,包括基于文本的协议和二进制协议。 daemon_memcached插件通过了 memcapable 命令的所有 55 个兼容性测试。

  • 多列支持。您可以将多个列 Map 到键值存储的“值”部分,其中列值由用户指定的分隔符分隔。

  • 默认情况下, memcached 协议用于直接向InnoDB读写数据,从而使 MySQL 使用InnoDB buffer pool来 Management 内存中缓存。默认设置代 table 了高可靠性和数据库应用程序最少的惊喜。例如,默认设置避免在数据库端提交未提交的数据,或者避免为 memcached get请求返回过时的数据。

  • 高级用户可以将系统配置为传统的 memcached 服务器,所有数据仅缓存在 memcached 引擎(内存缓存)中,或者结合使用“ **** memcached ”引擎(内存缓存)和InnoDB memcached **引擎(InnoDB作为后端持久性存储)。

  • 通过innodb_api_bk_commit_intervaldaemon_memcached_r_batch_sizedaemon_memcached_w_batch_size配置选项控制在InnoDBmemcached 操作之间来回传递数据的频率。批次大小选项的默认值为 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_testtable 供 memcached 使用,发出INSTALL PLUGIN语句以启用daemon_memcached插件,并向 MySQL 配置文件或启动脚本中添加所需的 memcached 选项。您可能仍会安装传统的 memcached 发行版,以用于其他 Util,例如 memcpmemcatmemcapable

要与传统 memcached 进行比较,请参见Installing memcached

  • 部署:使用传统的 memcached ,通常可以运行大量低容量 **** memcached 服务器.但是,daemon_memcached插件的典型部署涉及数量较少的已经在运行 MySQL 的中型或高性能服务器.这种配置的好处是可以提高单个数据库服务器的效率,而不是利用未使用的内存或在大量服务器之间分布查找.在默认配置中, memcached **仅使用很少的内存,并且通过InnoDB buffer pool进行内存中查找,后者会自动缓存最近和经常使用的数据。与传统的 MySQL 服务器实例一样,请保持innodb_buffer_pool_size配置选项的值尽可能高(不引起 os 级别的分页),以便在内存中执行尽可能多的工作。

要与传统 memcached 进行比较,请参见memcached Deployment

  • 到期时间:默认情况下(即使用innodb_only缓存策略),总是返回InnoDBtable 中的最新数据,因此到期时间选项没有实际作用。如果将缓存策略更改为cachingcache_only,则到期选项将照常工作,但如果在基础 table 中更新了请求的数据,则该数据在从内存缓存中过期之前可能已过时。

要与传统 memcached 进行比较,请参见Data Expiry

  • 命名空间: memcached 就像一个大目录,您可以在其中给文件添加带有前缀和后缀的详尽名称,以防止文件冲突。 daemon_memcached插件使您可以对键使用类似的命名约定,但还要增加一个。密钥名称,格式为@@table_id.key。 * table_id *使用innodb_memcache.containerstable 中的 Map 数据进行解码以引用特定的 table。 * key *在指定的 table 中查找或写入。

@@符号仅适用于对getaddset函数的单独调用,而不适用于incrdelete之类的其他函数。要为会话中的后续 memcached 操作指定默认 table,请使用带有table_id@@table 示法执行get请求,但不包含键部分。例如:

get @@table_id

后续的getsetincrdelete和其他操作使用innodb_memcache.containers.name列中table_id指定的 table。

要与传统 memcached 进行比较,请参见Using Namespaces

  • 散列和分发:使用innodb_only缓存策略的默认配置适用于传统部署配置,在该传统部署配置中,所有数据(例如,一组副本服务器)在所有服务器上均可用。

如果按照分片配置在物理上划分数据,则可以在运行daemon_memcached插件的多台计算机之间拆分数据,并使用传统的“ memcached”哈希机制将请求路由到特定计算机。在 MySQL 方面,通常会通过addmemcached 的请求插入所有数据,以便将适当的值存储在适当服务器上的数据库中。

要与传统 memcached 进行比较,请参见memcached 散列/分发类型

  • 内存使用情况:默认情况下(使用innodb_only缓存策略), memcached 协议与InnoDBtable 来回传递信息,并且InnoDB缓冲池处理内存中查找,而不是 **** 内存缓存**增长和缩小。在“ memcached”端使用的内存相对较少。

如果将缓存策略切换为cachingcache_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 操作,例如getsetadddelete。序列化(即 table 示复杂数据结构的确切字符串格式)取决于语言接口。

要与传统 memcached 进行比较,请参见基本的内存缓存操作

  • 使用 memcached 作为 MySQL 前端:这是InnoDB memcached 插件的主要目的。集成的 memcached 守护程序可提高应用程序性能,并具有InnoDB处理内存和磁盘之间的数据传输可简化应用程序逻辑。

要与传统 memcached 进行比较,请参见使用 memcached 作为 MySQL 缓存层

  • Util:MySQL 服务器包括libmemcached库,但不包括其他命令行 Util。要使用 memcpmemcatmemcapable 命令,请安装完整的 memcached 发行版。当 memrmmemflush 从缓存中删除项目时,这些项目也会从基础InnoDBtable 中删除。

要与传统 memcached 进行比较,请参见libmemcached 命令行 Util

  • 编程接口:可以使用所有支持的语言通过daemon_memcached插件通过daemon_memcached插件访问 MySQL 服务器:C 和 CJavaPerlPythonPHPRuby。与传统的 memcached 服务器一样,指定服务器主机名和端口。默认情况下,daemon_memcached插件在端口11211上侦听。您可以同时使用文本和二进制协议。您可以在运行时自定义 memcached 函数的behavior。序列化(即 table 示复杂数据结构的确切字符串格式)取决于语言接口。

要与传统 memcached 进行比较,请参见开发内存缓存的应用程序

  • 常见问题:MySQL 对于传统 memcached 拥有广泛的 FAQ。该常见问题解答通常适用,除了使用InnoDBtable 作为 memcached 数据的存储介质外,您可以将 memcached 用于比以前更多的写密集型应用程序,而不是将其用作只读缓存。

See memcached FAQ.