InnoDB内存缓存插件和复制
由于该daemon_memcached
插件支持MySQL 二进制日志,因此可以复制通过memcached接口在主服务器上进行的更新以进行备份,平衡密集的读取工作负载和高可用性。二进制日志记录支持所有memcached命令。
您无需daemon_memcached
在从属服务器上设置插件。此配置的主要优点是增加了主机上的写入吞吐量。复制机制的速度不受影响。
以下各节说明将daemon_memcached
插件与MySQL复制一起使用时如何使用二进制日志功能。假定您已完成“设置InnoDB memcached插件”中所述的设置。
启用InnoDB Memcached二进制日志
要将
daemon_memcached
插件与MySQL 二进制日志一起使用,请innodb_api_enable_binlog
在主服务器上启用配置选项。此选项只能在服务器启动时设置。您还必须使用该--log-bin
选项在主服务器上启用MySQL二进制日志。您可以将这些选项添加到MySQL配置文件中,或在mysqld命令行上。mysqld ... --log-bin -–innodb_api_enable_binlog=1
- 按照“设置基于二进制日志文件位置的复制”中所述配置主服务器和从属服务器。
使用mysqldump创建主数据快照,并将快照同步到从属服务器。
master shell> mysqldump --all-databases --lock-all-tables > dbdump.db slave shell> mysql < dbdump.db
在主服务器上,发出
SHOW MASTER STATUS
以获取主二进制日志坐标。mysql>
SHOW MASTER STATUS ;在从属服务器上,使用一条
CHANGE MASTER TO
语句使用主二进制日志坐标来设置从属服务器。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 ;如果错误日志显示类似于以下内容的输出,则说明从服务器已准备好进行复制。
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复制配置。MySQL客户端用于验证主服务器和从服务器上的结果。
该示例使用该demo_test
表,该表是在插件innodb_memcached_config.sql
的初始设置期间由配置脚本创建的daemon_memcached
。该demo_test
表包含单个示例记录。
使用该
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
表中。假设该demo_test
表以前未修改过,则应该有两条记录。该示例记录的键为AA
,而您刚刚插入的记录的键为test1
。的c1
列映射到键时,c2
列的值,该c3
列的标志值,该c4
列的值CAS,和c5
列的到期时间。由于未使用,到期时间被设置为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 | +------- +-------------- +------ +------ +------ +test1
使用delete
命令删除记录。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
命令从表中删除所有行。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到主服务器并输入两个新记录。
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
命令从表中删除所有行。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二进制日志说明
二进制日志格式:
- 大多数内存缓存操作都映射到 DML语句(类似于插入,删除,更新)。由于MySQL服务器没有处理实际的SQL语句,因此所有memcached命令(除外
flush_all
)均使用基于行的复制(RBR)日志记录,该记录独立于任何服务器binlog_format
设置。 - 该memcached的
flush_all
命令被映射到TRUNCATE TABLE
在MySQL 5.7和更早版本的命令。由于 DDL命令只能使用基于语句的日志记录,因此flush_all
可通过发送一条TRUNCATE TABLE
语句来复制该命令。在MySQL 8.0及更高版本中,flush_all
映射到DELETE
但通过发送一条TRUNCATE TABLE
语句仍被复制。
交易:
- 事务的概念通常不是memcached应用程序的一部分。出于性能方面的考虑,
daemon_memcached_r_batch_size
并且daemon_memcached_w_batch_size
用于控制读取和写入事务的批处理大小。这些设置不会影响复制。InnoDB
成功完成后,将复制基础表上的每个SQL操作。 - 的默认值
daemon_memcached_w_batch_size
就是1
,这意味着每个分布式缓存写操作被立即被提交。此默认设置会产生一定量的性能开销,以避免在主服务器和从属服务器上可见的数据不一致。复制的记录始终在从属服务器上立即可用。如果您设置daemon_memcached_w_batch_size
的值大于1
,则通过memcached插入或更新的记录不会立即在主服务器上显示;要在提交前参见主服务器上的记录,请发出SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
。