MySQL集群架构之主从模式半同步复制实践
在MySQL集群架构之主从模式 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,通过异步复制的时序图可知:在Master尚未commit前,binlog就写入了Slave端的Relaylog同时也不会等待Slave端的反馈,实践操作验证也确实如此。那就存在一个主要问题:在复制过程当中,主库不会去验证Binlog有没有成功复制到从库,那如果主库提交一个事务并写入Binlog中后,当从库还没有从主库得到Binlog时,主库宕机了或因磁盘损坏等故障导致该事务的Binlog丢失了,那从库就不会得到这个事务,也就造成了主从数据的不一致。
解决上述问题MySQL提供了一个解决方案就是半同步复制,其时序图仍可参考MySQL集群架构之主从模式 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)。通过时序图可知半同步复制的“半”体现在——虽然主从库的Binlog是同步的,但主库不会等待从库执行完Relay-log后才返回,而是确认从库接收到Binlog,达到主从Binlog同步的目的后就返回了,所以从库的数据对于主库来说还是有延时的,这个延时就是从库执行Relay-log的时间。所以只能称为半同步。
半同步复制具体实操如下:
环境准备:
1、同MySQL集群架构之主从模式异步复制实践 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中环境。
2、主从库上分别安装对用插件(半同步复制是一个功能模块,库要能支持动态加载才能实现半同步复制!)
1)先确认MySQL服务器是否支持动态增加插件:select @@have_dynamic_loading;
2)安装:
在master上安装插件:rpl_semi_sync_master,主库的插件是semisync_master.so(Linux):
INSTALL PLUGIN rpl_semi_sync_master SONAME
'semisync_master.so'
;
如果需要卸载(关闭半同步复制功能之后),就执行UNINSTALL PLUGIN rpl_semi_sync_master;
使用show plugins;或者select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%semi%';可以查看插件是否那安装成功:
在slave上安装插件:rpl_semi_sync_slave,从库的插件是semisync_slave.dll(win10):
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.dll';
操作:
1)Master:
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_master_timeout=30000;——当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制(一旦有一次超时自动降级为异步)。
2)Slave:
set global rpl_semi_sync_slave_enabled=1;
以上的启动方式是在登录mysql后的命令行操作,也可写在my.cnf.d配置文件中(推荐这种启动方式):Linux环境,Win文件不一样
主数据库的my.cnf配置文件中添加:
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
从数据库的my.cnf配置文件中添加:
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
在个别高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制!即在主从数据库的my.cnf配置文件中都要添加:
plugin-load =
"rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-
sync
-master-enabled = 1
rpl-semi-
sync
-slave-enabled = 1
如果没有重启默认异步复制模式,重启后,slave会在master上注册为半同步复制的slave角色。
测试:通过stop/start slave模拟生产中的半同步复制。
1)在Slave执行stop slave之前,主的insert操作很快就能返回。
Master:
2)stop slave
Slave:
Master:
Slave:
3)start slave
Slave: