共计 3134 个字符,预计需要花费 8 分钟才能阅读完成。
MySQL 数据库是目前开源应用最大的关系型数据库,有海量的应用将数据存储在 MySQL 数据库中。存储数据的安全性和可靠性是生产数据库的关注重点。本文分析了目前采用较多的保障 MySQL 可用性方案。
MySQL Replication
MySQL Replication 是 MySQL 官方提供的主从同步方案,用于将一个 MySQL 实例的数据,同步到另一个实例中。Replication 为保证数据安全做了重要的保证,也是现在运用最广的 MySQL 容灾方案。Replication 用两个或以上的实例搭建了 MySQL 主从复制集群,提供单点写入,多点读取的服务,实现了读的 scale out。
图 1. MySQL Replication 主从复制集群
如图一所示,一个主实例(M),三个从实例(S),通过 replication,Master 生成 event 的 binlog,然后发给 slave,Slave 将 event 写入 relaylog,然后将其提交到自身数据库中,实现主从数据同步。对于数据库之上的业务层来说,基于 MySQL 的主从复制集群,单点写入 Master,在 event 同步到 Slave 后,读逻辑可以从任何一个 Slave 读取数据,以读写分离的方式,大大降低 Master 的运行负载,同时提升了 Slave 的资源利用。
对于高可用来说,MySQL Replication 有个重要的缺陷:数据复制的时延。在通常情况下,MySQL Replication 数据复制是异步的,即是 MySQL 写 binlog 后,发送给 Slave 并不等待 Slave 返回确认收到,本地事务就提交了。一旦出现网络延迟或中断,数据延迟发送到 Slave 侧,主从数据就会出现不一致。在这个阶段中,Master 一旦宕机,未发送到 Slave 的数据就丢失了,无法做到数据的高可用。
为了解决这个问题,google 提供了解决方案:半同步和同步复制。在数据异步复制的基础之上,做了一点修改。半同步复制是 Master 等待 event 写入 Slave 的 relay 后,再提交本地,保证 Slave 一定收到了需要同步的数据。同步复制不不仅是要求 Slave 收到数据,还要求 Slave 将数据 commit 到数据库中,从而保证每次的数据写入,主从数据都是一致的。
基于半同步和同步复制,MySQL Replication 的高可用得到了质的提升,特别是同步复制。基于同步复制的 MySQL Replication 集群,每个实例读取的数据都是一致的,不会存在 Slave 幻读。同时,Master 宕机后,应用程序切换到任何一个 Slave 都可以保证读写数据的一致性。但是,同步复制带来了重大的性能下降,这里需要做一个折衷。另外,MySQL Replication 的主从切换需要人工介入判断,同时需要 Slave 的 replaylog 提交完毕,故障恢复时间会比较长。
MySQL Fabric
MySQL Fabric 是 MySQL 社区提供的管理多个 MySQL 服务的扩展。高可用是它设计的主要特性之一。
Fabric 将两个及以上的 MySQL 实例划分为一个 HA Group。其中的一个是主,其余的都是从。HA Group 保证访问指定 HA Group 的数据总是可用的。其基础的数据复制是基于 MySQL Replication,然后,Fabric 提供了更多的特性:
失效检测和恢复:Fabric 监控 HA Group 中的主实例,一旦发现主实例失效,Fabric 会从 HA Group 中剩余的从实例中选择一个,并将其提升为主实例。
读写均衡:Fabric 可以自动的处理一个 HA Group 的读写操作,将写操作发送给主实例,而读请求在多个从实例之间做负载均衡。
图 2. Fabric
MHA
MHA(MySQL-master-ha)是目前广泛使用的 MySQL 主从复制的高可用方案。MHA 设计目标是自动实现主实例宕机后,从机切换为主,并尽量降低切换时延(通常在 10-30s 内切换完成)。同时,由 MHA 保证在切换过程中的数据一致性。MHA 对 MySQL 的主从复制集群非常友好,没有对集群做任何侵入性的修改。
MHA 的一个重点特性是:在主实例宕机后,MHA 可以自动的判断主从复制集群中哪个从实例的 relaylog 是最新的,并将最新从实例的差异 log“应用”到其余的从实例中,从而保证每个实例的数据一致。通常情况下,MHA 需要 10s 左右检测主实例异常,并将主实例关闭从而避免脑裂。然后再用 10s 左右将差异的 log event 同步,并启用新的 Master。整个 MHA 的 RTO 时间大约在 30s。
MySQL Cluster
MySQL Cluster 是一个高度可扩展的,兼容 ACID 事务的实时数据库,基于分布式架构不存在单点故障,MySQL Cluster 支持自动水平扩容,并能做自动的读写负载均衡。
MySQL Cluster 使用了一个叫 NDB 的内存存储引擎来整合多个 MySQL 实例,提供一个统一的服务集群。如图三所示。
图 3. MySQL Cluster 组成
MySQL Cluster 由 SQL Nodes,DataNodes,和 NDB Management Server 组成。SQL Nodes 是应用程序的接口,像普通的 mysqld 服务一样,接受用户的 SQL 输入,执行并返回结果。Data Nodes 是数据存储节点,NDB Management Server 用来管理集群中的每个 node。
MySQL Cluster 采用了新的数据分片和容错的方式来实现数据安全和高可用。其由 Partition,Replica,Data Node,Node Group 构成。
Partition:NDB 一张表的一个数据分片,包含一张表的一部分数据。
Replica:一个 Partition 的拷贝。一个 Partition 可以有一个或多个 Replica,一个 Partition 的所有 Replica 数据都是一致的。
Data Node:Replica 的存储载体,每个 Node 存储一个或多个 Replica。
Node Group:一个 Data Node 的集合。
图 4. MySQL Cluster 数据高可用
一个 MySQL Cluster 有 4 个 Node,被分为了两个 Grou。Node1 和 2 归属于 Group0,Node3 和 4 归属于 Group1,。有一张表被分为 4 个 Partition,并分别有两个 Replica。Partition0 和 Partition2 的两个 Replica,分别存储在 Node1 和 Node2 上,Pratition1 和 Partition3 的两个 Replica 分别存在 Node3 和 Node4 上。这样,对于一张表的一个 Partition 来说,在整个集群有两份数据,并分布在两个独立的 Node 上,实现了数据容灾。同时,每次对一个 Partition 的写操作,都会在两个 Replica 上呈现,如果 Primary Replica 异常,那么 Backup Replica 可以立即提供服务,实现数据的高可用。
小结
本文分析了目前 MySQL 使用较多的几种 MySQL 数据复制和高可用方案,从使用来看,MySQL Replication 是使用最为广泛的数据复制方案,因为是 MySQL 原生支持,针对其在不同场景下的一些缺陷,衍生出了半同步复制,强同步复制等数据高可用的方案。在此基础之上,为了运维方便,MySQL Fabric 和 MHA 应运而生,从不同的方向解决了主从切换时数据一致性问题和流程自动化的问题。此外,随着分布式系统架构和方案的逐步成熟。MySQL Cluster 设计了全新的分布式架构,采用多副本,Sharding 等特性,支持水平扩展,做到了 5 个 9 的数据库服务质量保证。
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-11/137591.htm