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
-
如第 16.1.2 节“设置基于二进制日志文件位置的复制”中所述配置源服务器和副本服务器。
-
使用mysqldump创建源数据快照,并将快照同步到副本服务器。
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_test
table,该 table 是在daemon_memcached
插件的初始设置期间由innodb_memcached_config.sql
配置脚本创建的。 demo_test
table 包含单个示例记录。
- 使用
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_test
table 中。假设demo_test
table 以前未修改过,则应该有两条记录。该示例记录的键为AA
,而您刚刚插入的记录的键为test1
。c1
列 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_size和daemon_memcached_w_batch_size用于控制读取和写入事务的批处理大小。这些设置不会影响复制。成功完成后,将对基础
InnoDB
table 上的每个 SQL 操作进行复制。 -
daemon_memcached_w_batch_size的默认值为
1
,这意味着每个 memcached 写入操作都将立即提交。此默认设置会产生一定量的性能开销,以避免源服务器和副本服务器上可见的数据不一致。复制的记录始终在副本服务器上立即可用。如果将daemon_memcached_w_batch_size设置为大于1
的值,则通过 memcached 插入或更新的记录不会立即在源服务器上显示;要在提交之前查看源服务器上的记录,请发出设置事务隔离级别未提交。