您的当前位置:首页正文

分布式数据存储 - MySQL主从复制高可用方案

2023-11-09 来源:帮我找美食网

  • Keepalived/heartbeat
  •        是一个基于VRRP(虚拟路由冗余协议)可用来实现服务高可用性的软件方案,避免出现单点故障。Keepalived一般用来实现轻量级高可用性,且不需要共享存储,一般用于两个节点之间,常见有LVS+Keepalived、Nginx+Keepalived组合。

  • MHA/MMM
  •        MHA是一套MySQL故障切换方案,来保证数据库系统的高可用。在宕机的时间内(通常10—30秒内),完成故障切换,部署MHA,可避免主从一致性问题,易安装,不改变现有部署。 还支持在线切换,从当前运行master切换到一个新的master上面,只需要很短的时间(0.5-2秒内),此时仅仅阻塞写操作,并不影响读操作,便于主机硬件维护。 在有高可用,数据一致性要求的系统上,MHA 提供了有用的功能,几乎无间断的满足维护需要。

  • LVS
  •       (Linux Virtual Server)是一个高可用性虚拟的服务器集群系统。其主要用于多服务器的负载均衡,作用于网络层。LVS构建的服务器集群系统中,前端的负载均衡层被称为Director Server;后端提供服务的服务器组层被称为Real Server。

          LVS有三种工作模式,分别是DR(Direct Routing 直接路由)、TUN(Tunneling IP隧道)、NAT(Network Address Translation 网络地址转换)。其中TUN模式能够支持更多的Real Server,但需要所有服务器支持IP隧道协议;DR也可以支持相当的Real Server,但需要保证Director Server虚拟网卡与物理网卡在同一网段;NAT扩展性有限,无法支持更多的Real Server,因为所有的请求包和应答包都需要Director Server进行解析再生,影响效率。 同时,LVS负载均衡有10中调度算法,分别是rr、wrr、lc、wlc、lblc、lblcr、dh、sh、sed、nq。

    二、基于主从复制的高可用方案                                                                           

    1、双节点主从 + keepalived/heartbeat

        两个节点可以采用简单的一主一从模式,或者双主模式,并且放置于同一个VLAN中,在master节点发生故障后,利用keepalived/heartbeat的高可用机制实现快速切换到slave节点。

     

    注意事项:

  • 采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下(比如脑裂)相互抢占导致往两个节点写入相同数据而引发冲突;
  • 把两个节点的auto_increment_increment(自增起始值)和auto_increment_offset(自增步长)设成不同值。其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;当然了,如果有合适的容错机制能解决主从自增ID冲突的话,也可以不这么做;
  • slave节点服务器配置不要太差,否则更容易导致复制延迟。作为热备节点的slave服务器,硬件配置不能低于master节点;
  • 如果对延迟问题很敏感的话,可考虑使用MariaDB分支版本,或者直接上线MySQL 5.7最新版本,利用多线程复制的方式可以很大程度降低复制延迟;
  • 对复制延迟特别敏感的另一个备选方案,是采用semi sync replication(就是所谓的半同步复制)或者后面会提到的PXC方案,基本上无延迟,不过事务并发性能会有不小程度的损失,需要综合评估再决定;
  • keepalived的检测机制需要适当完善,不能仅仅只是检查mysqld进程是否存活,或者MySQL服务端口是否可通,还应该进一步做数据写入或者运算的探测,判断响应时间,如果超过设定的阈值,就可以启动切换机制;
  • keepalived最终确定进行切换时,还需要判断slave的延迟程度。需要事先定好规则,以便决定在延迟情况下,采取直接切换或等待何种策略。直接切换可能因为复制延迟有些数据无法查询到而重复写入;
  • keepalived或heartbeat自身都无法解决脑裂的问题,因此在进行服务异常判断时,可以调整判断脚本,通过对第三方节点补充检测来决定是否进行切换,可降低脑裂问题产生的风险。
  • 2、多节点主从+MHA/MMM

        多节点主从,可以采用一主多从,或者双主多从的模式。这种模式下,可以采用MHA或MMM来管理整个集群,目前MHA应用的最多,优先推荐MHA,最新的MHA也已支持MySQL 5.6的GTID模式了。

    MHA架构:

    1)Node

       MHA是基于MySQL Replication环境的,在该环境中,不管是Master角色,还是Slave角色,都称为Node,是被监控管理的对象节点。Node服务器上需要安装MHA Node包。

    2)Manager

       Manager为MHA架构中的管理者,建议部署在一台独立的服务器上,当然也可部署在某个Slave上,但该Slave永远不要被选择成为新的Master,否则故障切换后的MHA架构就失去了高可用性。Manager服务器需要安装MHA Manager包,并完善一个主配置文件。一个Manager可管理多套MySQL Replication环境。

    MHA工作原理:

        MHA的目的在于维持MySQL Replication中Master库的高可用性,其最大特点是可以修复多个Slave之间的差异日志,最终使所有Slave保持数据一致,然后从中选择一个充当新的Master,并将其它Slave指向它。

    基本工作流程大致如下:

    1) Manager定期监控Master,监控时间间隔由参数ping_interval决定,缺省为3秒钟一次;可利用其自身的监控功能,也可调用第三方软件来监控;MHA自身提供了两种监控方式:SELECT(执行SELECT 1)和CONNECT(创建连接/断开连接),由于参数ping_type决定,缺省为SELECT方式。

    2) 当监测到Master故障时,调用SSH脚本对所有Node执行一次检查,包括如下几个方面:

  • MySQL实例是否可以连接;
  • Master服务器是否可以SSH连通;
  • 检查SQL Thread的状态;
  • 检查哪些Server死掉了,哪些Server是活动的,以及活动的Slave实例;
  • 检查Slave实例的配置及复制过滤规则;
  • 最后退出监控脚本并返回代表特殊意义代码。
  • 3) 开始Master故障切换,包括如下几个子阶段:

  • 1: Configuration Check Phase
  •         在这个阶段,若某个Slave实例的SQL Thread停止了,则会自动启动它;并再次确认活动的Servers及Slaves。

  • 2: Dead Master Shutdown Phase
  •         在这个阶段,首先调用master_ip_failover_script,若HA是基于VIP实现的,则关闭VIP,若是基于目录数据库实现的,则修改映射记录。然后调用shutdown_script脚本强制关闭主机,以避免服务重启时,发生脑裂。

  • 3: Master Recovery Phase
  •         又包括如下3个子阶段:

      3.1: Getting Latest Slaves Phase

                 检查各个Slave,获取最近的和最旧的binary log file和position,并检查各个Slave成为Master的优先级,依赖于candidate_master、no_master、[server_xxx]顺序、binary log差异量等因素。

      3.2: Saving Dead Master‘s Binlog Phase

                若dead master所在服务器依然可以通过SSH连通,则提取dead master的binary log,提取日志的起点就是上一步获取的最新的binary log file和position,直到最后一条事件日志,并在dead master本地的工作目录(由参数remote_workdir决定)中创建文件保存这些提取到的日志,然后将该文件拷贝到Manager服务器的工作目录下(由参数manager_workdir决定)。当然,若dead master系统就无法连接,也就不存在差异的binary log了。另外,MHA还要对各个Slave节点进行健康检查,主要是SSH连通性。

      3.3: Determining New Master Phase

                接下来调用apply_diff_relay_logs命令恢复Slave的差异日志,这个差异日志指的是各个Slave之间的relay log。恢复完成后,所有的Slave数据是一致的,此时就可以根据优先级选择New Master了。

      3.4: New Master Diff Log Generation Phase

                这里是生成dead master和new master之间的差异日志,即将Phase 3.2保存的binary log拷贝到New Master的工作目录中(remote_workdir)。

      3.5: Master Log Apply Phase

               将上一步拷贝的差异日志恢复到New Master上,若发生错误,也可手动恢复。然后获取New Master的binlog name和position,以便其它Slave从这个新的binlog name和position开始复制。最后会开启New Master的写权限,即将read_only参数设置为0。

  • 4: Slaves Recovery Phase
  •  4.1: Starting Parallel Slave Diff Log Generation Phase

          生成Slave与New Slave之间的差异日志,并将该日志拷贝到各Slave的工作目录下,这部分日志dead master和new master之间差异的那部分日志,因为各个Slave在 3.3阶段已经同步了。

     4.2: Starting Parallel Slave Log Apply Phase

          在各个Slave上应用这部分差异日志,然后通过CHANGE MASTER TO命令将这些Slave指向新的New Master,最后开始复制(start slave)。

  • 5: New master cleanup phase
  •         清理New Master其实就是重置slave info,即取消原来的Slave信息。

    至此整个Master故障切换过程完成。

    简单的说,工作原理:

    从宕机崩溃的master保存二进制日志事件(binlog events);

    识别含有最新更新的slave;

    应用差异的中继日志(relay log)到其他的slave;

    应用从master保存的二进制日志事件(binlog events);

    提升一个slave为新的master;

    使其他的slave连接新的master进行复制;

    MHA的优势:

    1)master自动监控和故障转移    在当前已存在的主从复制环境中,MHA可以监控master主机故障,并且故障自动转移。即使有一些slave没有接受新的relay log events,MHA也会从最新的slave自动识别差异的relay log events,并apply差异的event到其他slaves。因此所有的slave都是一致的。MHA秒级别故障转移(9-12秒监测到主机故障,任选7秒钟关闭电源主机避免脑裂,接下来apply差异relay logs,注册到新的master,通常需要时间10-30秒即total downtime)。另外,在配置文件里可以配置一个slave优先成为master。因为MHA修复了slave之间的一致性,dba就不用去处理一致性问题。当迁移新的master之后,并行恢复其他slave。即使有成千上万的slave,也不会影响恢复master时间,slave也很快完成。当其中一个master崩溃,MHA4秒完成故障转移,这是主动/被动集群解决方案无法完成的。2)互动(手动)master故障转移    MHA可以用来只做故障转移,而不监测master,MHA只作为故障转移的交互。3)非交互式故障转移    非交互式的故障转移也提供(不监控master,自动故障转移)。这个特性很有用,特别是你已经安装了其他软件监控master。比如,用Pacemaker(Heartbeat)监测master故障和vip接管,用MHA故障转移和slave提升。4)在线切换master到不同主机    在很多情况下,有必要将master转移到其他主机上(如替换raid控制器,提升master机器硬件等等)。这并不是master崩溃,但是计划维护必须去做。计划维护导致downtime,必须尽可能快的恢复。快速的master切换和优雅的阻塞写操作是必需的,MHA提供了这种方式。优雅的master切换, 0.5-2秒内阻塞写操作。在很多情况下0.5-2秒的downtime是可以接受的,并且即使不在计划维护窗口。这意味着当需要更换更快机器,升级高版本时,dba可以很容易采取动作。5)master crash不会导致主从数据不一致性    当master crash后,MHA自动识别slave间relay logevents的不同,然后应用与不同的slave,最终所有slave都同步。结合通过半同步一起使用,几乎没有任何数据丢失。6)MHA部署不影响当前环境设置    MHA最重要的一个设计理念就是尽可能使用简单。使用与5.0+以上主从环境,其他HA方案需要改变mysql部署设置,MHA不会让dba做这些部署配置,同步和半同步环境都可以用。启动/停止/升级/降级/安装/卸载 MHA都不用改变mysql主从(如启动/停止)。当你需要升级MHA到新版本时,不需要停止mysql,仅仅更新MHA版本,然后重新启动MHAmanger即可。MHA 支持包含5.0/5/1/5.5/5.6。有些HA方案要求特定的mysql版本(如mysqlcluster,mysql withglobal transaction id 等),而且你可能不想仅仅为了MasterHA而迁移应用。7)不额外增加服务器    MHA 包含MHA Manager和MHA node。MHA node运行在每台mysql服务器上,Manager可以单独部署一台机器,监控100+以上master,总服务器数量不会有太大增加。需要注意的是Manager也可以运行在slaves中的一台机器上。8)性能无影响    当监控master,MHA只是几秒钟(默认3秒)发送ping包,不发送大的查询。主从复制性能不受影响9)适用任何mysql在主从中适用的存储引擎    Mysql不仅仅适用于事务安全的innodb引擎,在主从中适用的引擎,MHA都可以适用。即使用遗留环境的mysiam引擎,不进行迁移,也可以用MHA。

    MHA的限制:

  • 需要在各个节点间打通ssh信任,这对某些公司安全制度来说是个挑战,因为如果某个节点被黑客攻破的话,其他节点也会跟着遭殃;
  • 自带提供的脚本还需要进一步补充完善,当然了,一般的使用还是够用的。
  • MHA连接切换:

         通常有两种解决方案:一是引入VIP,当数据库切换时,VIP随之切换;常用的HA软件中,大多是采用VIP实现的,比如Oracle RAC,SQL Server群集、Heartbeat等。二是采用全局目录数据库,即将应用和数据库之间的连接映射为一个列表,当数据库切换时,更改这个映射列表。MHA并不限制用户使用那种方式,只是通过master_ip_failover_script配置参数提供了一个接口。 若采用VIP的方式来实现,可引入第三方软件,比如Keplived等,也可自行编写一个VIP切换脚本。 

    3、多节点主从+zookeeper

        在大规模节点环境下,采用keepalived或者MHA作为MySQL的高可用管理还是有些复杂或麻烦。首先,这么多节点如果没有采用配置服务来管理,必然杂乱无章,线上切换时很容易误操作。在较大规模环境下,建议采用zookeeper管理集群,可实现快速检测切换,以及便捷的节点管理。

     

     

     参考

    传送门LVS+Keepalived和MHA安装配置:

    http://bestvivi.com/2015/09/09/MySQL%E4%B8%BB%E4%B8%BB%E5%A4%8D%E5%88%B6+LVS+Keepalived%E5%AE%9E%E7%8E%B0MySQL%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7/

    http://joelhy.github.io/2015/02/06/mysql-mha/

     

    分布式数据存储 - MySQL主从复制高可用方案

    标签:

    小编还为您整理了以下内容,可能对您也有帮助:

    MySQL高可用的几种方案MySQL的各种高可用方案,大多是基于以下几种基础来部署的:

    基于主从复制;

    基于Galera协议;

    基于NDB引擎;

    基于中间件/proxy;

    基于共享存储;

    基于主机高可用;

    在这些可选项中,最常见的就是基于主从复制的方案,其次是基于Galera的方案,我们重点说说这两种方案。其余几种方案在生产上用的并不多,我们只简单说下。

    基于主从复制的高可用方案

    双节点主从 + keepalived/heartbeat

    一般来说,中小型规模的时候,采用这种架构是最省事的。两个节点可以采用简单的一主一从模式,或者双主模式,并且放置于同一个VLAN中,在master节点发生故障后,利用keepalived/heartbeat的高可用机制实现快速切换到slave节点。

    在这个方案里,有几个需要注意的地方:

    采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下(比如脑裂)相互抢占导致往两个节点写入相同数据而引发冲突;

    把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(自增起始值)设成不同值。其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;当然了,如果有合适的容错机制能解决主从自增ID冲突的话,也可以不这么做;

    slave节点服务器配置不要太差,否则更容易导致复制延迟。作为热备节点的slave服务器,硬件配置不能低于master节点;

    如果对延迟问题很敏感的话,可考虑使用MariaDB分支版本,或者直接上线MySQL 5.7最新版本,利用多线程复制的方式可以很大程度降低复制延迟;

    对复制延迟特别敏感的另一个备选方案,是采用semi sync replication(就是所谓的半同步复制)或者后面会提到的PXC方案,基本上无延迟,不过事务并发性能会有不小程度的损失,需要综合评估再决定;

    keepalived的检测机制需要适当完善,不能仅仅只是检查mysqld进程是否存活,或者MySQL服务端口是否可通,还应该进一步做数据写入或者运算的探测,判断响应时间,如果超过设定的阈值,就可以启动切换机制;

    keepalived最终确定进行切换时,还需要判断slave的延迟程度。需要事先定好规则,以便决定在延迟情况下,采取直接切换或等待何种策略。直接切换可能因为复制延迟有些数据无法查询到而重复写入;

    keepalived或heartbeat自身都无法解决脑裂的问题,因此在进行服务异常判断时,可以调整判断脚本,通过对第三方节点补充检测来决定是否进行切换,可降低脑裂问题产生的风险。

    双节点主从+keepalived/heartbeat方案架构示意图见下:

    图解:MySQL双节点(单向/双向主从复制),采用keepalived实现高可用架构。

    多节点主从+MHA/MMM

    多节点主从,可以采用一主多从,或者双主多从的模式。这种模式下,可以采用MHA或MMM来管理整个集群,目前MHA应用的最多,优先推荐MHA,最新的MHA也已支持MySQL 5.6的GTID模式了,是个好消息。MHA的优势很明显:

    开源,用Perl开发,代码结构清晰,二次开发容易;

    方案成熟,故障切换时,MHA会做到较严格的判断,尽量减少数据丢失,保证数据一致性;

    提供一个通用框架,可根据自己的情况做自定义开发,尤其是判断和切换操作步骤;

    支持binlog server,可提高binlog传送效率,进一步减少数据丢失风险。

    不过MHA也有些:

    需要在各个节点间打通ssh信任,这对某些公司安全制度来说是个挑战,因为如果某个节点被黑客攻破的话,其他节点也会跟着遭殃;

    自带提供的脚本还需要进一步补充完善,当然了,一般的使用还是够用的。

    多节点主从+etcd/zookeeper

    在大规模节点环境下,采用keepalived或者MHA作为MySQL的高可用管理还是有些复杂或麻烦。首先,这么多节点如果没有采用配置服务来管理,必然杂乱无章,线上切换时很容易误操作。在较大规模环境下,建议采用etcd/zookeeper管理集群,可实现快速检测切换,以及便捷的节点管理。

    基于Galera协议的高可用方案

    Galera是Codership提供的多主数据同步复制机制,可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据一致性。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(简称PXC),目前PXC用的会比较多一些。

    PXC的架构示意图见下:

    (图片源自网络),图解:在底层采用wsrep接口实现数据在多节点间的同步复制。

    (图片源自网络),图解:在PXC中,一次数据写入在各个节点间的验证/回滚流程。

    PXC的优点

    服务高可用;

    数据同步复制(并发复制),几乎无延迟;

    多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让galera解决数据冲突;

    新节点可以自动部署,部署操作简单;

    数据严格一致性,尤其适合电商类应用;

    完全兼容MySQL;

    虽然有这么多好处,但也有些局限性:

    只支持InnoDB引擎;

    所有表都要有主键;

    不支持LOCK TABLE等显式锁操作;

    锁冲突、死锁问题相对更多;

    不支持XA;

    集群吞吐量/性能取决于短板;

    新加入节点采用SST时代价高;

    存在写扩大问题;

    如果并发事务量很大的话,建议采用InfiniBand网络,降低网络延迟;

    事实上,采用PXC的主要目的是解决数据的一致性问题,高可用是顺带实现的。因为PXC存在写扩大以及短板效应,并发效率会有较大损失,类似semi sync replication机制。

    其他高可用方案

    基于NDB Cluster,由于NDB目前仍有不少缺陷和,不建议在生产环境上使用;

    基于共享存储,一方面需要不太差的存储设备,另外共享存储可也会成为新的单点,除非采用基于高速网络的分布式存储,类似RDS的应用场景,架构方案就更复杂了,成本也可能更高;

    基于中间件(Proxy),现在可靠的Proxy选择并不多,而且没有通用的Proxy,都有有所针对,比如有的专注解决读写分离,有的专注分库分表等等,真正好用的Proxy一般要自行开发;

    基于主机高可用,是指采用类似RHCS构建一个高可用集群后,再部署MySQL应用的方案。老实说,我没实际用过,但从侧面了解到这种方案生产上用的并不多,可能也有些局限性所致吧;

    MySQL高可用的几种方案

    标签:

    五大常见的MySQL高可用方案(最全)

    1. 概述

    我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面:

    如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。

    用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致。

    当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺失或者数据不一致而影响业务。

    关于对高可用的分级在这里我们不做详细的讨论,这里只讨论常用高可用方案的优缺点以及高可用方案的选型。

    2. 高可用方案

    2.1. 主从或主主半同步复制

    使用双节点数据库,搭建单向或者双向的半同步复制。在5.7以后的版本中,由于lossless replication、logical多线程复制等一些列新特性的引入,使得MySQL原生半同步复制更加可靠。

    常见架构如下:

    通常会和proxy、keepalived等第三方软件同时使用,即可以用来监控数据库的 健康 ,又可以执行一系列管理命令。如果主库发生故障,切换到备库后仍然可以继续使用数据库。

    优点:

    架构比较简单,使用原生半同步复制作为数据同步的依据;

    双节点,没有主机宕机后的选主问题,直接切换即可;

    双节点,需求资源少,部署简单;

    缺点:

    完全依赖于半同步复制,如果半同步复制退化为异步复制,数据一致性无法得到保证;

    需要额外考虑haproxy、keepalived的高可用机制。

    2.2. 半同步复制优化

    半同步复制机制是可靠的。如果半同步复制一直是生效的,那么便可以认为数据是一致的。但是由于网络波动等一些客观原因,导致半同步复制发生超时而切换为异步复制,那么这时便不能保证数据的一致性。所以尽可能的保证半同步复制,便可提高数据的一致性。

    该方案同样使用双节点架构,但是在原有半同复制的基础上做了功能上的优化,使半同步复制的机制变得更加可靠。

    可参考的优化方案如下:

    2.2.1. 双通道复制

    半同步复制由于发生超时后,复制断开,当再次建立起复制时,同时建立两条通道,其中一条半同步复制通道从当前位置开始复制,保证从机知道当前主机执行的进度。另外一条异步复制通道开始追补从机落后的数据。当异步复制通道追赶到半同步复制的起始位置时,恢复半同步复制。

    2.2.2. binlog文件服务器

    搭建两条半同步复制通道,其中连接文件服务器的半同步通道正常情况下不启用,当主从的半同步复制发生网络问题退化后,启动与文件服务器的半同步复制通道。当主从半同步复制恢复后,关闭与文件服务器的半同步复制通道。

    优点:

    双节点,需求资源少,部署简单;

    架构简单,没有选主的问题,直接切换即可;

    相比于原生复制,优化后的半同步复制更能保证数据的一致性。

    缺点:

    需要修改内核源码或者使用mysql通信协议。需要对源码有一定的了解,并能做一定程度的二次开发。

    依旧依赖于半同步复制,没有从根本上解决数据一致性问题。

    2.3. 高可用架构优化

    将双节点数据库扩展到多节点数据库,或者多节点数据库集群。可以根据自己的需要选择一主两从、一主多从或者多主多从的集群。

    由于半同步复制,存在接收到一个从机的成功应答即认为半同步复制成功的特性,所以多从半同步复制的可靠性要优于单从半同步复制的可靠性。并且多节点同时宕机的几率也要小于单节点宕机的几率,所以多节点架构在一定程度上可以认为高可用性是好于双节点架构。

    但是由于数据库数量较多,所以需要数据库管理软件来保证数据库的可维护性。可以选择MMM、MHA或者各个版本的proxy等等。常见方案如下:

    2.3.1. MHA+多节点集群

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

    MHA Node运行在每台MySQL服务器上,主要作用是切换时处理二进制日志,确保切换尽量少丢数据。

    MHA也可以扩展到如下的多节点集群:

    优点:

    可以进行故障的自动检测和转移;

    可扩展性较好,可以根据需要扩展MySQL的节点数量和结构;

    相比于双节点的MySQL复制,三节点/多节点的MySQL发生不可用的概率更低

    缺点:

    至少需要三节点,相对于双节点需要更多的资源;

    逻辑较为复杂,发生故障后排查问题,定位问题更加困难;

    数据一致性仍然靠原生半同步复制保证,仍然存在数据不一致的风险;

    可能因为网络分区发生脑裂现象;

    2.3.2. zookeeper+proxy

    Zookeeper使用分布式算法保证集群数据的一致性,使用zookeeper可以有效的保证proxy的高可用性,可以较好的避免网络分区现象的产生。

    优点:

    较好的保证了整个系统的高可用性,包括proxy、MySQL;

    扩展性较好,可以扩展为大规模集群;

    缺点:

    数据一致性仍然依赖于原生的mysql半同步复制;

    引入zk,整个系统的逻辑变得更加复杂;

    2.4. 共享存储

    共享存储实现了数据库服务器和存储设备的解耦,不同数据库之间的数据同步不再依赖于MySQL的原生复制功能,而是通过磁盘数据同步的手段,来保证数据的一致性。

    2.4.1. SAN共享储存

    SAN的概念是允许存储设备和处理器(服务器)之间建立直接的高速网络(与LAN相比)连接,通过这种连接实现数据的集中式存储。常用架构如下:

    使用共享存储时,MySQL服务器能够正常挂载文件系统并操作,如果主库发生宕机,备库可以挂载相同的文件系统,保证主库和备库使用相同的数据。

    优点:

    两节点即可,部署简单,切换逻辑简单;

    很好的保证数据的强一致性;

    不会因为MySQL的逻辑错误发生数据不一致的情况;

    缺点:

    需要考虑共享存储的高可用;

    价格昂贵;

    2.4.2. DRBD磁盘复制

    DRBD是一种基于软件、基于网络的块复制存储解决方案,主要用于对服务器之间的磁盘、分区、逻辑卷等进行数据镜像,当用户将数据写入本地磁盘时,还会将数据发送到网络中另一台主机的磁盘上,这样的本地主机(主节点)与远程主机(备节点)的数据就可以保证实时同步。常用架构如下:

    当本地主机出现问题,远程主机上还保留着一份相同的数据,可以继续使用,保证了数据的安全。

    DRBD是linux内核模块实现的快级别的同步复制技术,可以与SAN达到相同的共享存储效果。

    优点:

    两节点即可,部署简单,切换逻辑简单;

    相比于SAN储存网络,价格低廉;

    保证数据的强一致性;

    缺点:

    对io性能影响较大;

    从库不提供读操作;

    2.5. 分布式协议

    分布式协议可以很好解决数据一致性问题。比较常见的方案如下:

    2.5.1. MySQL cluster

    MySQL cluster是官方集群的部署方案,通过使用NDB存储引擎实时备份冗余数据,实现数据库的高可用性和数据一致性。

    优点:

    全部使用官方组件,不依赖于第三方软件;

    可以实现数据的强一致性;

    缺点:

    国内使用的较少;

    配置较复杂,需要使用NDB储存引擎,与MySQL常规引擎存在一定差异;

    至少三节点;

    2.5.2. Galera

    基于Galera的MySQL高可用集群, 是多主数据同步的MySQL集群解决方案,使用简单,没有单点故障,可用性高。常见架构如下:

    优点:

    多主写入,无延迟复制,能保证数据强一致性;

    有成熟的社区,有互联网公司在大规模的使用;

    自动故障转移,自动添加、剔除节点;

    缺点:

    需要为原生MySQL节点打wsrep补丁

    只支持innodb储存引擎

    至少三节点;

    2.5.3. POAXS

    Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。这个算法被认为是同类算法中最有效的。Paxos与MySQL相结合可以实现在分布式的MySQL数据的强一致性。常见架构如下:

    优点:

    多主写入,无延迟复制,能保证数据强一致性;

    有成熟理论基础;

    自动故障转移,自动添加、剔除节点;

    缺点:

    只支持innodb储存引擎

    至少三节点;

    3. 总结

    随着人们对数据一致性的要求不断的提高,越来越多的方法被尝试用来解决分布式数据一致性的问题,如MySQL自身的优化、MySQL集群架构的优化、Paxos、Raft、2PC算法的引入等等。

    而使用分布式算法用来解决MySQL数据库数据一致性的问题的方法,也越来越被人们所接受,一系列成熟的产品如PhxSQL、MariaDB Galera Cluster、Percona XtraDB Cluster等越来越多的被大规模使用。

    随着官方MySQL Group Replication的GA,使用分布式协议来解决数据一致性问题已经成为了主流的方向。期望越来越多优秀的解决方案被提出,MySQL高可用问题可以被更好的解决。

    如何配置MySQL主从复制

    MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最

    MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。

    为什么使用主从复制?

    1、主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。

    2、通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。但是不要同时在主从服务器上进行更新,这样可能引起冲突。

    3、使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

    MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。

    默认中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪中继日志索引文件来识别目前正使用的中继日志。默认中继日志索引文件名为host_name-relay-bin.index。在默认情况,这些文件在从服务器的数据目录中被创建。中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。当SQL线程执行完中继日志中的所有事件后,中继日志将会被自动删除。

    从服务器在数据目录中另外创建两个状态文件--master.info和relay-log.info。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。

    设置主从复制:

    1、确保在主服务器和从服务器上安装的MySQL版本相同,并且最好是MySQL的最新稳定版本。

    2、在主服务器上为复制设置一个连接账户。该账户必须授予REPLICATION SLAVE权限。如果账户仅用于复制(推荐这样做),则不需要再授予任何其它权限。

    mysql> GRANT REPLICATION SLAVE ON *.*

    TO 'replication'@'%.yourdomain.com' IDENTIFIED BY 'slavepass';

    3、执行FLUSH TABLES WITH READ LOCK语句清空所有表和块写入语句:

    mysql> FLUSH TABLES WITH READ LOCK;

    保持mysql客户端程序不要退出。开启另一个终端对主服务器数据目录做快照。

    shell> cd /usr/local/mysql/

    shell> tar -cvf /tmp/mysql-snapshot.tar ./data

    如果从服务器的用户账户与主服务器的不同,你可能不想复制mysql数据库。在这种情况下,应从归档中排除该数据库。你也不需要在归档中包括任何日志文件或者master.info或relay-log.info文件。

    当FLUSH TABLES WITH READ LOCK所置读锁定有效时(即mysql客户端程序不退出),读取主服务器上当前的二进制日志名和偏移量值:

    mysql > SHOW MASTER STATUS;

    +---------------+----------+--------------+------------------+

    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

    +---------------+----------+--------------+------------------+

    | mysql-bin.003 | 73 | test | manual,mysql |

    +---------------+----------+--------------+------------------+

    File列显示日志名,而Position显示偏移量。在该例子中,二进制日志值为mysql-bin.003,偏移量为73。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,,从服务器应从该点开始从主服务器上进行新的更新。

    如果主服务器运行时没有启用--logs-bin,SHOW MASTER STATUS显示的日志名和位置值为空。在这种情况下,当以后指定从服务器的日志文件和位置时需要使用的值为空字符串('')和4.

    取得快照并记录日志名和偏移量后,回到前一中端重新启用写活动:

    mysql> UNLOCK TABLES;

    4、确保主服务器主机上my.cnf文件的[mysqld]部分包括一个log-bin选项。该部分还应有一个server-id=Master_id选项,其中master_id必须为1到232–1之间的一个正整数值。例如:

    [mysqld]

    log-bin

    server-id=1

    如果没有提供那些选项,应添加它们并重启服务器。

    5、停止从服务器上的mysqld服务并在其my.cnf文件中添加下面的行:

    [mysqld]

    server-id=2

    slave_id值同Master_id值一样,必须为1到232–1之间的一个正整数值。并且,从服务器的ID必须与主服务器的ID不相同。

    6、将数据备据目录中。确保对这些文件和目录的权限正确。服务器 MySQL运行的用户必须能够读写文件,如同在主服务器上一样。

    Shell> chown -R mysql:mysql /usr/local/mysql/data

    7、启动从服务器。在从服务器上执行下面的语句,用你的系统的实际值替换选项值:

    mysql> CHANGE MASTER TO

    MASTER_HOST='master_host_name',

    MASTER_USER='replication_user_name',

    MASTER_PASSWORD='replication_password',

    MASTER_LOG_FILE='recorded_log_file_name',

    MASTER_LOG_POS=recorded_log_position;

    8、启动从服务器线程:

    mysql> START SLAVE;

    执行这些程序后,从服务器应连接主服务器,并补充自从快照以来发生的任何更新。

    9、如果出现复制错误,从服务器的错误日志(HOSTNAME.err)中也会出现错误消息。

    10、从服务器复制时,会在其数据目录中发现文件master.info和HOSTNAME-relay-log.info。从服务器使用这两个文件跟踪已经处理了多少主服务器的二进制日志。不要移除或编辑这些文件,除非你确切知你正在做什么并完全理解其意义。即使这样,最好是使用CHANGE MASTER TO语句。

    Top