半同步复制
一、半同步复制
1、什么是半同步复制
所谓的半同步复制就是master每commit一个事务(简单来说就是做一个改变数据的操作),要确保slave接受完主服务器发送的binlog日志文件并写入到自己的中继日志relay log里,然后会给master信号,告诉对方已经接收完毕,这样master才能把事物成功commit。这样就保证了master-slave的数据绝对的一致(但是以牺牲master的性能为代价).但等待时间也是可以调整的。
2、半同步复制的基本实现
第一步:准备一套M-S的主从架构(建议使用基于GTIDs架构设计)
第二步:给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%';
第三步:激活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%';
第四步:在SLAVE服务器中重启IO线程
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;
第五步:测试验证半同步复制
当slave从库的IO_Thread 线程将binlog日志接受完毕后,要给master一个确认,如果超过10s未收到slave的接收确认信号,那么就会自动转换为传统的异步复制模式。
1)master插入一条记录,查看slave是否有成功返回
mysql> insert into db_itheima.tb_student values (null,'j');
mysql> show global status like 'rpl_semi_sync%_yes_tx';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 1 |
表示这次事物成功从slave返回一次确认信号
+-----------------------------+-------+
2)模拟slave服务器故障
SLAVE:
# service mysqld stop
MASTER:
mysql> insert into db_itheima.tb_student values (null,'k');
mysql> insert into db_itheima.tb_student values (null,'l');
这次插入一个值需要等待10秒(默认的等待时间)
mysql> insert into db_itheima.tb_student values (null,'m');
现在自动转成了原来的异步模式
3)重新启动半同步复制
SLAVE:
# service mysqld start
# mysql -P 3310 -p
mysql> set global rpl_semi_sync_slave_enabled=on;
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;
master需要等到slave确认后才能提交,如果等不到确认消息,master等待10s种后自动变成异步同步;slave启起来后,master上改变的数据还是会自动复制过来,数据又回到一致。
3、等待时间的修改(默认10s)
mysql> set global rpl_semi_sync_master_timeout=3600000;
mysql> show global variables like 'rpl_semi_sync%';
+------------------------------------+---------+
| Variable_name | Value |
+------------------------------------+---------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 3600000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+---------+
4、卸载半同步复制插件(不需要时)
mysql> select plugin_name,load_option from information_schema.plugins;
mysql> uninstall plugin 插件名称;
补充:mysqld重启后,需要手工启动主从同步
# service mysqld stop
# service mysqld start
# mysql -P 3310 -p
mysql> show slave status\G
Slave_IO_Running: No
Slave_SQL_Running: No
以上情况代表,mysqld重启后,主从同步也会随之关闭,需要手工开启。
mysql> start slave;