§ MGR 简介
§ 为什么是 MGR
MGR 是 MySQL Group Replication 的缩写,即 MySQL 组复制。
以往一般是利用 MySQL 的主从复制或半同步复制来提供高可用解决方案,但这存在以下几个比较严重的问题:
- 主从复制间容易发生复制延迟,尤其是在5.6以前的版本,以及当数据库实例中存在没有显式主键表时,很容易发生。
- 主从复制节点间的数据一致性无法自行实现最终一致性。
- 当主节点发生故障时,如果有多个从节点,无法自动从中选择合适的节点作为新的主节点。
- 如果采用(增强)半同步复制,那么当有个从节点因为负载较高、网络延迟或其他意外因素使得事务无法及时确认时,也会反过来影响主节点的事务提交。
因为上述几个明显的缺点,因此 GreatSQL 推出了全新的高可用解决方案——组复制,这是本系列文章要着重介绍的新特性。
MGR 是 MySQL 5.7.17 开始引入的。但 MySQL 5.7 已于 2020 年 10 月起不再做大的功能更新,仅提供安全补丁。因此,如果线上还有基于 MySQL 5.7 版本的 MGR 环境,建议尽快升级到 GreatSQL 8.0 版本。
进一步提醒,推荐 GreatSQL 8.0.22 及之后的版本,整体会更稳定可靠,也有些很不错的新功能(不只是 MGR 方面的)。
§ MGR 技术概要
MGR 具备以下几个特点:
- 基于 shared-nothing 模式,所有节点都有一份完整数据,发生故障时可以直接切换。
- MGR 提供了数据一致性保障,默认是最终一致性,可根据业务特征需要自行调整一致性级别。
- 支持在线添加、删除节点,节点管理更方便。
- 支持故障自动检测及自动切换,发生故障时能自动切换到新的主节点,再配合 MySQL Router 中间件,应用层无需干预或调整。
- 支持单节点、多节点写入两种模式,可根据架构或业务需要选择哪种方案,不过强烈建议选用单主模式。
MGR 可以选择单主(Single-Primary)模式

如上图所示,一开始S1节点是Primary角色,提供读写服务。当它发生故障时,剩下的S2-S5节点会再投票选举出S2作为新的Primary角色提供读写服务,而S1节点在达到一定超时阈值后,就会被踢出。
亦可选择多主(Multi-Primary)模式(再次强烈建议选用单主模式)

如上图所示,一开始S1-S5所有节点都是Primary角色,都可以提供读写服务,任何一个节点发生故障时,只需要把指向这个节点的流量切换下就行。
上述两种架构模式下,应用端通过 MySQL Router 连接后端在 MGR 服务,当后端节点发生切换时,Router 会自动感知,对应用端来说几乎是透明的,影响很小,架构上也更灵活。
§ MGR 技术架构
首先来个 MGR 的技术架构图:

MGR 是以 Plugin 方式嵌入 GreatSQL,部署更灵活方便。
事务从Server层通过钩子(hook)进入MGR API接口层,再分发到各组件层,在组件层完成事务Capture/Apply/Recover,通过复制协议层(Replication Protocol Logics)传输事务,最后经由GCS协调事务在各节点的最终一致性。
MGR 节点间由组通信系统(GCS)提供支持,它提供了故障检测机制、组成员角色管理,以及安全且有序的消息传递,这些机制可确保在各节点间一致地复制数据。这项技术的核心是 Paxos 算法的实现,在 GreatSQL 里称之为 XCom,由它充当 MGR 的通信引擎。
对于要提交的事务,组中的多数派节点必须就全局事务序列中给定的事务顺序达成一致。各节点做出决定提交或中止事务的选择,但所有节点都要做出相同的决定。如果发生网络分区,导致节点间无法达成一致决定,则在网络恢复前,MGR 成员间无法通信,MGR 间复制也就无法正常工作。
MGR 支持单主和多主两种模式,在单主模式下,各节点会自动选定主节点,只有该主节点能同时读写,而其他(从)节点只能只读。在多主模式下,所有节点都可以进行读写。
相对于 MariaDB Galera Cluster(以及基于此技术的 Percona XtraDB Cluster,下面为了书写方便,都统称为 PXC),个人认为 MGR 具备以下几个优势:
- PXC 的消息广播机制是在节点间循环的,需要所有节点都确认消息,因此只要有一个节点故障,则会导致整个 PXC 都发生故障。而 MGR 则是多数派投票模式,个别少数派节点故障时,一般不影响整体的可用性。这也是 PXC 存在的最大问题。
- PXC 的节点间数据传输除了 binlog,还有个 gcache,这相当于是给 MySQL 又增加两个黑盒子。而 MGR 则都是基于原生 binlog 的,没有新增黑盒子,运行起来更可靠,需要排障时也更方便。
- 发生网络分区时,整个 PXC 集群都不可用。而 MGR 则至少其成员节点还能提供只读服务(但是 MGR 间复制无法正常工作)。
- PXC 的流控机制影响更大,一旦触发流控,所有节点都受到影响。而 MGR 触发流控后,只会影响本地节点,不影响远程节点。当然了,MySQL 的流控做的也比较粗糙,在 GreatSQL 中进一步完善和优化。
- 执行 DDL 期间,整个 PXC 集群都不可同时执行 DML,也就是说不支持 Online DDL。而 MGR 是支持的,这也是很大的优势。
相对于传统主从复制(Replication),MGR 的优势有以下几点:
- 主从复制非常容易产生复制延迟,尤其是当表中没有显式主键时。而在 MGR 里,要求表一定要有主键(或是可用作聚集索引的非空唯一索引),避免了这个问题。
- 半同步复制中,一旦 slave 因为锁或其他原因响应慢的话,也会导致 master 事务被阻塞。MGR 是采用多数派确认机制,个别节点响应慢对 Primary 节点的影响没那么大(不要选用 AFTER 模式)。
- 主从复制没有类似 MGR 那样提供事务数据的一致性保证。MGR 自带了事务数据一致性保障机制。
扫码关注微信公众号
