PolarDB-X 源码解读系列:Global Binlog的一生

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 本篇为PolarDB-X“全局Binlog解读”系列文章的代码解读篇,将对binlog的产生,以及如何通过系统处理并最终生成Global Binlog的过程进行分析。

概述:

Global Binlog的一生是指从原始binlog产生,到最终Global Binlog生成期间产生的故事,本文会详细介绍Binlog拉取,数据整形合并,以及最终生成Global Binlog期间经过的关键流程。

Global Binlog涉及到Task和Dumper组件,分别针对Binlog整形合并以及落盘过程,下面会介绍这两个组件对binlog处理的相关代码。


Task组件:

当用户向PolarDB-X写入数据时,最终数据会落盘到底层DN上,DN会产生原始binlog,task组件会拉取到原始binlog,整形合并成Global Binlog后,发送给下游Dumper组件,下面我们通过查看Task的核心代码来了解一下整个原始Binlog的处理流程。

我们可以以代码com.aliyun.polardbx.binlog.canal.core.BinlogEventProcessor (github地址https://github.com/ApsaraDB/galaxycdc )为入口来查看整个binlog的关键入口class, 查看binlog是如何拉取并投递到下游handler中。

在handler中,会通过一些列的filter,对binlog进行处理。

com.aliyun.polardbx.binlog.canal.core.handle.DefaultBinlogEventHandle代码中,我们可以看到如下逻辑

通过head对象的doNext方法,逐级遍历所有filter,最终对binlog event进行过滤和格式化处理,并输出逻辑event到下游。head对象为filter链表,初始化逻辑见下面代码。

Extractor 中的filter chain如图:

在BinlogExtractor初始化时,会将一些列Filter加入到列表中,binlog event会按顺序逐个经过这些filter。

com.aliyun.polardbx.binlog.extractor.filter.RtRecordFilter: 会记录当前event下游逻辑处理的rt。

com.aliyun.polardbx.binlog.extractor.filter.TransactionBufferEventFilter处理事务相关event,并标记出tso事件

当收到commit event时,会尝试执行tryDoNext

事务的推送算法可以在 com.aliyun.polardbx.binlog.extractor.filter.TransactionStorage 类中查看。

com.aliyun.polardbx.binlog.extractor.filter.RebuildEventLogFilter 负责binlog event过滤和整形流程,具体逻辑可以查看handle方法。

整形的关键代码可以查看reformat方法。

Global binlog中,我们只关心QueryEvent、RowEvent(Insert/Update/Delete)和TableMapEvent,所以这里我们只处理了这些event的数据。

com.aliyun.polardbx.binlog.extractor.filter.MinTSOFilter 会对事务进行初步过滤。

数据最终会通过 com.aliyun.polardbx.binlog.extractor.DefaultOutputMergeSourceHandler 推送给下游事务合并代码 com.aliyun.polardbx.binlog.merge.MergeSource 中,sourceId唯一标记了当前数据流id,queue保存事务索引txnKey。

com.aliyun.polardbx.binlog.merge.LogEventMerger 中,会将所有DN对应的MergeSource的queue遍历提取出来

com.aliyun.polardbx.binlog.merge.MergeController 会保存对应的sourceId和数据,确保每个sourceId只会收到一条数据,下游在拉取数据时,会将保存在优先队列的数据pop出来,push到 com.aliyun.polardbx.binlog.collect.LogEventCollector 中,最终通过ringBuffer提供给com.aliyun.polardbx.binlog.transmit.LogEventTransmitter 来投递给下游Dumper组件。

Dumper组件

当Global Binlog系统启动时,优先启动Task组件,监听端口。Dumper组件会尝试连接Task。

Dumper组件收到Task推送的Global Binlog后,会对binlog进行最后的细节处理,并且把处理好的结果写入磁盘。下面我们从Dumper组件消费Task推送数据的入口来分析,整个binlog处理核心流程。

com.aliyun.polardbx.binlog.dumper.dump.logfile.LogFileGenerator 类的start方法中,该方法会启动grpc连接Task端口。

代码里实现了 com.aliyun.polardbx.binlog.rpc.TxnMessageReceiver 接口,该接口会消费上游推送过来的所有数据,并在consume方法中,处理相关Global Binlog  position等相关信息,并最终通过

com.aliyun.polardbx.binlog.dumper.dump.logfile.BinlogFile 写入到磁盘中。


privatevoidconsume(TxnMessagemessage, MessageTypeprocessType) throwsIOException, InterruptedException {
            ...
switch (processType) {
caseBEGIN:
             ...
break;
caseDATA:
             ...
break;
caseEND:
             ...
break;
caseTAG:
currentToken=message.getTxnTag().getTxnMergedToken();
if (currentToken.getType() ==TxnType.META_DDL) {
                ...
            } elseif (currentToken.getType() ==TxnType.META_DDL_PRIVATE) {
                ...
            } elseif (currentToken.getType() ==TxnType.META_SCALE) {
                ...
            } elseif (currentToken.getType() ==TxnType.META_HEARTBEAT) {
                ...
            } elseif (currentToken.getType() ==TxnType.META_CONFIG_ENV_CHANGE) {
                ...
            }
break;
default:
thrownewPolardbxException("invalid message type for logfile generator: "+processType);
        }
    }


在consome方法中会逐个处理事务和数据相关的事件,如果事件打标了系统之间交互的tag,会针对相应的tag做一定的逻辑处理。

小结:

本文对binlog的拉取、整形处理和最终落盘涉及到的关键流程进行了简单梳理,Global binlog的一生是从原始物理binlog到逻辑binlog的转变,代码中的原理可以参考全局Binlog解读之理论篇(https://zhuanlan.zhihu.com/p/462995079)。

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
6月前
|
关系型数据库 分布式数据库 数据库
【PolarDB开源】PolarDB-X源码解读:分布式事务处理机制揭秘
【5月更文挑战第20天】PolarDB-X,PolarDB家族的一员,专注于大规模分布式事务处理,采用2PC协议保证ACID特性。源码解析揭示其通过预提交、一致性快照隔离和乐观锁优化事务性能,以及利用事务日志进行故障恢复。深入理解其事务处理机制对开发者掌握分布式数据库核心技术至关重要。随着开源社区的发展,更多优化方案将涌现,助力构建更强大的分布式数据库系统。
224 6
|
3月前
|
SQL 关系型数据库 MySQL
linux 上源码编译安装 PolarDB-X
linux 上源码编译安装 PolarDB-X
188 6
linux 上源码编译安装 PolarDB-X
|
4月前
|
关系型数据库 分布式数据库 数据库
PolarDB-X源码解析:揭秘分布式事务处理
【7月更文挑战第3天】**PolarDB-X源码解析:揭秘分布式事务处理** PolarDB-X,应对大规模分布式事务挑战,基于2PC协议确保ACID特性。通过预提交和提交阶段保证原子性与一致性,使用一致性快照隔离和乐观锁减少冲突,结合故障恢复机制确保高可用。源码中的事务管理逻辑展现了优化的分布式事务处理流程,为开发者提供了洞察分布式数据库核心技术的窗口。随着开源社区的发展,更多创新实践将促进数据库技术进步。
83 3
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB操作报错合集之修改了binlog的存储时间为1小时,但在重启后发现仍有90GB的binlog文件未被删除,是什么原因
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之可以通过什么操作来监听从库的binlog
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
存储 关系型数据库 Serverless
PolarDB产品使用问题之要获取并解析Binlog,该如何操作
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
关系型数据库 MySQL 分布式数据库
【PolarDB-X从入门到精通】 第五讲:PolarDB集中式版安装部署(源码编译部署)
4月18日本周四晚19:00,一站式学习源码编译PolarDB-X标准版(集中式),各位敬请期待,我们不见不散!
【PolarDB-X从入门到精通】 第五讲:PolarDB集中式版安装部署(源码编译部署)
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用合集之怎么关闭Binlog
PolarDB是阿里云推出的一种云原生数据库服务,专为云设计,提供兼容MySQL、PostgreSQL的高性能、低成本、弹性可扩展的数据库解决方案,可以有效地管理和优化PolarDB实例,确保数据库服务的稳定、高效运行。以下是使用PolarDB产品的一些建议和最佳实践合集。
|
6月前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中,如何通过PolarDB for MySQL来查看binlog日志
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
127 1
|
6月前
|
关系型数据库 Linux 分布式数据库
源码编译实现PolarDB-X部署安装的体验报告
本文档记录了编译安装PolarDB-X的步骤,包括设置CentOS开发环境、从GitHub获取源码、编译(耗时较长)、解决依赖和权限问题、安装部署及测试验证。作者建议优化文档细节、减少编译时间、改进错误提示,并提议提供一键安装依赖脚本、新手视频教程及加强社区支持。整个过程虽有挑战,但具有成就感。
159 0

热门文章

最新文章

下一篇
无影云桌面