最近整理了目前的MySQL高可用方案。
MySQL 高可用方案包括3大类:
- 共享存储
- 同步复制
- 基于复制的冗余
下面分别看下每种方案。
1.共享存储
共享存储实现了数据库服务器和存储设备的解耦。
比较典型的是SAN共享存储和DRBD磁盘复制。
1.1 SAN
SAN(Storage Area Network)存储如图所示。
SAN共享存储中,如果主库发生宕机,备库可以挂载相同的文件系统,保证主库和备库使用相同的数据。
1.2 DRBD
DRBD(Distributed Replicated Block Device)是Linux内核模块实现的块级别的同步复制技术,可以与SAN达到相同的共享存储效果。
2.同步复制
同步复制的基本原理是,要求数据在集群中所有节点或大多数节点上提交。
同步复制的数据库高可用方案,主要包括3种:
- MySQL Cluster
- Galera Cluster
- MGR
2.1 MySQL Cluster
MySQL Cluster 或NDB Cluster 是MySQL 官方集群部署方案,基于NDB(Network DataBase) 存储引擎的完整的分布式数据库系统。
MySQL cluster主要由3部分组成:
- SQL 层的 SQL 服务器节点
- Storage 层的 NDB 数据节点
- 负责管理各个节点的 Manage 节点
2.2 Galera Cluster
Galera Cluster是由第三方公司Codership所研发的一套免费开源的集群高可用性方案,实现了数据零丢失,官网地址为http://galeracluster.com/。其在MySQL InnoDB存储引擎基础上打了wsrep(虚拟全同步复制)补丁,Percona/MariaDB已捆绑在各自的发行版里,即PXC(Percona Xtradb Cluster), MGC(MariaDB Galera Cluster),目前只可在Linux系统下使用。
Galera Cluster的三个(或多个)节点是对等关系,每个节点均支持写入,集群内部会保证写入数据的一致性与完整性。
2.3 MGR
MGR, 即MySQL Group Replication(组复制),是MySQL官方推荐的一款高可用集群方案。MGR基于分布式协议Paxos,实现组复制,彻底解决了传统的异步复制和半同步复制中数据一致性无法保证的问题。
使MySQL的使用领域更加广泛,可以涉足互联网金融行业。
当客户端发起一个更新事务时,该事务先在本地执行。
执行完成之后,在发起事务的提交之前,会将产生的write set广播到其他节点,集群中节点进行冲突检测。
如果冲突检测成功,达成一致,组内决定该事务可以提交,其它成员可以应用,否则就回滚。
最终,所有组内成员以相同的顺序接收同一组事务。因此组内成员以相同的顺序应用相同的修改,保证组内数据强一致性。
MGR的两种模式:
- 单主模式
组复制具有自动选主功能,每次只有一个 Server成员接受更新,其它成员只提供读服务。 - 多主模式
所有的Server 成员都可以同时接受更新,没有主从之分,成员角色是完全对等的。
3.基于复制的冗余
基于MySQL原生的复制。
复制工作过程包括:
- 主库将数据更改记录到Binary Log
- 从库将主库上的二进制日志复制到自己的Relay log
- 从库读取中继日志,将主库的修改重放到从库上
基于复制的高可用方案主要包括MMM和MHA。
3.1 MMM
MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡。
3.2 MHA
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。