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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

背景

前文已经介绍了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的原理和代码。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
12天前
|
存储 SQL 关系型数据库
MySQL中binlog、redolog与undolog的不同之处解析
每个都扮演回答回溯与错误修正机构角色: BinLog像历史记载员详细记载每件大大小小事件; RedoLog则像紧急救援队伍遇见突發情況追踪最后活动轨迹尽力补救; UndoLog就类似时间机器可倒带历史让一切归位原始样貌同时兼具平行宇宙观察能让多人同时看见各自期望看见历程而互不干扰.
69 9
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与性能优化全解析
我整理的这份内容涵盖了 MySQL 诸多核心知识。包括查询语句的书写与执行顺序,多表查询的连接方式及内、外连接的区别。还讲了 CHAR 和 VARCHAR 的差异,索引的类型、底层结构、聚簇与非聚簇之分,以及回表查询、覆盖索引、左前缀原则和索引失效情形,还有建索引的取舍。对比了 MyISAM 和 InnoDB 存储引擎的不同,提及性能优化的多方面方法,以及超大分页处理、慢查询定位与分析等,最后提到了锁和分库分表可参考相关资料。
|
9月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
1605 9
|
3月前
|
关系型数据库 MySQL
MySQL字符串拼接方法全解析
本文介绍了四种常用的字符串处理函数及其用法。方法一:CONCAT,用于基础拼接,参数含NULL时返回NULL;方法二:CONCAT_WS,带分隔符拼接,自动忽略NULL值;方法三:GROUP_CONCAT,适用于分组拼接,支持去重、排序和自定义分隔符;方法四:算术运算符拼接,仅适用于数值类型,字符串会尝试转为数值处理。通过示例展示了各函数的特点与应用场景。
|
5月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
9月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
3981 56
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
8月前
|
存储 监控 关系型数据库
深入解析 Hologres Table Group 与 Shard Count
Hologres 是一款强大的实时数仓,支持海量数据的高效存储与快速查询。Table Group 和 Shard Count 是其核心概念,前者管理数据分片,后者指定分片数量。合理配置二者可显著提升性能。Table Group 实现资源共享与协同管理,Shard Count 根据数据量和读写模式优化分片,确保高效处理。结合业务需求进行动态调整,可充分发挥 Hologres 的潜力,助力企业数字化转型。
275 60
|
9月前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
1338 5
|
6月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
516 29

推荐镜像

更多