文章目录
一、什么是半同步复制
所谓的半同步复制就是master每commit一个事务(简单来说就是做一个改变数据的操作),要确保slave接受完主服务器发送的binlog日志文件并写入到自己的中继日志relay log里,然后会给master信号,告诉对方已经接收完毕,这样master才能把事物成功commit。这样就保证了master-slave的数据绝对的一致(但是以牺牲master的性能为代价).但等待时间也是可以调整的。
(简单点就是每次master进行了增删改等操作时会先等待slave是否接受到了此次指令,如果slave接收到了就会进行一个回复,然后master才会正常进行增删改操作;否则master等待一段时间后没收到slave的回复就会暂时抛弃主从关系,正常进行自己的增删改操作,直至自己的从数据库回归为止)
二、半同步复制的基本实现
第一步:准备一套M-S(AB)的主从架构
第二步:给MASTER与SLAVE安装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 ceshi2.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返回一次确认信号
+-----------------------------+-------+
#value这边每次slave收到请求时这里的数值都会+1,否则数值不变。
三、等待时间的修改(默认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 |
+------------------------------------+---------+
四、卸载半同步复制插件(不需要时)-将同步设为off时才能正常卸载
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;