因为该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
标志值, 列映射到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)
二进制日志格式:
大多数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