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.so
: memcached 的InnoDB
API 插件。
-
libevent
必须已安装。 -
如果您不是从源代码构建 MySQL,则安装中不包含
libevent
库。使用 os 的安装方法来安装libevent
1.4.12 或更高版本。例如,取决于 os,您可以使用apt-get
,yum
或port install
。例如,在 Ubuntu Linux 上,使用:
sudo apt-get install libevent-dev
- 如果您是从源代码版本安装的,则
libevent
1.4.12 与软件包 Binding 在一起,并且位于 MySQL 源代码目录的顶层。如果使用 Binding 版本的libevent
,则无需执行任何操作。如果要使用libevent
的本地系统版本,则必须使用-DWITH_LIBEVENT build 选项设置为system
或yes
来构建 MySQL。
安装和配置 InnoDB memcached 插件
- 配置
daemon_memcached
插件,以便它可以通过运行MYSQL_HOME/share
中的innodb_memcached_config.sql
配置脚本来与InnoDB
table 交互。此脚本使用三个必需的 table(cache_policies
,config_options
和containers
)安装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.containers
table 是最重要的。 containers
table 中的条目提供了对InnoDB
table 列的 Map。与daemon_memcached
插件一起使用的每个InnoDB
table 都需要在containers
table 中有一个条目。
innodb_memcached_config.sql
脚本在containers
table 中插入一个条目,该条目为demo_test
table 提供了 Map。还将单行数据插入demo_test
table 中。此数据使您可以在安装完成后立即验证安装。
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_memcache
table 和demo_test
示例 table 的更多信息,请参见第 14.21.7 节“ InnoDB memcached 插件内部”。
- 通过运行INSTALL PLUGIN语句来激活
daemon_memcached
插件:
mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
插件安装完成后,每次重新启动 MySQL 服务器都会自动激活它。
验证 InnoDB 和内存缓存设置
要验证daemon_memcached
插件的设置,请使用 telnet 会话发出 memcached 命令。默认情况下, memcached 守护程序在端口 11211 上侦听。
- 从
test.demo_test
table 中检索数据。demo_test
table 中的单行数据的键值为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_test
table,验证插入的数据是否存储在 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_test
table 中自动查询该值。
创建新的 table 和列 Map
此示例显示了如何使用daemon_memcached
插件设置自己的InnoDB
table。
- 创建一个
InnoDB
table。该 table 必须具有带有唯一索引的键列。城市 table 的键列是city_id
,它被定义为主键。该 table 还必须包含flags
,cas
和expiry
值的列。可能有一个或多个值列。city
table 具有三个值列(name
,state
,country
)。
Note
对列名没有特殊要求,因为将有效 Map 添加到innodb_memcache.containers
table 中。
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.containers
table 中,以便daemon_memcached
插件知道如何访问InnoDB
table。该条目必须满足innodb_memcache.containers
table 定义。有关每个字段的说明,请参见第 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.containers
table 项定义为:
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
,以将city
table 配置为与daemon_memcached
插件一起使用的默认InnoDB
table。 -
多个
InnoDB
table 列(name
,state
,country
)使用“ |”Map 到containers.value_columns
定界符。 -
innodb_memcache.containers
table 的flags
,cas_column
和expire_time_column
字段在使用daemon_memcached
插件的应用程序中通常不重要。但是,每个 table 都需要指定的InnoDB
table 列。插入数据时,如果这些列未使用,请为它们指定0
。 -
更新
innodb_memcache.containers
table 后,重新启动daemon_memcache
插件以应用更改。
mysql> UNINSTALL PLUGIN daemon_memcached;
mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
- 使用 telnet,使用 memcached
set
命令将数据插入city
table。
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.city
table 以验证是否存储了您插入的数据。
mysql> SELECT * FROM test.city;
+---------+-----------+-----------+---------+-------+------+--------+
| city_id | name | state | country | flags | cas | expiry |
+---------+-----------+-----------+---------+-------+------+--------+
| B | BANGALORE | BANGALORE | IN | 0 | 3 | 0 |
+---------+-----------+-----------+---------+-------+------+--------+
- 使用 MySQL 将其他数据插入
test.city
table。
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
如果未使用flags
,cas_column
和expire_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 读取操作的数量,此后发生commit。 daemon_memcached_r_batch_size默认情况下设置为 1,以便每个get
请求都访问InnoDB
table 中最近提交的数据,无论该数据是通过 memcached 还是通过 SQL 更新的。当该值大于 1 时,每次get
调用都会增加用于读操作的计数器。flush_all
调用会重置读写计数器。 -
daemon_memcached_w_batch_size:定义写操作的批处理提交大小(
set
,replace
,append
,prepend
,incr
,decr
等)。 daemon_memcached_w_batch_size默认情况下设置为 1,这样在发生中断的情况下不会丢失所有未提交的数据,并且基础 table 上的 SQL 查询可以访问最新数据。当该值大于 1 时,每次add
,set
,incr
,decr
和delete
调用的写操作计数器都会增加。flush_all
调用会重置读写计数器。
默认情况下,您不需要修改daemon_memcached_engine_lib_name或daemon_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 节“安装和卸载插件”。