事实上,半同步复制并不是严格意义上的半同步复制
当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。
测试:
1.slave执行stop slave;关闭主从复制
mysql > stop slave; Query OK, 0 rows affected (0.32 sec)
2、master上创建一个表,没接收到反馈信号,等待十秒后(Rpl_semi_sync_master_timeout=1000等待超时),继续执行
mysql > use test; Database changed mysql > create table table1(id int); Query OK, 0 rows affected (10.48 sec) mysql > show tables; +----------------+ | Tables_in_test | +----------------+ | table1 | +----------------+ 1 row in set (0.01 sec)
slave上查看是否有table1表
mysql > use test; Database changed mysql> show tables; Empty set (0.00 sec)
3、master在数据库中再创建table2,不需要等待反馈,直接执行(因为当反馈超时时,master将切换到异步复制模式。此时是异步模式,不需要等待)
mysql > create table table2(id int); Query OK, 0 rows affected (0.11 sec) mysql > show tables; +----------------+ | Tables_in_test | +----------------+ | table1 | | table2 | +----------------+ 2 rows in set (0.00 sec)
4、slave执行start slave,数据开始同步,建立table1、table2,反馈给master,并切换为半同步复制
mysql > start slave; Query OK, 0 rows affected (0.07 sec) mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | table1 | | table2 | +----------------+ 2 rows in set (0.01 sec)
总结:
1. 在一主多从的架构中,如果要开启半同步复制,并不要求所有的从都是半同步复制。
2. MySQL 5.7极大的提升了半同步复制的性能。
5.6版本的半同步复制,dump thread 承担了两份不同且又十分频繁的任务:传送binlog 给slave ,还需要等待slave反馈信息,而且这两个任务是串行的,dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。dump thread 已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的TPS 。
5.7版本的半同步复制中,独立出一个 ack collector thread ,专门用于接收slave 的反馈信息。这样 master 上有两个线程独立工作, 可以同时发送binlog 到slave ,和接收slave的反馈。
您可以选择一种方式赞助本站