随笔 - 303  文章 - 0  评论 - 3  阅读 - 15万

MySQL集群架构之双主模式概述

  为保证数据库的高可用性,可以采用冗余的方式,但是数据冗余带来的问题是数据一致性问题。主从模式就是该方式的一种集群实现架构,其主要优势就是简单灵活,能满足多种需求。是一种比较主流的用法,同时其劣势也很明显:写操作高可用需自行处理。
  实际使用MySQL主从模式,一主多从、读写分离等的过程中,如果发生单点故障,从库切换成主库还需要作改动。因此,如果是双主或者多主,就会增加MySQL入口,提升了主库的可用性。因此随着业务的发展,数据库架构可以由主从模式演变为双主模式。双主模式是指两台服务器互为主从,任何一台服务器数据变更,都会通过复制应用到另外一方的数据库中。
  既然存在两个master,那又出现了一个头大的问题——两个master都可读可写,可读没啥问题,如果双主可写就问题大了:
    1)ID冲突:在A主库写入,当A数据未同步到B主库时,对B主库写入,如果采用自动递增容易发生ID主键的冲突。
    2)更新丢失:同一条记录在两个主库中进行更新,会发生前面覆盖后面的更新丢失。
  解决方法就是使用高可用的架构模式:其中一个Master提供线上服务,另一个Master作为备胎供高可用切换,Master下游挂载Slave承担读请求。如下图示:

                

   随着业务发展,架构会从主从模式演变为双主模式,用双主单写,再引入高可用组件,例如KeepalivedMMM等工具,实现主库故障自动切换等架构已经发展得比较成熟。下面分别介绍:

  一、MMM架构

    MMMMaster-Master Replication Manager for MySQL)是一套用来管理和监控双主复制,支持双主故障切换 的第三方软件。MMM 使用Perl语言开发,虽然是双主架构,但是业务上同一时间只允许一个节点进行写入操作。下图是基于MMM实现的双主高可用架构:

               

    1、MMM故障处理机制   

      MMM 包含writerreader两类角色,分别对应写节点和读节点:

        1)当 writer节点出现故障,程序会自动移除该节点上的VIP;

        2)写操作切换到 Master2,并将Master2设置为writer;

        3)将所有Slave节点会指向Master2。

      除了管理双主节点,MMM 也会管理 Slave 节点,在出现宕机、复制延迟或复制错误,MMM 会移除该节点的 VIP,直到节点恢复正常。

    2、MMM监控机制

      MMM 包含monitoragent两类程序,功能如下:

      1)monitor:监控集群内数据库的状态,在出现异常时发布切换命令,一般和数据库分开部署。

      2)agent:运行在每个 MySQL 服务器上的代理进程,monitor 命令的执行者,完成监控的探针工作和具体服务设置,例如设置 VIP(虚拟IP)、指向新同步节点。

  二、MHA架构

    MHAMaster High Availability)是一套比较成熟的 MySQL 高可用方案,也是一款优秀的故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。MHA还支持在线快速将Master切换到其他主机,通常只需0.52秒。

    目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器。

                

    MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。          

      1)MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。负责检测master是否宕机、控制故障转移、检查MySQL复制状况等。      

      2)MHA Node运行在每台MySQL服务器上,不管是Master角色,还是Slave角色,都称为Node,是被监控管理的对象节点,负责保存和复制master的二进制日志、识别差异的中继日志事件并将其差异的事件应用于其他的slave、清除中继日志。

    MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master,整个故障转移过程对应用程序完全透明。

    MHA故障处理机制:
      1)把宕机masterbinlog保存下来
      2)根据binlog位置点找到最新的slave
      3)用最新slaverelay log修复其它slave
      4)将保存下来的binlog在最新的slave上恢复
      5)将最新的slave提升为master
      6)将其它slave重新指向新提升的master,并开启主从复制
    MHA优点:
      1)自动故障转移快
      2)主库崩溃不存在数据一致性问题
      3)性能优秀,支持半同步复制和异步复制
      4)一个Manager监控节点可以监控多个集群

  三、主备切换

    主备延迟问题——主备延迟是由主从数据同步延迟导致的,与数据同步有关的时间点主要包括以下三个:

      1)主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;

      2)之后将binlog传给备库 B,我们把备库 B 接收完 binlog 的时刻记为 T2;

      3)备库 B 执行完成这个binlog复制,我们把这个时刻记为 T3

    所谓主备延迟,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,也就T3-T1

    在备库上执行show slave status命令,它可以返回结果信息,seconds_behind_master表示当前备库延迟了多少秒。

    同步延迟主要原因如下:

      1)备库机器性能问题:机器性能差,甚至一台机器充当多个主库的备库。

      2)分工问题:备库提供了读操作,或者执行一些后台分析处理的操作,消耗大量的CPU资源。

      3)大事务操作:大事务耗费的时间比较长,导致主备复制时间长。比如一些大量数据的delete或大表DDL作都可能会引发大事务。

    主备切换是指将备库变为主库,主库变为备库,有可靠性优先可用性优先两种策略。

    可靠性优先

      主备切换过程一般由专门的HA高可用组件完成,但是切换过程中会存在短时间不可用,因为在切换过程中某一时刻主库A和从库B都处于只读状态。如下图所示:

               

       主库由A切换到B,切换的具体流程如下:       

        1)判断从库BSeconds_Behind_Master值,当小于某个值才继续下一步

        2)把主库A改为只读状态(readonly=true

        3)等待从库BSeconds_Behind_Master值降为 0

        4)把从库B改为可读写状态(readonly=false

        5)把业务请求切换至从库B

    可用性优先

      不等主从同步完成, 直接把业务请求切换至从库B ,并且让 从库B可读写 ,这样几乎不存在不可用时间,但可能会数据不一致。

              

      如上图所示,在A切换到B过程中,执行两个INSERT操作,过程如下:

        1)主库A执行完 INSERT c=4 ,得到 (4,4) ,然后开始执行 主从切换

        2)主从之间有5S的同步延迟,从库B会先执行 INSERT c=5 ,得到 (4,5)

        3)从库B执行主库A传过来的binlog日志 INSERT c=4 ,得到 (5,4)

        4)主库A执行从库B传过来的binlog日志 INSERT c=5 ,得到 (5,5)

        5)此时主库A和从库B会有 两行 不一致的数据

      通过上面介绍了解到,主备切换采用可用性优先策略,由于可能会导致数据不一致,所以大多数情况下,优先选择可靠性优先策略。在满足数据可靠性的前提下,MySQL的可用性依赖于同步延时的大小,同步延时越小,可用性就越高。

 

 

 

 

  

    

 

 


      




    

posted on   池塘里洗澡的鸭子  阅读(1124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示