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