开发者社区> lin848497337> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 本篇为PolarDB-X“全局Binlog解读”系列文章的代码解读篇,将对binlog的产生,以及如何通过系统处理并最终生成Global Binlog的过程进行分析。
+关注继续查看

概述:

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

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

image


Task组件:

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

image

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

image

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

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

image

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

image

Extractor 中的filter chain如图:

image

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

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

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

image

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

image

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

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

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

image

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。

image

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

image

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端口。

image

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

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


private void consume(TxnMessage message, MessageType processType) throws IOException, InterruptedException {
            ...
        switch (processType) {
        case BEGIN:
             ...
            break;
        case DATA:
             ...
            break;
        case END:
             ...
            break;
        case TAG:
            currentToken = message.getTxnTag().getTxnMergedToken();
            if (currentToken.getType() == TxnType.META_DDL) {
                ...
            } else if (currentToken.getType() == TxnType.META_DDL_PRIVATE) {
                ...
            } else if (currentToken.getType() == TxnType.META_SCALE) {
                ...
            } else if (currentToken.getType() == TxnType.META_HEARTBEAT) {
                ...
            } else if (currentToken.getType() == TxnType.META_CONFIG_ENV_CHANGE) {
                ...
            }
            break;
        default:
            throw new PolardbxException("invalid message type for logfile generator: " + processType);
        }
    }


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

小结:

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
vmware EXSi 6.7直通NVIDIA 2080 Ti显卡
vmware EXSi 6.7直通NVIDIA 2080 Ti显卡
132 0
Java8的TreeMap源码解析
Java8的TreeMap源码解析
21 0
Global variable in ABAP function group
Global variable in ABAP function group
35 0
一个SAP cds view test double的例子
一个SAP cds view test double的例子
41 0
GlobalFoundries已经悄然进军硅光子制造领域
过去十年以来,硅光子学正逐步成为一大备受关注的热门领域。今天,人类社会面临的问题非常简单——我们需要更高的传输带宽,但解决方案却极为困难。
543 0
java源码-TreeMap
开篇  写TreeMap本身是一件让我感到无比怂逼的事情,因为红黑树的数据结构从大学到现在我就没弄明白过,估计在很长的一段时间里应该也弄不明白,不过我打算投入点时间去研究研究红黑树了。
735 0
MySQL · 源码分析 · binlog crash recovery
前言 本文主要介绍binlog crash recovery 的过程 假设用户使用 InnoDB 引擎,sync_binlog=1 使用 MySQL 5.7.20 版本进行分析 crash recovery 过程中,binlog 需要保证: 所有已提交事务的binlog已存在 所有未提交...
2182 0
Radware帮助Continent 8成功抵御了DDoS攻击
本文讲的是Radware帮助Continent 8成功抵御了DDoS攻击,网络安全和应用交付解决方案提供商Radware公司宣布,Radware成功扩展了其在Continent 8 Technologies的网络部署。
1276 0
ADF_ADF Faces系列6_ADF数据可视化组件简介之建立Thematic Map Component
2013-05-01 Created By BaoXinjian 一、摘要 本文介绍,通过Oracle演示资料,开发一个Web Application, Data Model基于演示资料FOD,如何使用ADF业务组件 在Web Client Side,使用JavaServer F...
1262 0
+关注
1
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载