1概述:
master每次commit一个事务,要确保slave接受完主服务器发送的binlog日志文件并写入relaylog中,然后给master信号,master才可以成功commit事务,这样保证了主从数据绝对一致(牺牲master性能),但可调整等待时间。
2.实现过程
准备一套M-S架构(基于GTIDs)
1.给master和slave安装插件plugin插件($basedir/lib/plugin/)
master:
mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql>show global variables like 'rpl_semi_sync%';
slave:
mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql>show global variables like 'rpl_semi_sync%';
2.激活master与slave插件
master:
mysql> set global rpl_semi_sync_master_enabled=on;
mysql> show global status like 'rpl_semi_sync%';
slave:
mysql> set global rpl_semi_sync_slave_enabled=on;
mysql>show global variables like 'rpl_semi_sync%';
3.重启slave的IO线程
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;
4.测试
master
insert into db2.u1 values (null,'c');
查看从服务器响应的状态码
show global status like 'rpl_semi_sync%_yes_tx';
3.模拟slave故障
1.模拟slave故障
slave:
service mysqld stop
master:
mysql>insert into db2.u1 values (null,'f'); 观察等待十秒才结束
后续再添加数据会立刻生效,原因是自动转换为异步模式
3.重新启动半同步复制
slave:
service mysqld start
mysql>set global rpl_semi_sync_slave_enabled=on;
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;
4.修改等待时间(默认10s)
mysql>set global rpl_semi_sync_master_timeout=30000;
mysql>show global variables like 'rpl_semi_sync%';
5.插件卸载
mysql>select plugin_name,load_option from information_schema.plugins;
mysql>uninstall plugin plugin_name;
总结:master等待slave确认后才能提交,如果等不到,master等待10秒后自动变成异步同步,slave启动起来后,master上的数据又会自动复制过来,数据又回到一致。