14.21.3 设置 InnoDB 内存缓存插件

本节介绍如何在 MySQL 服务器上设置daemon_memcached插件。由于 memcached 守护程序已与 MySQL 服务器紧密集成,以避免网络流量并最大程度地减少了延迟,因此您需要在每个使用此功能的 MySQL 实例上执行此过程。

Note

在设置daemon_memcached插件之前,请咨询第 14.21.4 节“ InnoDB 内存缓存插件的安全注意事项”以了解防止未授权访问所需的安全步骤。

Prerequisites

  • daemon_memcached插件仅在 Linux,Solaris 和 macOS 平台上受支持。不支持其他 os。

  • 从源代码构建 MySQL 时,必须使用-DWITH_INNODB_MEMCACHED=ON进行构建。这个构建选项在 MySQL 插件目录(plugin_dir)中生成两个共享库,它们是运行daemon_memcached插件所需的:

  • libmemcached.so:MySQL 的 memcached 守护程序插件。

    • innodb_engine.somemcachedInnoDB API 插件。
  • libevent必须已安装。

  • 如果您不是从源代码构建 MySQL,则安装中不包含libevent库。使用 os 的安装方法来安装libevent 1.4.12 或更高版本。例如,取决于 os,您可以使用apt-getyumport install。例如,在 Ubuntu Linux 上,使用:

sudo apt-get install libevent-dev
  • 如果您是从源代码版本安装的,则libevent 1.4.12 与软件包 Binding 在一起,并且位于 MySQL 源代码目录的顶层。如果使用 Binding 版本的libevent,则无需执行任何操作。如果要使用libevent的本地系统版本,则必须使用-DWITH_LIBEVENT build 选项设置为systemyes来构建 MySQL。

安装和配置 InnoDB memcached 插件

  • 配置daemon_memcached插件,以便它可以通过运行MYSQL_HOME/share中的innodb_memcached_config.sql配置脚本来与InnoDBtable 交互。此脚本使用三个必需的 table(cache_policiesconfig_optionscontainers)安装innodb_memcache数据库。它还将demo_test示例 table 安装在test数据库中。
mysql> source MYSQL_HOME/share/innodb_memcached_config.sql

运行innodb_memcached_config.sql脚本是一次性操作。如果您以后卸载并重新安装daemon_memcached插件,则 table 将保留在原位。

mysql> USE innodb_memcache;
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies            |
| config_options            |
| containers                |
+---------------------------+

mysql> USE test;
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| demo_test      |
+----------------+

在这些 table 中,innodb_memcache.containerstable 是最重要的。 containerstable 中的条目提供了对InnoDBtable 列的 Map。与daemon_memcached插件一起使用的每个InnoDBtable 都需要在containerstable 中有一个条目。

innodb_memcached_config.sql脚本在containerstable 中插入一个条目,该条目为demo_testtable 提供了 Map。还将单行数据插入demo_testtable 中。此数据使您可以在安装完成后立即验证安装。

mysql> SELECT * FROM innodb_memcache.containers\G
*************************** 1. row ***************************
                  name: aaa
             db_schema: test
              db_table: demo_test
           key_columns: c1
         value_columns: c2
                 flags: c3
            cas_column: c4
    expire_time_column: c5
unique_idx_name_on_key: PRIMARY

mysql> SELECT * FROM test.demo_test;
+----+------------------+------+------+------+
| c1 | c2               | c3   | c4   | c5   |
+----+------------------+------+------+------+
| AA | HELLO, HELLO     |    8 |    0 |    0 |
+----+------------------+------+------+------+

有关innodb_memcachetable 和demo_test示例 table 的更多信息,请参见第 14.21.7 节“ InnoDB memcached 插件内部”

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

插件安装完成后,每次重新启动 MySQL 服务器都会自动激活它。

验证 InnoDB 和内存缓存设置

要验证daemon_memcached插件的设置,请使用 telnet 会话发出 memcached 命令。默认情况下, memcached 守护程序在端口 11211 上侦听。

  • test.demo_testtable 中检索数据。 demo_testtable 中的单行数据的键值为AA
telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get AA
VALUE AA 8 12
HELLO, HELLO
END
  • 使用set命令插入数据。
set BB 10 0 16
GOODBYE, GOODBYE
STORED

