当前位置: 首页 > 科技观察

MySQL数据库高可用分析

时间:2023-03-13 13:57:25 科技观察

MySQL数据库是目前开源应用最流行的关系型数据库,有大量的应用将数据存储在MySQL数据库中。存储数据的安全性和可靠性是生产数据库的重点。本文分析目前采用的保证MySQL可用性的方案。MySQLReplicationMySQLReplication是MySQL官方提供的一种主从同步方案,用于将一个MySQL实例的数据同步到另一个实例。复制为保证数据安全做出了重要保障,也是目前使用最广泛的MySQL容灾解决方案。Replication构建一个具有两个或多个实例的MySQL主从复制集群,提供单点写、多点读服务,实现读scaleout。图1.MySQLReplication主从复制集群如图1所示,有1个主实例(M)和3个从实例(S)。Master通过复制,生成事件的binlog,然后发送给slave,slave将事件写入relaylog,再提交给自己的数据库,实现主从数据同步。对于数据库之上的业务层,基于MySQL的主从复制集群,单点写入Master。事件同步到Slave后,读逻辑可以从任意Slave读取数据。降低Master的运行负荷,同时提高Slave的资源利用率。为了高可用,MySQLReplication有一个重要的缺陷:数据复制的延迟。一般情况下,MySQLReplication数据复制是异步的,即MySQL写完binlog后,发送给slave,不等待slave返回确认接收,提交本地事务。一旦出现网络延迟或中断,数据延迟发送到从端,主从数据就会不一致。这个阶段一旦Master宕机,没有发送给Slave的数据就会丢失,无法实现数据的高可用。为了解决这个问题,谷歌提供了一种解决方案:半同步同步复制。在数据异步复制的基础上,做了一点修改。半同步复制是指Master等待事件写入Slave的中继,然后在本地提交,保证Slave一定已经收到需要同步的数据。同步复制不仅需要Slave接收数据,还需要Slave向数据库提交数据,从而保证每次写入数据时主从数据一致。在半同步和同步复制的基础上,MySQLReplication的高可用得到了质的提升,尤其是同步复制。基于同步复制的MySQLReplication集群,各个实例读取的数据是一致的,不会出现slave幻读。同时,Master宕机后,将应用切换到任意一个Slave上,可以保证读写数据的一致性。然而,同步复制会带来显着的性能损失,这里需要权衡。另外,MySQLReplication的主从切换需要人工干预和判断,需要提交slave的replaylog,故障恢复时间较长。MySQLFabricMySQLFabric是MySQL社区提供的一个扩展,用于管理多个MySQL服务。高可用性是其设计的主要特点之一。Fabric将两个或多个MySQL实例划分为一个HAGroup。其中一个是主人,其余的是奴隶。HAGroup保证始终可以访问指定HAGroup的数据。它的基础数据复制是基于MySQLReplication,然后,Fabric提供了更多的特性:故障检测和恢复:Fabric监控HAGroup中的主实例,一旦发现主实例失效,Fabric将移除剩余的从实例从HA组中选择一个,并将其提升为主实例。读写均衡:Fabric可以自动处理一个HAGroup的读写操作,将写操作发送给master实例,并在多个slave实例之间负载均衡读请求。图2FabricMHAMHA(MySQL-master-ha)是目前应用广泛的MySQL主从复制的高可用方案。MHA的设计目标是自动实现主实例宕机后,从机切换到主机,并尽量减少切换延迟(一般在10-30s内完成切换)。同时,MHA保证切换过程中的数据一致性。MHA对MySQL的主从复制集群非常友好,无需对集群进行任何侵入式修改。MHA的一个关键特性是:在主实例宕机后,MHA可以自动判断主从复制集群中哪个从实例的relaylog最好,并将最从实例的差异日志“应用”到其余来自实例,从而保证每个实例的数据是一致的。正常情况下,MHA需要10s左右的时间检测到主实例异常,并关闭主实例,避免脑裂。然后用10s左右同步difference的logevent,启用新的Master。整个MHA的RTO时间约为30s。MySQLClusterMySQLCluster是一个高度可扩展的实时数据库,与ACID事务兼容。基于分布式架构,不存在单点故障。MySQLCluster支持自动水平扩展和自动读写负载均衡。MySQLCluster使用一个叫做NDB的内存存储引擎来集成多个MySQL实例,提供一个统一的服务集群。如图3所示。图3.MySQLCluster组成MySQLCluster由SQLNodes、DataNodes和NDBManagementServer组成。SQL节点是应用程序的接口。与普通的mysqld服务一样,它接受用户的SQL输入,执行并返回结果。DataNodes是数据存储节点,NDBManagementServer用于管理集群中的各个节点。MySQLCluster采用新的数据分片和容错方式,实现数据安全和高可用。它由Partition、Replica、DataNode和NodeGroup组成。Partition:NDB中一个表的一个数据片段,包含了一个表的部分数据。副本:分区的副本。一个Partition可以有一个或多个Replica,一个Partition的所有Replica数据都是一致的。DataNode:Replica的存储载体,每个Node存储一个或多个Replica。节点组:数据节点的集合。图4.MySQLCluster数据高可用一个MySQLCluster有4个Node,分为两个Group。Node1和2属于Group0,Node3和4属于Group1。一张表分为4个Partition,每个Partition有两个Replica。Partition0和Partition2的两个Replica分别存储在Node1和Node2上,Pratition1和Partition3的两个Replica分别存储在Node3和Node4上。这样,对于一张表的一个Partition,整个集群有两份数据,分布在两个独立的Node上,实现了数据容灾。同时,每次对一个Partition的写操作都会呈现在两个Replicas上。如果PrimaryReplica出现异常,BackupReplica可以立即提供服务,实现数据的高可用。总结本文分析了MySQL目前使用的几种MySQL数据复制和高可用方案。从使用的角度来看,MySQLReplication是使用最广泛的数据复制解决方案,因为它是MySQL原生支持的。缺陷导致了半同步复制、强同步复制等高可用方案。在此基础上,为了方便运维,MySQLFabric和MHA应运而生,从不同方向解决了主从切换时的数据一致性和流程自动化问题。另外,随着分布式系统架构和解决方案的逐渐成熟。MySQLCluster设计了全新的分布式架构,采用多副本、分片等特性,支持水平扩展,实现了5个9的数据库服务质量保证。

猜你喜欢