MySQL 是目前最流行的开源关系型数据库,国内金融行业也开始全面使用,其中MySQL 5.7.17 提出的 MGR(MySQL Group Replication)既可以很好的保证数据一致性又可以自动切换,具备故障检测功能、支持多节点写入,MGR 是一项被普遍看好的技术。本文给大家介绍一下 MySQL MGR 技术演变过程、事务生命周期及事务冲突检测机制。

先介绍 MGR 技术演进

传统的 MySQL 主从复制架构是 MySQL 保持数据一致性的最基本架构,如下图1 所示,一主一从架构,从库给主库发起读数据请求后,主库会通过 dump 线程把 binlog 日志文件推送给从库,从库的 I/O 线程把接收到数据更新到 relay log,之后从库的 SQL 线程把 relay log 应用为 binlog 日志,直到主库与从库的 binlog 日志文件完全数据一致,达到主从同步。

图1 主从复制示意图

接下来我们看一下 MySQL 异步复制,如下图2所示,一主两从架构,应用发来的事务请求,经过执行之后写入 binlog,主库 master 把 binlog 日志推送给从库 salve1 和 slave2 ,主库不需要等到从库是否成功更新数据到 relay log,主库直接提交事务即可。这种模式牺牲了数据一致性,不能很好保证主从数据一致性。

图2 异步复制示意图

模拟异步复制场景举例,如下图3所示,三个人对话,一个人在不停歇的演讲,不需要知道两个听众是否听懂,听众也不需要做出回应,等演讲完毕,有可能听众没听懂,最终大家认知到信息可能不一致,为了解决上述问题MySQL5.5.8 就有了半同步复制。

图3 异步复制场景模拟图

接下来看一下 MySQL 的半同步复制,如下图4所示,一主两从架构,应用发来的事务请求,在主库执行后写入 binlog,主库 master 把 binlog 日志推送给从库 salve1 和 slave2 ,半同步主库需要等待其中任意一个从库更新数据到 relay log 成功并且告知主库,主库才提交事务,这样保证至少有一个从库同步上数据了,也缩短了延迟时间,保证了数据安全。

图4 半同步示意图

模拟半同步复制场景举例,如下图5所示,三个人对话,一个人在不停歇的演讲,任意一个听众回应听懂了,演讲者就继续往下说,否则停止演讲,最后等演讲结束,至少一听众听懂演讲者的意思,保证信息传递一致性,这种复制模式也存在两个问题:

MySQL无法自动切换,需要借助外力切库,运维复杂。

从库Slave的读压力太大会导致复制延迟不断增加。

MySQL 5.7 版本的MGR技术可以解决上述问题。

图5 半同步复制场景模拟

至此MGR技术诞生!

MGR (MySQL Group Replication)是 MySQL 自带的一个插件,可以灵活部署。MySQL MGR 集群是多个 MySQL Server 节点共同组成的分布式集群,每个 Server 都有完整的副本,它是基于 ROW 格式的二进制日志文件和 GTID 特性。如下图6所示为MGR 架构图,主要是 APIs 层、组件层、复制协议模块层和 GCS API+Paxos 引擎层构成。

如图6所示,应用发来的事务从 MySQL Server经过MGR的APIs接口层分发到组件层,组件层去capture事务相关信息,然后经过复制协议层进行事务传输,最后经过GCS API+Paxos引擎层保证事务在各个节点数据最终一致性。这是事务进入 MGR 层内部处理过程。

MGR 集群中事务整个生命周期啥样?

接下来从全局角度看事务整个生命周期,如下图7所示,DB1 、DB2 、DB3构成的MGR集群, 集群中每个DB都有MGR层,MGR层功能也可简单理解为由Paxos模块和冲突检测Certify模块实现。Paxos模块是基于Paxos算法确保所有节点收到相同广播消息,transaction message就是广播消息的内容结构;冲突检测Certify模块进行冲突检测确保数据最终一致性,其中certification info是冲突检测中内存结构;本文详细介绍冲突检测模块实现原理,Paxos算法实现部分后续对比Raft算法详细介绍。

当DB1上有事务T1要执行时,T1对DB1是来说本地事务,对于DB2、DB3来说是远端事务;DB1上在事务T1在被执行后,会把执行事务T1信息广播给集群各个节点,包括DB1本身,通过Paxos模块广播给MGR集群各个节点,半数以上的节点同意并且达成共识,之后共识信息进入各个节点的冲突检测certify模块,各个节点各自进行冲突检测验证,最终保证事务在集群中最终一致性。

在冲突检测通过之后,本地事务T1在DB1直接提交即可,否则直接回滚。远端事务T1在DB2和DB3分别先更新到relay log,然后应用到binlog,完成数据的同步,否则直接放弃该事务。

图7 MGR组复制技术示意图

前面我们从全局视角介绍了一个事务在MGR集群中从开始到结束整个处理过程,接下从局部角度详细介绍冲突检测机制实现机制。

transaction message和certification info分别是什么?

介绍冲突检测实现原理之前,先介绍一下广播信息transaction message、冲突检测内存certification info的结构组成。

1 transaction message

如图8所示,transaction message保存是事务T1要更新行的的相关信息,有transaction_context_log_event和gtid_log_event及log_event_group三部分组成。

具体组成:

write set 叫写入集合,是事务更新行相关信息的Hash值。

write set=Hash(库名+表名+主键(唯一键)字段信息)

gtid_executed 为已经执行过的事务gtid集合,也即事务快照版本。

把 write set 和 gtid_executed 打包成为事务上下文信息transaction_context_log_event。

gtid_log_event 为已经执行过的事务gtid集合。

log_event_group 为事务日志信息,后续要更新到 relay log中。

把 3 和 4 和 5 一起打包成为 transaction message 广播给其它节点。

图8 广播信息的内容结构

2 certification info

广播的信息到达冲突检测模块certification之后是如何工作?

每个节点都有一个certification info的内存结构,certification info保存了通过冲突检测的事务的write set和gtid_executed。certification info相当于一个map,key是string结构,保存write set中提取的主键值;value是set集合,保存gtid_executed事务快照版本;例如T1事务,T1更新数据库d1中的表t1中两行数据id=1和id=2,它对应快照版本UUID_MGR是:1-100,刚开始certification info为空,所以直接提交,之后certification info中快照版本直接更新为1-101.

图9 certification info 结构图

冲突检测核心机制!敲黑板!

通过上面的例子可知通过冲突检测标准:若 transaction UUID_MGR “>=”certification info UUID_MGR,则冲突检测通过。

反之,事务T3,更新id=1的行,事务T3的UUID_MGR为1-100, 节点中冲突检测模块中的certification info中的UUID_MGR为1-101,很明显T3:UUID_MGR:1-100<1-101>

上面是针对于单独一个写来进行判断,现在我们来展示一下多节点模式中,多个事务同时写入时冲突检测机制。如下图所示,三个事务T4、T5、T6并行写入某个MySQL节点,通过了Paxos协议模块达成一致性共识,进行冲突检测时遵循下面三个原则:

多个事务修改同一个id对应的数值,需要按照先后顺序进行冲突检测。

多个事务同时对不同的id进行修改,各自进行修改即可。

不同的事务对同一个id修改,需要按照先后顺序进行冲突检测即。

图11 多事务同时写入示意图

如图11所示,事务T4和事务T5同时更新id=1的行,按照先来后到顺序进行冲突检测,T4先到先进行冲突检测。

事务T4,更新id=1的行,事务T4的UUID_MGR为1-102, 节点中冲突检测模块中的certification info中id=1的UUID_MGR为1-101,很明显T2:UUID_MGR:1-102>UUID_MGR:1-101,则T4冲突检测通过,更新为certification info中UUID_MGR为1-103。

事务T5,更新id=1的行,事务T5的UUID_MGR为1-100, 节点中冲突检测模块中的certification info中id=1的UUID_MGR为1-102,其中T5:UUID_MGR:1-100>UUID_MGR:1-102,则T5冲突检测不通过。

事务T6,更新id=3的行,事务T6的UUID_MGR为1-100, 节点中冲突检测模块中的certification info中id=3的UUID_MGR为空,其中T6:UUID_MGR:1-100>UUID_MGR,则T6冲突检测通过,更新为certification info中UUID_MGR为1-101。

如下图12所示,事务T4和事务T5并行修改id=1,T4写入成功,T5丢弃,T6写入id=3事务,写入成功。

图12 多事务同时写入结果图

随着 write set不断写入certification info中,内存消耗会相应增大,MGR有配套的write set 清理线程,每隔一段时间去清理已经在节点应用或者回放的事务的write set信息。

MGR技术特点有哪些?

如下图13所示,MGR具备以下技术特点:

MGR是基于Paxos协议和原生复制的分布式集群,大多数节点同意即可以通过议题的模式,数据一致性高。

具备高可用、自动故障检测功能,可自动切换。

可弹性扩展,集群自动的新增和移除节点,集群最多接入9个节点。

有单主和多主模式。

支持多节点写入,具备冲突检测机制,可以适应多种应用场景需求。

图13 MGR技术闪亮点

MGR目前还存在一些功能限制和不足,但是是未来数据库发展的一个趋势,随着产品不断完善,MGR必将引领数据库系统发展的潮流。

总结展望

MySQL是应用最广泛的一个开源数据库 ,其中MGR技术在保证数据一致性基础上,可自动进行故障检测、自动切换,具备防脑裂机制,兼具多节点写入等优点,是一个很好的技术发展方向。目前部分银行应用MySQL比例较高,并且也已开始推广上线MGR架构;G行数据库数据库规划秉持传统数据库和开源数据库并行使用模式,MySQL线上应用也有上百套,其中的A类系统中的分布式企业总线开始应用实践MGR技术。后续还将持续推广该项技术,不断提升开源数据库技术管理水平。

mysql的MGR集群相关推荐

  1. mysql mgr简介_mysql8.0初探:(二)MySQL Group Replication-MGR集群简介

    mysql8.0初探:(二)MySQL Group Replication-MGR集群简介 发布时间:2020-06-12 23:59:17 来源:51CTO 阅读:49832 作者:arthur37 ...

  2. MySQL MGR集群搭建

    本文来自网易云社区,转载务必请注明出处. 本文将从零开始搭建一个MySQL Group Replication集群,包含3个节点.简单介绍如何查询MGR集群状态信息.并介绍如何进行MGR节点上下线操作 ...

  3. 有事务冲突时节点怎么加入MGR集群

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 文章目录 1. 问题场景描述 2. 如何修复 2.1 找出事务差异点 2.2 决定如何处理 3. 小结 个别节点可能存在事 ...

  4. 技术分享 | InnoDB Cluster+GreatSQL快速部署MGR集群,并实现读写分离和故障自动转移(超详细)...

    本文来源:原创投稿 * GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 0. 内容提纲 1. 部署环境及初始化 2. 利用MySQL Shell构建MGR集群 3. 对在 ...

  5. 一周碎碎念,2021.11.7,两个MGR集群间还可以构建传统的主从复制通道吗

    叨叨最近遇到的一些事以及见闻.思考. 1. GreatSQL编译环境Dockerfile更新了 用于构建GreatSQL编译环境的Dockerfile发现几个小瑕疵,于是更新了下. 利用Docker环 ...

  6. 03.安装部署MGR集群 | 深入浅出MGR

    * GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1. 安装准备 2. 初始化MySQL Server 3. 初始化MGR第一个节点 4. 继续设置另外两个节点 5. ...

  7. 《叶问》37期,三节点的MGR集群关掉两个节点后还能继续读写吗

    不发碎碎念了,唠叨那些没啥意思,重回『叶问』正轨. 1. 三节点的MGR集群关掉两个节点后还能继续读写吗 这里要先明确一个前提,两个节点是正常关闭MGR服务,还是异常宕机. 如果两个节点是手动执行 s ...

  8. mgr mysql_MySQL MGR集群搭建

    本文来自网易云社区,转载务必请注明出处. 本文将从零开始搭建一个MySQL Group Replication集群,包含3个节点.简单介绍如何查询MGR集群状态信息.并介绍如何进行MGR节点上下线操作 ...

  9. 3. 安装部署MGR集群 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. [toc] 本文介绍如何利用GreatSQL 8.0.25构建一个三节点的MGR集群. 1. 安装准备 准备好下面三台服务 ...

最新文章

  1. lua入门1 helloworld
  2. R语言ggplot2可视化交互作用图(Interaction Plot):可视化不同分组(分类变量1)在不同剂量下(分类变量2)的箱图(box plot)、均值计算并连接成线图(line plot)
  3. python with语句与contextlib
  4. vue 箭头函数兼容性_前端学习计划之VUE学习(二)
  5. php 多表查询输出,ThinkPHP多表查询
  6. erp采购总监个人总结_《用友 ERP 培训教程:财务核算/供应链管理/物料需求计划》ERP概述 : ERP基础知识...
  7. Topcomponent --sighoff
  8. vfp:数据库中表间关系的参照完整性
  9. linux 路由跟踪命令_一文掌握linux系统路由跟踪指令traceroute
  10. 关于random的多种用法
  11. Eclipse上索爱手机开发平台的配置
  12. c语言图书信息管理系实验心得,C语言图书信息管理系统实验报告.doc
  13. 两波形相位差的计算值_变压器损耗计算公式
  14. matlab高斯滤波器
  15. List<Map>转Map<String,List>
  16. win7安装JAVA程序闪退怎么办_win7打开软件闪退如何解决
  17. LAB颜色空间各通道的取值范围
  18. 学术-物理-维空间:一维空间
  19. 【源码学习】正则表达式
  20. Linux rsync命令

热门文章

  1. 命令怎么创建oracle用户,Oracle 如何使用命令行创建用户
  2. ExecuteNoneQuery、ExecuteScalar和ExecuteReader用法和区别
  3. android 为支持多语言,常用的iso country code
  4. Auto Code Generator
  5. 代码的简单设计五原则
  6. Python吴恩达机器学习课后习题作业一算法(Ⅰ)(1)
  7. 【数据结构Note5】- 树和二叉树(知识点超细大全-涵盖常见算法 排序二叉树 线索二叉树 平衡二叉树 哈夫曼树)
  8. python更新库 conda_conda更新问题anacond
  9. 图像拼接(二):柱面投影+模板匹配+渐入渐出融合(GPU版)
  10. MySQL连接数据库url的参数characterEncoding=UTF-8