where:

  • set是存储值的命令

  • BB是关键

  • 10是该操作的标志;被 memcached 忽略,但是可以被 Client 端用来指示任何类型的信息;如果未使用,则指定0

  • 0是到期时间(TTL);如果未使用,则指定0

  • 16是提供的值块的长度(以字节为单位)

  • GOODBYE, GOODBYE是存储的值

  • 通过连接到 MySQL 服务器并查询test.demo_testtable,验证插入的数据是否存储在 MySQL 中。

mysql> SELECT * FROM test.demo_test;
+----+------------------+------+------+------+
| c1 | c2               | c3   | c4   | c5   |
+----+------------------+------+------+------+
| AA | HELLO, HELLO     |    8 |    0 |    0 |
| BB | GOODBYE, GOODBYE |   10 |    1 |    0 |
+----+------------------+------+------+------+
  • 返回 telnet 会话,并使用键BB检索先前插入的数据。
get BB
VALUE BB 10 16
GOODBYE, GOODBYE
END
quit

如果您关闭 MySQL 服务器(该服务器还关闭了集成的 memcached 服务器),则进一步尝试访问 memcached 数据的尝试将失败,并出现连接错误。通常,“ memcached”数据此时也会消失,并且当“ memcached”重新启动时,您将需要应用程序逻辑将数据加载回内存中。但是,InnoDB memcached 插件可以自动为您完成此过程。

当您重新启动 MySQL 时,get操作再次返回您存储在较早的 memcached 会话中的键/值对。当请求密钥并且关联值尚未在内存缓存中时,将从 MySQL test.demo_testtable 中自动查询该值。

创建新的 table 和列 Map

此示例显示了如何使用daemon_memcached插件设置自己的InnoDBtable。

  • 创建一个InnoDBtable。该 table 必须具有带有唯一索引的键列。城市 table 的键列是city_id,它被定义为主键。该 table 还必须包含flagscasexpiry值的列。可能有一个或多个值列。 citytable 具有三个值列(namestatecountry)。

Note

对列名没有特殊要求,因为将有效 Map 添加到innodb_memcache.containerstable 中。

mysql> CREATE TABLE city (
       city_id VARCHAR(32),
       name VARCHAR(1024),
       state VARCHAR(1024),
       country VARCHAR(1024),
       flags INT,
       cas BIGINT UNSIGNED, 
       expiry INT,
       primary key(city_id)
       ) ENGINE=InnoDB;
  • 将一个条目添加到innodb_memcache.containerstable 中,以便daemon_memcached插件知道如何访问InnoDBtable。该条目必须满足innodb_memcache.containerstable 定义。有关每个字段的说明,请参见第 14.21.7 节“ InnoDB memcached 插件内部”
mysql> DESCRIBE innodb_memcache.containers;
+------------------------+--------------+------+-----+---------+-------+
| Field                  | Type         | Null | Key | Default | Extra |
+------------------------+--------------+------+-----+---------+-------+
| name                   | varchar(50)  | NO   | PRI | NULL    |       |
| db_schema              | varchar(250) | NO   |     | NULL    |       |
| db_table               | varchar(250) | NO   |     | NULL    |       |
| key_columns            | varchar(250) | NO   |     | NULL    |       |
| value_columns          | varchar(250) | YES  |     | NULL    |       |
| flags                  | varchar(250) | NO   |     | 0       |       |
| cas_column             | varchar(250) | YES  |     | NULL    |       |
| expire_time_column     | varchar(250) | YES  |     | NULL    |       |
| unique_idx_name_on_key | varchar(250) | NO   |     | NULL    |       |
+------------------------+--------------+------+-----+---------+-------+

城市 table 的innodb_memcache.containerstable 项定义为:

mysql> INSERT INTO `innodb_memcache`.`containers` (
       `name`, `db_schema`, `db_table`, `key_columns`, `value_columns`,
       `flags`, `cas_column`, `expire_time_column`, `unique_idx_name_on_key`)
       VALUES ('default', 'test', 'city', 'city_id', 'name|state|country', 
       'flags','cas','expiry','PRIMARY');
  • containers.name列指定了default,以将citytable 配置为与daemon_memcached插件一起使用的默认InnoDBtable。

  • 多个InnoDBtable 列(namestatecountry)使用“ |”Map 到containers.value_columns定界符。

  • innodb_memcache.containerstable 的flagscas_columnexpire_time_column字段在使用daemon_memcached插件的应用程序中通常不重要。但是,每个 table 都需要指定的InnoDBtable 列。插入数据时,如果这些列未使用,请为它们指定0

  • 更新innodb_memcache.containerstable 后,重新启动daemon_memcache插件以应用更改。

