MySQL组复制(一):成员事务执行过程

数据库 专栏收录该内容
9 篇文章 0 订阅


根据事务处理过程中的不同处理步骤,组复制中事务分发器的功能划分为四部分:

  • 本地事务控制模块
  • 成员间的通信模块
  • 全局事务认证模块
  • 异地事务执行模块

1.本地事务控制模块

MySQL通过API向插件提供了事务执行过程中几个重要阶段的监控接口。Group Replication通过这些接口来监控和控制事务的执行。上一篇文章中我们提到了MySQL事务在提交时是以二阶段提交的方式,内部会分成三个阶段:prepare、记录binlog、commit。Group Replication对本地事务的控制逻辑在before_commit这个接口中执行。该接口是在事务的prepare阶段之后,写binlog文件阶段前被执行的。

有时候执行sql时报error on observer while running replication hook 'before_commit’可能就是因为事务超过了replication_transication_size_limit的大小,因此在mgr执行大事务时需要调高这个参数

1.1对本地事务控制的三个步骤

  • 向通信模块发送事务消息
  • 等待全局事务认证模块的认证结果
  • 认证结果的处理
向通信模块发送事务消息

含以下内容

  • 主键信息

    hash(schema.table.id)

  • 数据库快照版本

    当前MySQL的全局变量gtid_executed的值。包含了当前事务提交时所有已经执行了的事务的GTID

  • 事务产生的Binlog Event

    从当前线程的binlog cache中获取的,不依赖binlog文件

  • Transaction_context_log_event

    本地成员的UUID、主键信息和数据库快照版本会被封装进去,和binlog event一起发出去。

等待全局事务认证模块的认证结果

事务信息发送成功后,事务会被阻塞,开始等待全局事务认证模块的认证结果。事务认证完成后,全局事务认证模块会唤醒当前事务的线程,让事务继续执行。

认证结果处理

该过程是由mysql执行的,和group replication没什么关系。成功就写binlog,提交事务;失败了就由mysql执行回滚。

2.成员间的通信模块

主要就是讲Paxos协议。

2.1步骤

  • 发送数据包给其他成员的通信模块
  • 其他成员的通信模块回应收到数据包
  • 当超过半数的通信模块(包括自己)回应后,向所有节点广播数据包同步成功。只有这三个步骤成功完成后,通讯模块才会把这个数据包发送给全局事务认证模块!!!(就像小弟们先商量,都同意后再汇报给大佬决定嘿嘿…)

在最后一步中,向全局事务认证模块发送数据包必须保证同样的顺序!也就是说数据包不能打乱的发送,一定会按顺序发送,否则阻塞直到顺序ID正确

2.2优化

从上面的步骤中我们可以看到在mgr中,一次事务需要3次tcp传输才能完成,同时每个组成员都要接受数据包,传输的数据量会被放大,在延迟大、带宽窄的网络中效率会比较低。因此,Group Replication做了以下优化:

  • 压缩数据包
  • 将多个本地事务封装到一个数据包内进行通信,减少交互次数

通过设置以下参数,也可以提高效率group_replication_compression_threshold 超过该阈值则压缩

group_replication_poll_spin_loops 减少线程睡眠次数

slave_parallel_workers 并行复制线程数

3.全局事务认证模块

核心功能就是存放消息,然后进行冲突检测。状态表replication_group_memeber_stats中的字段COUNT_TRANSACTION_IN_QUEUE指的就是这个队列中的事务数量。(如果特别大就要注意是不是执行大事务导致阻塞了)

3.1检测内容

  • 主键信息
  • 事务执行时的数据库快照版本
  • 执行事务的mysql服务器的UUID

3.2冲突处理

根据UUID可以判断是本地事务还是异地事务。

对于本地事务:
  • 无冲突,则唤醒这个事务的线程,让其完成提交操作
  • 有冲突,则唤醒这个事务的线程,让其回滚
  • 无论是否有冲突,binlog event都会被丢弃(因为binlog刷写可以从cache中拿信息)
对于异地事务:
  • 无冲突,通过API将这个binlog event写入relay log中,让group_replication_applier通道去执行 (后面会讲到并行复制)
  • 有冲突,直接丢弃这个binlog event

4.异地事务执行模块

为了执行异地事务的binlog event,mgr会自动创建一个名为group_replication_applier的通道。它不会从哪其他成员复制binlog event,所有的binlog event都是由全局事务认证模块通过API写入relay log的。(和异步复制没有区别)

MySQL 8.0中引入了一种新的机制来判断事务能否并行回放,通过检测事务在运行过程中是否存在写冲突来决定从机上的回放顺序,这使得从机上的并发程度不再依赖于主机。这个过程中,Certify 阶段采用的就是WriteSet的方式验证事务之间是否存在冲突,同时,在写入RelayLog 时会将没有冲突的事务的 last_committed 值设置为相同的值。

5.事务流程总结

  • 网络传输

paxos协议

  • 事务在本地成员上执行过程
R2revn.png
  • 事务在异地的执行过程
R2rZgs.png
  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值