欢迎投稿

今日深度:

MySQL Group Replication(MGR),它的代码包含再MyS

MySQL Group Replication(MGR),它的代码包含再MyS


Group Replication 是 MySQL 官方开发的一个开源插件,是实现MySQL高可用集群的一个工具。它的代码包含再MySQL的源码中,二进制插件库也包含在MySQL的安装包中。想使用Group Replication,只需要从MySQL官方网站中下载即可,注意:需要是MySQL 5.7.17 及以后的版本。

1. MGR与Paxos协议 

Group Replication 在传输数据时,使用了Paxos协议。Paxos协议保证了数据传输的一致性和原子性。Group Replication基于Paxos协议构建了一个分布式的状态机复制机制。此机制带来了如下优点:

(1)Group Replication 不会出现脑裂的现象;

(2)Group Replication的冗余能力很好,能够保证Binlog Event至少被复制到超过一半的成员上,只要同时宕机的成员数不超过半数便不会导致数据丢失;

(3)Group Replication 还保证了只要Binlog Event 没有没传输到半数以上的成员,本地成员不会将事务的Binlog Event 写入Binlog 文件和提交事务,从而保证宕机的服务器上不会有组内在线成员上不存在的数据。因此,宕机的服务器重启后,不再需要特殊的处理就可以加入组。

2. MGR中事务的执行过程

Group Replication 插件中最重要的功能就是事务分发器的功能。

根据事务处理过程中的不同处理步骤,Group Replication 中事务分发器的功能划分为以下四部分。

* 本地事务控制模块

* 成员间的通信模块

* 全局事务认证模块

* 异地事务执行模块

2.1 本地事务控制模块

MySQL的事务在提交时,内部会分成三个阶段:准备(prepare)阶段、记录Binlog阶段和提交(commit)阶段。Group Replication对本地事务的控制逻辑在before_commit这个接口中执行。before_commit是在事务的prepare阶段之后,写Binlog文件阶段之前被执行的。对本地事务的控制包括三个步骤:发送事务信息-->等待全局事务认证模块的认证结果--->认证结果的处理。

2.2 成员间的通信模块

通信模块主要有三部分功能组从:

(1) 本地数据就收部分负责接收本地成员上其他模块的数据发送请求,接收到的数据包被放入本地数据队列,等待处理。

(2)成员间的通信部分负责和其他成员通信。通信工作包括:从本地数据队列读取数据包发送给其他成员,以及接收其他成员发送过来的数据包。各个成员间的通信使用Paxos协议。

(3)全局数据包发送部分将所有的数据包按顺序返回给本地成员上的全局事务认证模块。

2.3 全局事务认证模块

全局事务认证模块有一个消息队列,用来存放所有收到的消息。这些消息主要是事务的Binlog Event,也有一些状态和控制消息。

全局事务认证模块的核心任务是冲突检测。冲突检测是指识别出那些同时修改了同样数据的事务,并做出相应的处理。

冲突检测是以数据行为单位,两个事务是不是修改了同样的数据,通过判断事务所修改的主键值来判断。

server 层在产生Binlog Event时,会同时记录所修改的主键信息(库名、表名主键值等信息产生的哈希值)。当发现两个事务同时修改了同样的数据,就是冲突。

如何来判断这两个事务是不是同时执行的呢?----通过数据库快照。

数据库快照是数据库的一个瞬时状态,每个写操作都会导致数据库的状态变化,不同的状态用不同的快照版本来表示。快照版本是用GTID来表示的,每个写事务都会产生一个唯一的GTID,这个GTID由全局事务认证模块产生,且在事务提交时会被添加到全局变量gtid_executed中,因此,gtid_executed的内容就是数据库的快照版本。

数据库的快照版本、主键信息机器MySQL服务器的UUID一起被封装到Transaction_context_log_event上,发送给全局事务检测模块。

2.4 异地事务执行模块

主要任务就是通过group_replication_applier通道执行异地事务的Binlog Event。这些Binlog Event都是有全局事务认证模块通过API写入Replay Log的。

group_replication_applier执行Binlog Event的时候使用了特权锁。在对数据加行锁的时候,如果group_replication_applier发现有本地事务已经对数据加了行锁,那么,group_replication_applier不会等待本地事务执行完毕,而是立刻将本地事务回滚掉,然后继续执行;而本地事务的session则会返回错误。

3.组试图

成员管理中有一个很重要的概念叫作组视图(Group View),或者简称为视图(View)。视图是指Group Replication组在一段时间内的成员状态。在这个时间段内没有成员变化,既没有成员加入也没有成员退出。如果成员发生了变化,成员状态就变化了,于是它就进入了另外一个视图。不同的视图之间通过视图ID(View ID)来进行划分。视图随时间的变化有先后顺序,因此View ID也是有先后顺序的。

 

1.美团点评基于MGR的CMDB高可用架构搭建之路

---https://www.sohu.com/a/256028349_411876

2.mgr-安装部署(多主)

https://blog.csdn.net/weixin_30666753/article/details/99999641

3.客观评价下MGR到底是不是一个适合关键在线业务的方案?

https://www.zhihu.com/question/394210613

4.《MySQL运维内参》

 

www.htsjk.Com true http://www.htsjk.com/Mysql/47299.html NewsArticle MySQL Group Replication(MGR),它的代码包含再MyS Group Replication 是 MySQL 官方开发的一个开源插件,是实现MySQL高可用集群的一个工具。它的代码包含再MySQL的源码中,二进制插件库也包含在...
评论暂时关闭