01
什么是MySQL MGR?
MGR是Mysql Group Replication(组复制)的缩写,Mysql5.7之后是以一个Mysql插件的形式集成在Mysql中,用于创建可伸缩、高可用、可容错的复制架构,是Mysql集群的一种形式。MGR包括一套内置的组成员服务,包括节点的自动加入、离开,故障检测等机制,是一项十分被看好的技术。
02
MGR出现的背景
常见的创建容错系统的方法是使用冗余组件,而一旦使用冗余组件,就需要管理多个的服务器,其中就会遇到一些 棘手的问题,例如常见的网络分区、脑裂问题。数据库容错系统的挑战就是如何让集群中的每个服务器都同意当前系统的状态以及每一个更改的数据,也就是让服务器在每个数据库状态转换上达成一致。这样它们就可以作为一个单一的数据库进行开发,或者它们最终会收敛到相同的状态。这意味着它们需要作为一个(分布式)状态机来操作。
MGR正是Mysql提供的状态机复制技术。在MGR中每个服务器都能看到其他组节点的状态,在MGR中称之为视图(view),MGR内置group membership service,为每个节点提供一致的视图,节点的离开、加入都会触发视图的改变,而因为网络异常的原因退出的节点,也会有相应的故障检测机制来发现。
MGR的一个重要特点是对于要提交的事务,组中的大多数必须在全局事务序列中约定给定交易的顺序,决定提交或中止事务是由每个服务器单独完成的,MGR保证所有的服务器都做出相同的决定。
所有这些功能都依赖于底层的节点间通信和协调算法。在Mysql中被称为Group Communication System (GCS),它提供了故障检测机制、组成员服务以及安全且完全有序的消息传递,其底层基于paxos算法。
03
Mysql复制技术
- 主从复制
传统Mysql复制技术为主从复制,一般存在一个master服务器,一个或者多个slave服务器,master执行事务并且提交,稍后binlog被复制到slave,在slave中基于状态、基于行进行复制。它是一个无共享的系统,所有服务器在默认情况下都有完整的数据副本。
- 异步复制
- 半同步复制
半同步复制市在master提交之前需要等待binlog传到slave之后,slave回复ACK给到master,用以确认master执行的事务已经传到了slave,注意这不保证salve应用了这些事务。
- 组复制
组复制本质上是多主更新到处复制的协议,其依赖于底层的组成员间的通讯协议,底层通讯保证了消息的顺序以及原子性。一个重要的特点是组中的成员都是独立地执行事务,但是事务的提交则需要组的协调批准。(只读事务例外,不需要经过组的批准。)
如下图所示,事务将会被发送到多个组成员中,由组成员单独执行,如果存在两个不同的事务,在不同的组成员中并发执行,更新相同的行,这就可能会造成冲突,此时因为不是在单节点上,所以还无法使用单节点的加锁机制在解决此问题。组复制中使用certify过程来解决此问题,在执行事务之前,会检查两个不同并发事务的写集来检测此类冲突。组复制同样是一个无共享的复制方案,其中每个服务器都有自己的全部数据副本。组复制使得Mysql能够实现容错,在部分节点崩溃等情况下,能够实现自动检测和恢复,保证数据库本身还是连续可用的。另外,MGR只是保证数据库的可用性,还需要负载均衡或者路由器等配合,因为可能会出现IP转移等问题,而这部分功能显然是使用独立中间件更合适。
04
MGR底层机制
- 故障检测机制 MGR底层实现了分布式故障检测服务,能够自动检测哪些服务器可能存在问题,并经过组内其他成员同意之后将这些服务器排除出组。相对的,对于一个服务器来说,当它从组中分离出来之后,它会怀疑组内所有的其他成员都失败了,由于此时无法实现“过半数”的同意,所以这个服务器的这种怀疑没有结果,它也无法单独对外提供服务。
- 一致性组内视图 视图是组复制中组内成员都同时维护着的对于组内其他成员的状态表。由于MGR决策过程中需要组内成员的协调,故保持对于组内成员的一致性视图是必要的。引起视图变更的情况有两种:新成员的主动加入或者旧成员主动离开,都会触发一次成员的变更,并通知到其他成员,等待其他成员大多数同意达成一致。组内成员的非自动或者意外断开,故障检测机制将会主动发现,并触发一个成员变更,同样的需要等到成员大多数同意才能更新视图,如果无法达成一致,例如剩下的成员无法实现过半数同意的情况,那么就无法形成一致,这会造成脑裂问题。
- 容错性 MGR底层基于paxos分布式算法,组内节点数n,则允许出错的节点数f=(n-1)/2。
05
MGR运行模式
MGR模式下,集群可以是单主可写的模式,也可以是多主同时可写的模式,具体使用哪种模式通过my.cnf配置文件中配置的参数
:group_replication_single_primary_mode来进行控制
- 当值为true时,MGR运行在Single-Primary Mode单主模式下
- 当值为false时,MGR运行在multi-primary多主模式下