MySQL · 引擎特性 · Group Replication内核解析之二

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云解析DNS,个人版 1个月
简介:

背景

前文已经介绍了MySQL的Group Replication的实现机制和原理,本文就Group Replication的具体实现进行详细的阐述,以更深入的理解Group Replication的机制,在实践中更好的应用Group Replication,提升应用系统的可用性,优化其性能。

无缝连接的回调机制

Group Replication是通过MySQL的插件方式实现的,基本上不影响MySQL的原有事务处理过程,只是在流程中选择性的插入一些Group Replication的特殊处理方法,为了尽可能减少对原有代码的影响,采用了回调函数的机制来实现对Group Replication的支持。 其中最重要的两个回调函数集如下所示:

  • 节点状态相关的回调函数集 Server_state_observer server_state_observer = { sizeof(Server_state_observer),
  • group_replication_before_handle_connection, //client连接到服务器之前 group_replication_before_recovery, //故障恢复之前 group_replication_after_engine_recovery, //引擎恢复之后 group_replication_after_recovery, //故障恢复之后 group_replication_before_server_shutdown, //server关闭之前 group_replication_after_server_shutdown, //server关闭之后 };
  • 事务处理相关的回调函数集 Trans_observer trans_observer = { sizeof(Trans_observer), group_replication_trans_before_dml, //DML语句执行之前,条件检查 group_replication_trans_before_commit, //事务提交之前 ,节点间事务同步 group_replication_trans_before_rollback, //事务回滚之后 group_replication_trans_after_commit, //事务提交之后 group_replication_trans_after_rollback, //事务回滚之后 }; 其中最重要的回调函数是
  • group_replication_trans_before_dml:用于执行条件检查,判断是否符合Group Replication的限制条件。
    group_replication_trans_before_commit:在binlog已经写入cache,准备提交之前通过XCOM组件进行事务的节点间同步。

XCOM消息传递机制
XCOM是一个基于paxos协议的分布式同步组件,Group Replication通过它将一个节点上的事务(事务采用binlog来表示),传递到整个分布式系统中的多数节点,保证所有节点最终都会收到此事务,并且不改变事务的执行顺序。 Server在事务提交之前,将事务的binlog打包,并添加此事务执行过程中产生的writeset及基于group replication的全局GTID。然后将其发送给本机的XCOM线程。 XCOM组件内部有一个任务Task线程,主线程通过Task调度队列来调度执行Task,每个Task任务可认为是一个协程,重要的Task有;

tcp_server 监听xcom端口,当有新连接时为其创建acceptor_learner_task任务

  • tcp_reaper_task 关闭长时间未使用的连接
  • acceptor_learner_task 此任务是XCOM的核心任务,实现基于paxos协议的消息流转过程,并最终决定accept还是deny此消息。
    proposer_task 从server的消息请求队列中读取一条消息,封装为paxos的proposal消息,发送给其它节点,尝试此消息被paxos系统accept。每个节点可以有多个proposer_task,XCOM并不保证多个proposer_task以server发出同步消息的顺序来发送proposal消息。当一个消息被accepted后,通过learn消息通知到每个节点,成为learned消息。
  • executor_task 监听learned消息,若此消息尚未被应用,则通知server应用此消息。
  • detector_task 周期性的检测与其它节点间的连接可用性。若有连接不可用,通知server。
  • alive_task 产生心跳消息。 消息被acceptor的过程,如下图所示:
    picture_name

1


1) 源节点的proposal_task从server的消息队列中提取一个消息,若是3phase,封装为prepare消息,开始acceptor的阶段一,将prepare消息发送给的所有acceptor节点;若是2phase,则封装为proposal消息,将proposal消息发送给所有acceptor节点,此时会跳到阶段二;

2) acceptor节点的acceptor_learner_task收到prepare消息后,判断是否可以阶段一的accept,然后返回ACK;

3) 源节点的acceptor_learner_task收到ACK后,更新收到ACK的节点位图,若已经收到多数acceptor的ACK后,进入阶段二,向所有acceptor节点发送proposal消息;

4) acceptor节点的acceptor_learner_task收到proposal消息后,判断是否可以阶段二的accept,然后返回ACK;

5) 源节点的acceptor_learner_task收到ACK后,更新收到ACK的节点位图,若已经收到多数acceptor的ACK后,说明此消息已经被paxos系统accept,然后将此消息通知所有节点,向所有节点发出learn消息;

6) 所有节点的acceptor_learner_task收到learn消息后,将此消息加入到当前节点的learned消息中。

7) 每个节点的executor_task检测本节点是否有新的learned消息,若有则将其通知server层,进行后续处理。

节点间事务的同步
在Group Replication中,若用户在一个节点执行一条SQL,如一条Insert语句,在提交之前已经生成此语句的binlog,并将其写入cache,此时需要通过XCOM来进行节点的事务同步,将此事务同步到多数节点,并判断此事务与其它节点的事务之间是否存在冲突,若存在冲突此事务是否需要回滚等。 下图是一个简单的SQL语句导致的消息传递过程。

2


当节点收到Notification消息后,将其加入incomingQ队列中,然后applier thread读取incomingQ队列中的消息,依次执行event事件的处理过程。对于一个insert语句来说,它的event事件由以下几部分组成:
  • Transaction_context_log_event
  • Gtid_log_event
  • Query_log_event

每个event会依次进入event handler pipeline执行相应的处理,如下图所示:

3

总结

MySQL Group Replication在提交事务之前通过XCOM来进行节点间事务的同步,保证事务提交前,多数节点上已经保存此事务相关的binlog event,从而保证节点间事务的一致性。 为降低MySQL与XCOM代码的耦合性,采用消息通知、回调函数等机制有效的对不同模块进行隔离,了解这些机制有助于我们更好的理解Group Replication的原理和代码。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
SQL 关系型数据库 MySQL
MySQL DDL(数据定义语言)深度解析
MySQL DDL(数据定义语言)深度解析
|
11天前
|
关系型数据库 MySQL 数据挖掘
MySQL 聚合函数案例解析:深入实践与应用
MySQL 聚合函数案例解析:深入实践与应用
|
11天前
|
SQL 关系型数据库 MySQL
MySQL DQL(数据查询语言)深度解析与实践
MySQL DQL(数据查询语言)深度解析与实践
|
28天前
|
SQL 关系型数据库 MySQL
ClickHouse(23)ClickHouse集成Mysql表引擎详细解析
ClickHouse的MySQL引擎允许执行`SELECT`查询从远程MySQL服务器。使用`MySQL('host:port', 'database', 'table', 'user', 'password'[,...])`格式连接,支持简单`WHERE`子句在MySQL端处理,复杂条件和`LIMIT`在ClickHouse端执行。不支持`NULL`值,用默认值替换。系列文章涵盖ClickHouse安装、集群搭建、表引擎解析等主题。[链接](https://zhangfeidezhu.com/?p=468)有更多
56 0
|
29天前
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
24 0
|
1月前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
36 3
|
22天前
|
存储 安全 Java
深度长文解析SpringWebFlux响应式框架15个核心组件源码
以上是Spring WebFlux 框架核心组件的全部介绍了,希望可以帮助你全面深入的理解 WebFlux的原理,关注【威哥爱编程】,主页里可查看V哥每天更新的原创技术内容,让我们一起成长。
|
24天前
|
关系型数据库 分布式数据库 数据库
PolarDB-X源码解析:揭秘分布式事务处理
【7月更文挑战第3天】**PolarDB-X源码解析:揭秘分布式事务处理** PolarDB-X,应对大规模分布式事务挑战,基于2PC协议确保ACID特性。通过预提交和提交阶段保证原子性与一致性,使用一致性快照隔离和乐观锁减少冲突,结合故障恢复机制确保高可用。源码中的事务管理逻辑展现了优化的分布式事务处理流程,为开发者提供了洞察分布式数据库核心技术的窗口。随着开源社区的发展,更多创新实践将促进数据库技术进步。
28 3
|
1月前
|
XML Java 数据格式
深度解析 Spring 源码:揭秘 BeanFactory 之谜
深度解析 Spring 源码:揭秘 BeanFactory 之谜
25 1
|
1月前
|
SQL 缓存 算法
【源码解析】Pandas PandasObject类详解的学习与实践
【源码解析】Pandas PandasObject类详解的学习与实践

推荐镜像

更多