因为该daemon_memcached插件支持 MySQL二进制日志,所以可以复制通过memcached接口在源服务器上进行的更新以
进行备份,平衡密集读取工作负载和高可用性。二进制日志记录支持
所有memcached命令。
您不需要daemon_memcached
在副本服务器上设置插件。此配置的主要优点是增加了源上的写入吞吐量。复制机制的速度不受影响。
daemon_memcached以下部分展示了在将插件与 MySQL 复制结合
使用时如何使用二进制日志功能。假设您已经完成第 14.21.3 节,“设置 InnoDB memcached 插件”中描述的设置。
要将
daemon_memcached插件与 MySQL二进制日志一起使用,请在源服务器上启用innodb_api_enable_binlog配置选项。此选项只能在服务器启动时设置。--log-bin您还必须使用该选项在源服务器上启用 MySQL 二进制日志 。您可以将这些选项添加到 MySQL 配置文件或 mysqld命令行中。mysqld ... --log-bin -–innodb_api_enable_binlog=1配置源服务器和副本服务器,如 第 16.1.2 节“设置基于二进制日志文件位置的复制”中所述。
使用mysqldump创建源数据快照,并将快照同步到副本服务器。
source $> mysqldump --all-databases --lock-all-tables > dbdump.db replica $> 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
此示例演示如何
使用memcached
和 telnet 插入、更新和删除数据来测试InnoDB memcached
复制配置。MySQL 客户端用于验证源服务器和副本服务器上的结果。
该示例使用该demo_test表,该表是
在插件innodb_memcached_config.sql初始设置期间由配置脚本
创建的。daemon_memcached该
demo_test表包含一个示例记录。
使用
set命令插入一条记录,key为test1,flag值为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标志值, 列映射到c4cas值, 列映射到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 OKmysql> 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)
二进制日志格式:
大多数memcached操作都映射到 DML语句(类似于插入、删除、更新)。由于 MySQL 服务器没有实际处理 SQL 语句,因此所有 memcached命令(除了
flush_all)都使用基于行的复制 (RBR) 日志记录,它独立于任何服务器binlog_format设置。memcached
flush_all命令映射到TRUNCATE TABLE命令 。由于 DDL命令只能使用基于语句的日志记录,因此flush_all通过发送TRUNCATE TABLE语句来复制命令。
交易:
事务 的概念 通常不是memcached 应用程序的一部分。出于性能考虑,
daemon_memcached_r_batch_size用于daemon_memcached_w_batch_size控制读写事务的批量大小。这些设置不影响复制。成功完成后,基础InnoDB表上的每个 SQL 操作都会被复制。的默认值为
daemon_memcached_w_batch_size,1这意味着每个 memcached写操作都会立即提交。此默认设置会产生一定量的性能开销,以避免源服务器和副本服务器上可见的数据不一致。复制的记录总是在副本服务器上立即可用。如果设置daemon_memcached_w_batch_size的值大于,则通过memcached1插入或更新的记录不会立即在源服务器上可见;要在提交之前查看源服务器上的记录,请发出.SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED