|||
本文简单介绍下MGR的整体技术架构概况,事务同步过程,事务认证机制等关键知识点。
再来看一遍MGR的架构图:
从上图可知,MGR工作时,主要涉及到以下三层:
MGR是以Plugin(插件)的方式集成到MySQL中,可以简单灵活部署,它在MySQL进行事务处理、Binlog传输和持久化等逻辑处理时,预埋了一些(Hook)钩子,在钩子上注册函数处理MGR相关逻辑。
以用户提交事务为例:
在上面的架构图中,可以看到有以下几个模块:
MGR集群由DB1、DB2、DB3三个节点构成,则对于DB1来说,DB2、DB3上产生的事务就是远程事务,而DB1上产生的事务则是本地事务。
用户发起事务请求,在MGR层的简化流程是下面这样的:
P.S,事务认证过程也叫做冲突检测,是同一个意思。
下图展示了事务在MGR的流转过程:
下面介绍MGR工作流程中的一些关键点。
首先,需要先判断该事务是否需要交由MGR处理以及MGR当前是否可以处理事务。
如果事务已经属于group_replication_applier 或 group_replication_recovery channel,说明该事务已经被本节点或其他节点的MGR模块处理过,无需再进入MGR层。
如果事务进入MGR层,就先初始化事务GTID信息,这里要分为两种情况。通常,进入MGR的新事务还未产生GTID,表明该事务是在本节点第一次执行;另一种是已经有GTID,这说明该事务是通过主从复制通道进入MGR的,比如该节点同时是一个主从复制的Slave节点。对于第一种情况,会在完成事务认证(冲突检测)后分配GTID。
将待认证事务封装到消息中,主要包含以下几个信息:
事务在每个节点上都需要进行认证,不管是本地事务还是远程事务。
事务在MGR中进行认证前,会先进行全局排序,形成共识(consensus)。事务全局排序时是基于round robin的方式分配到对应的消息轮次,所以即便是不同节点同时修改同一条记录的事务,经过全局排序后,也就有了先后顺序。
事务认证有几个要点:
事务认证不是简单的对比,会先判断是否为本地事务(本节点产生的事务),事务是否已分配了gtid等多种情形分别进行不同的处理。
再来看下事务认证数据库里的数据什么时候可以被清理,怎么清理的,以及MGR里经典的60s性能抖动问题。
从上述的清理机制可见,使用MGR时应该注意几点:
不同于PXC要求所有节点都必须达成一致,MGR采用多数派原则。也就是说,在一个MGR集群里,只要达成多数派一致(存活节点数超过一半),事务还是可以正常写入的。此外,MGR最高可支持9个节点,因此不同节点数和最多可容忍故障节点数的关系如下表所示:
总节点数 | 多数派节点数 | 最大容忍故障节点数 |
---|---|---|
1 | 1 | 0 |
2 | 2 | 0 |
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
7 | 4 | 3 |
8 | 5 | 3 |
9 | 5 | 4 |
上表是指 最大同时故障节点数 。例如,9个节点的MGR中,最多可容忍同时4个节点发生故障。
在另一种情况下,如果各节点是 逐个陆续发生故障的话,每发生一个节点故障,MGR就会逐次降级 ,从9个节点降级为8个节点,最终降级为3个节点,此时最多还能容错1个节点发生故障。在这种情况下,原来9个节点的MGR,最多可容忍7个节点发生故障。当然了,这种情况比较极端,并不常见。
想要启用MGR,需要先满足几个先决条件:
log_slave_updates=1
或 log_replica_updates=1
。server_id
及 server_uuid
不能相同。binlog_checksum=NONE
,但是从8.0.20后,可以设置 binlog_checksum=CRC32
。gtid_mode=ON
。master_info_repository=TABLE
及 relay_log_info_repository=TABLE
,不过从MySQL 8.0.23开始,这两个选项已经默认设置TABLE,因此无需再单独设置。lower_case_table_names
设置要求一致。slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = N
,N>0,可以设置为逻辑CPU数的2倍binlog_transaction_dependency_tracking = WRITESET
slave_preserve_commit_order = 1
slave_checkpoint_period = 2
本文介绍了MGR的整体技术架构概况,事务同步过程,事务认证机制等内容,使用MGR时需要注意的一些约束条件以及关键点。
因个人水平有限,专栏中难免存在错漏之处,请勿直接复制文档中的命令、方法直接应用于线上生产环境。请读者们务必先充分理解并在测试环境验证通过后方可正式实施,避免造成生产环境的破坏或损害。
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com