Documentation Home

14.20.2 InnoDB 内存缓存架构

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

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

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

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

daemon_memcached插件的特点:

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

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

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

  • 多列支持。您可以将多个列映射到键值存储的 部分,列值由用户指定的分隔符分隔。

  • 默认情况下,memcached协议用于直接读取和写入数据InnoDB,让 MySQL 使用 InnoDB 缓冲池管理内存缓存。默认设置代表了数据库应用程序的高可靠性和最少意外的组合。例如,默认设置避免数据库端未提交的数据,或为 memcached get请求返回的陈旧数据。

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

  • 通过、 InnoDB和 配置选项控制数据在memcached 操作 之间来回传递的频率 。 批量大小选项默认值为 1 以获得最大可靠性。 innodb_api_bk_commit_intervaldaemon_memcached_r_batch_sizedaemon_memcached_w_batch_size

  • 通过配置参数指定memcached选项 的能力。daemon_memcached_option例如,您可以更改memcached侦听的端口、减少同时连接的最大数量、更改键值对的最大内存大小或为错误日志启用调试消息。

  • 配置选项控制memcached处理的查询 的innodb_api_trx_level 事务 隔离级别。虽然 memcached没有 事务的概念,但您可以使用此选项来控制 memcached多长时间才能看到由在daemon_memcached插件使用的表上发出的 SQL 语句引起的更改 。默认情况下, 设置为。 innodb_api_trx_levelREAD UNCOMMITTED

  • 该选项可用于在 MySQL 级别锁定表,以便DDLinnodb_api_enable_mdl 无法 通过 SQL 接口删除或更改映射表。如果没有锁,表可以从 MySQL 层中删除,但会保留在存储中,直到 memcached或其他一些用户停止使用它。MDL代表元数据锁定InnoDB

InnoDB memcached 和传统 memcached 的区别

您可能已经熟悉将 memcached与 MySQL 一起使用,如 第 16.2 节“将 MySQL 与memcached一起使用”中所述。本节介绍集成InnoDB memcached插件的功能与传统 memcached.

  • 安装:memcached库随MySQL 服务器一起提供,安装和设置相对容易。安装包括运行 innodb_memcached_config.sql脚本以创建demo_testmemcached使用的表、发出 INSTALL PLUGIN语句以启用daemon_memcached插件,以及将所需的memcached选项添加到 MySQL 配置文件或启动脚本。您可能仍会安装传统的memcached 发行版以获取其他实用程序,例如 memcpmemcatmemcapable.

    要与传统 memcached进行比较,请参阅 第 16.2.1 节,“安装memcached

  • 部署:使用传统的memcached时,通常会运行大量低容量的 memcached服务器。然而,该插件的典型部署daemon_memcached涉及少量已经运行 MySQL 的中等或高性能服务器。这种配置的好处在于提高单个数据库服务器的效率,而不是利用未使用的内存或在大量服务器之间分布查找。在默认配置中, memcached使用的内存非常少 ,内存中查找由InnoDB 缓冲池提供,它会自动缓存最近和经常使用的数据。与传统的 MySQL 服务器实例一样,保持 innodb_buffer_pool_size 配置选项的值尽可能高(不会导致操作系统级别的分页),以便在内存中执行尽可能多的工作。

    有关与传统 memcached的比较,请参阅 第 16.2.2.2 节,“ memcached部署”

  • Expiry:默认情况下(即使用 innodb_only缓存策略),始终返回表中的最新数据InnoDB,因此过期选项没有实际作用。如果将缓存策略更改为cachingcache_only,过期选项将照常工作,但如果请求的数据在从内存缓存中过期之前在基础表中进行了更新,则请求的数据可能会过时。

    有关与传统 memcached的比较,请参阅 第 16.2.2.4 节,“数据过期”

  • 命名空间:memcached就像一个大目录,您可以在其中为文件指定带有前缀和后缀的详细名称,以防止文件冲突。该 daemon_memcached插件允许您对键使用类似的命名约定,但增加了一个。格式中的键名 。 使用表中的映射数据被解码以引用特定的 表。在指定表中查找或写入。 @@table_id.keytable_idinnodb_memcache.containerskey

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

    get @@table_id

    后续getsetincrdelete等操作使用列中指定的 table_idinnodb_memcache.containers.name

    要与传统的 memcached进行比较,请参阅 第 16.2.2.3 节,“使用命名空间”

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

    如果您在物理上划分数据,如在分片配置中,您可以在运行插件的多台机器上拆分数据daemon_memcached,并使用传统的memcached哈希机制将请求路由到特定机器。在 MySQL 端,您通常会通过 对memcachedadd的请求 插入所有数据,以便将适当的值存储在适当服务器上的数据库中。

    要与传统 memcached进行比较,请参阅 第 16.2.2.5 节,“ memcached哈希/分布类型”

  • 内存使用:默认情况下(使用 innodb_only缓存策略), memcachedInnoDB协议通过表来回传递信息,InnoDB缓冲池处理内存中查找,而不是memcached内存使用量的增长和收缩。memcached端 使用的内存相对较少。

    如果将缓存策略切换为 caching或,则适用memcached内存使用cache_only的正常规则。memcached数据值的内存是根据slabs分配的。您可以控制用于 memcached的 slab 大小和最大内存。

    无论哪种方式,您都可以使用熟悉的统计系统 监控和排除 daemon_memcached插件 故障,通过标准协议访问 ,例如,通过telnet会话。该插件不包含额外的实用程序 。您可以使用该 脚本来安装完整的memcached 发行版。 daemon_memcachedmemcached-tool

    有关与传统 memcached的比较,请参阅 第 16.2.2.7 节,“ memcached中的内存分配”

  • 线程使用:MySQL 线程和memcached 线程共存于同一台服务器上。操作系统对线程施加的限制适用于线程总数。

    有关与传统 memcached的比较,请参阅 第 16.2.2.8 节,“ memcached线程支持”

  • 日志使用:因为memcached守护进程与 MySQL 服务器一起运行并写入 stderr,用于记录写入输出到 MySQL 错误日志-v的、 -vv和选项。 -vvv

    要与传统 memcached进行比较,请参阅 第 16.2.2.9 节,“ memcached日志”

  • memcached操作:可以使用熟悉 的memcached操作,例如 getsetadddelete。序列化(即表示复杂数据结构的确切字符串格式)取决于语言接口。

    要与传统 memcached进行比较,请参阅 第 16.2.3.1 节,“基本memcached操作”

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

    有关与传统 memcached的比较,请参阅 第 16.2.3.2 节,“使用memcached作为 MySQL 缓存层”

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

    要与传统 memcached进行比较,请参阅 第 16.2.3.3.6 节,“ libmemcached命令行实用程序”

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

    要与传统 memcached进行比较,请参阅 第 16.2.3 节,“开发memcached应用程序”

  • 常见问题解答:MySQL 有针对传统memcached的广泛常见问题解答。FAQ 大部分适用,除了使用InnoDB 表作为memcached 数据的存储介质意味着您可以将memcached用于比以前写入密集型应用程序更多,而不是作为只读缓存。

    请参阅第 16.2.5 节,“ memcached FAQ”