14.21.6 InnoDB 内存缓存插件和复制

由于daemon_memcached插件支持 MySQL binary log,因此可以复制通过 memcached 接口在源服务器上进行的更新以进行备份,平衡密集的读取工作负载和高可用性。二进制日志记录支持所有 memcached 命令。

您无需在副本服务器上设置daemon_memcached插件。此配置的主要优点是增加了源上的写入吞吐量。复制机制的速度不受影响。

以下各节说明将daemon_memcached插件与 MySQL 复制一起使用时如何使用二进制日志功能。假定您已完成第 14.21.3 节“设置 InnoDB memcached 插件”中描述的设置。

启用 InnoDB Memcached 二进制日志

  • 要将daemon_memcached插件与 MySQL binary log结合使用,请在源服务器上启用innodb_api_enable_binlog配置选项。此选项只能在服务器启动时设置。您还必须使用--log-bin选项在源服务器上启用 MySQL 二进制日志。您可以将这些选项添加到 MySQL 配置文件中,或在mysqld命令行上。
mysqld ... --log-bin -–innodb_api_enable_binlog=1
source shell> mysqldump --all-databases --lock-all-tables > dbdump.db
replica shell> mysql < dbdump.db
  • 在源服务器上,发出显示主状态以获取源二进制日志坐标。
mysql> SHOW MASTER STATUS;
  • 在副本服务器上,使用更改为主语句使用源二进制日志坐标来设置副本服务器。
mysql> CHANGE MASTER TO
  MASTER_HOST='localhost',
 MASTER_USER='root',
  MASTER_PASSWORD='',
  MASTER_PORT = 13000,
 MASTER_LOG_FILE='0.000001,
 MASTER_LOG_POS=114;
  • 启动副本。
mysql> START SLAVE;

如果错误日志显示类似于以下内容的输出,则 table 明副本已准备好进行复制。

2013-09-24T13:04:38.639684Z 49 [Note] Slave I/O thread: connected to
master 'root@localhost:13000', replication started in log '0.000001'
at position 114

测试 InnoDB Memcached 复制配置

本示例演示了如何使用 memcached 和 telnet 来测试InnoDB memcached 复制配置,以插入,更新和删除数据。 MySQLClient 端用于验证源服务器和副本服务器上的结果。

该示例使用demo_testtable,该 table 是在daemon_memcached插件的初始设置期间由innodb_memcached_config.sql配置脚本创建的。 demo_testtable 包含单个示例记录。

  • 使用set命令插入键为test1,标记值为10,到期值为0,cas 值为 1 和t1的记录。
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set test1 10 0 1
t1
STORED
  • 在源服务器上,检查记录是否已插入demo_testtable 中。假设demo_testtable 以前未修改过,则应该有两条记录。该示例记录的键为AA,而您刚刚插入的记录的键为test1c1列 Map 到键,c2列 Map 到值,c3列 Map 到标志值,c4列 Map 到 cas 值,c5列 Map 到到期时间。由于未使用,到期时间被设置为 0.
mysql> SELECT * FROM test.demo_test;
+-------+--------------+------+------+------+
| c1    | c2           | c3   | c4   | c5   |
+-------+--------------+------+------+------+
| AA    | HELLO, HELLO |    8 |    0 |    0 |
| test1 | t1           |   10 |    1 |    0 |
+-------+--------------+------+------+------+
  • 检查以确认相同的记录已复制到副本服务器。
mysql> SELECT * FROM test.demo_test;
+-------+--------------+------+------+------+
| c1    | c2           | c3   | c4   | c5   |
+-------+--------------+------+------+------+
| AA    | HELLO, HELLO |    8 |    0 |    0 |
| test1 | t1           |   10 |    1 |    0 |
+-------+--------------+------+------+------+
  • 使用set命令将密钥更新为new
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set test1 10 0 2
new
STORED

该更新将复制到副本服务器(请注意,cas值也已更新)。

mysql> SELECT * FROM test.demo_test;
+-------+--------------+------+------+------+
| c1    | c2           | c3   | c4   | c5   |
+-------+--------------+------+------+------+
| AA    | HELLO, HELLO |    8 |    0 |    0 |
| test1 | new          |   10 |    2 |    0 |
+-------+--------------+------+------+------+
  • 使用delete命令删除test1记录。
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
delete test1
DELETED

delete操作复制到副本时,副本上的test1记录也会被删除。

mysql> SELECT * FROM test.demo_test;
+----+--------------+------+------+------+
| c1 | c2           | c3   | c4   | c5   |
+----+--------------+------+------+------+
| AA | HELLO, HELLO |    8 |    0 |    0 |
+----+--------------+------+------+------+
  • 使用flush_all命令从 table 中删除所有行。
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
flush_all
OK
mysql> SELECT * FROM test.demo_test;
Empty set (0.00 sec)
  • Telnet 到源服务器,然后 Importing 两个新记录。
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'
set test2 10 0 4
again
STORED
set test3 10 0 5
again1
STORED
  • 确认两条记录已复制到副本服务器。
mysql> SELECT * FROM test.demo_test;
+-------+--------------+------+------+------+
| c1    | c2           | c3   | c4   | c5   |
+-------+--------------+------+------+------+
| test2 | again        |   10 |    4 |    0 |
| test3 | again1       |   10 |    5 |    0 |
+-------+--------------+------+------+------+
  • 使用flush_all命令从 table 中删除所有行。
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
flush_all
OK
  • 检查以确保flush_all操作已在副本服务器上复制。
mysql> SELECT * FROM test.demo_test;
Empty set (0.00 sec)

InnoDB memcached 二进制日志说明

二进制日志格式:

  • 大多数 memcached 操作都 Map 到DML语句(类似于插入,删除,更新)。由于 MySQL 服务器没有处理实际的 SQL 语句,因此所有 memcached 命令(flush_all除外)均使用基于行的复制(RBR)日志记录,该记录独立于任何服务器binlog_format设置。

  • memcached flush_all命令 Map 到TRUNCATE TABLE命令。由于DDL命令只能使用基于语句的日志记录,因此通过发送TRUNCATE TABLE语句来复制flush_all命令。

Transactions:

  • transactions的概念通常不属于 memcached 应用程序。出于性能方面的考虑,daemon_memcached_r_batch_sizedaemon_memcached_w_batch_size用于控制读取和写入事务的批处理大小。这些设置不会影响复制。成功完成后,将对基础InnoDBtable 上的每个 SQL 操作进行复制。

  • daemon_memcached_w_batch_size的默认值为1,这意味着每个 memcached 写入操作都将立即提交。此默认设置会产生一定量的性能开销,以避免源服务器和副本服务器上可见的数据不一致。复制的记录始终在副本服务器上立即可用。如果将daemon_memcached_w_batch_size设置为大于1的值,则通过 memcached 插入或更新的记录不会立即在源服务器上显示;要在提交之前查看源服务器上的记录,请发出设置事务隔离级别未提交