mysql> UNINSTALL PLUGIN daemon_memcached;

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
  • 使用 telnet,使用 memcached set命令将数据插入citytable。
telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set B 0 0 22
BANGALORE|BANGALORE|IN
STORED
  • 使用 MySQL,查询test.citytable 以验证是否存储了您插入的数据。
mysql> SELECT * FROM test.city;
+---------+-----------+-----------+---------+-------+------+--------+
| city_id | name      | state     | country | flags | cas  | expiry |
+---------+-----------+-----------+---------+-------+------+--------+
| B       | BANGALORE | BANGALORE | IN      |     0 |    3 |      0 |
+---------+-----------+-----------+---------+-------+------+--------+
  • 使用 MySQL 将其他数据插入test.citytable。
mysql> INSERT INTO city VALUES ('C','CHENNAI','TAMIL NADU','IN', 0, 0 ,0);
mysql> INSERT INTO city VALUES ('D','DELHI','DELHI','IN', 0, 0, 0);
mysql> INSERT INTO city VALUES ('H','HYDERABAD','TELANGANA','IN', 0, 0, 0);
mysql> INSERT INTO city VALUES ('M','MUMBAI','MAHARASHTRA','IN', 0, 0, 0);

Note

如果未使用flagscas_columnexpire_time_column字段,建议为它们指定0的值。

  • 使用 telnet,发出 memcached get命令以检索您使用 MySQL 插入的数据。
get H
VALUE H 0 22
HYDERABAD|TELANGANA|IN
END

配置 InnoDB 内存缓存插件

可以在 MySQL 配置文件或mysqld启动字符串中指定传统的memcached配置选项,该配置文件编码在daemon_memcached_option配置参数的参数中。 memcached配置选项在加载插件时生效,每次启动 MySQL 服务器时都会生效。

例如,要使 memcached 监听端口 11222 而不是默认端口 11211,请指定-p11222作为daemon_memcached_option配置选项的参数:

mysqld .... --daemon_memcached_option="-p11222"

其他 memcached 选项可以编码在daemon_memcached_option字符串中。例如,您可以指定选项以减少同时连接的最大数量,更改键值对的最大内存大小或为错误日志启用调试消息,等等。

还有针对daemon_memcached插件的配置选项。这些包括:

  • daemon_memcached_engine_lib_name:指定实现InnoDB memcached 插件的共享库。默认设置为innodb_engine.so

  • daemon_memcached_engine_lib_path:包含实现InnoDB memcached 插件的共享库的目录路径。默认值为 NULL,table 示插件目录。

  • daemon_memcached_r_batch_size:定义读取操作的批处理提交大小(get)。它指定 memcached 读取操作的数量,此后发生commitdaemon_memcached_r_batch_size默认情况下设置为 1,以便每个get请求都访问InnoDBtable 中最近提交的数据,无论该数据是通过 memcached 还是通过 SQL 更新的。当该值大于 1 时,每次get调用都会增加用于读操作的计数器。 flush_all调用会重置读写计数器。

  • daemon_memcached_w_batch_size:定义写操作的批处理提交大小(setreplaceappendprependincrdecr等)。 daemon_memcached_w_batch_size默认情况下设置为 1,这样在发生中断的情况下不会丢失所有未提交的数据,并且基础 table 上的 SQL 查询可以访问最新数据。当该值大于 1 时,每次addsetincrdecrdelete调用的写操作计数器都会增加。 flush_all调用会重置读写计数器。

默认情况下,您不需要修改daemon_memcached_engine_lib_namedaemon_memcached_engine_lib_path。例如,如果您想对内存缓存使用不同的存储引擎(例如 NDB 内存缓存引擎),则可以配置这些选项。

可以在 MySQL 配置文件或mysqld启动字符串中指定daemon_memcached插件配置参数。它们在您加载daemon_memcached插件时生效。

更改daemon_memcached插件配置时,请重新加载插件以应用更改。为此,发出以下语句:

mysql> UNINSTALL PLUGIN daemon_memcached;

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

重新启动插件时,将保留配置设置,必需的 table 和数据。

有关启用和禁用插件的其他信息,请参见第 5.5.1 节“安装和卸载插件”