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  
    3)重启从数据库上的IO线程
        stop slave io_thread;  start slave io_thread;
        

       如果没有重启默认异步复制模式,重启后,slave会在master上注册为半同步复制的slave角色。

    4)查看配置是否成功:
        

         

   测试通过stop/start slave模拟生产中的半同步复制。

    1)在Slave执行stop slave之前,主的insert操作很快就能返回。

      Master:

        

    2)stop slave

      Slave:

        

      Master:

         

      Slave:

        

    3)start slave

       Slave:
        

        

       Slave:

        

 

     

 
 
 
posted on 2022-03-01 13:48  池塘里洗澡的鸭子  阅读(135)  评论(0编辑  收藏  举报