开源分布式数据库PolarDB-X源码解读——PolarDB-X源码解读(八):GlobalBinlog的一生

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 开源分布式数据库PolarDB-X源码解读——PolarDB-X源码解读(八):GlobalBinlog的一生

本篇将对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/polardb/polardbx-cdc)为入口来查看整个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写入到磁盘中。


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)。



相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
26天前
|
存储 SQL 安全
应用案例|开源 PolarDB-X 在互联网安全场景的应用实践
中盾集团采用PolarDB-X云原生分布式数据库开源版本,有效解决了大数据量处理、复杂查询以及历史数据维护等难题,实现了业务的高效扩展与优化。
|
25天前
|
关系型数据库 分布式数据库 数据库
开源云原生数据库PolarDB PostgreSQL 15兼容版本正式发布
PolarDB进行了深度的内核优化,从而实现以更低的成本提供商业数据库的性能。
|
20天前
惊世骇俗!开源 PolarDB-X 部署安装大冒险,全程心跳与惊喜不断!
【9月更文挑战第8天】作为技术爱好者的我,近期成功完成了开源 PolarDB-X 的部署安装。尽管过程中遇到不少挑战,但通过精心准备环境、下载安装包、配置参数及启动服务等步骤,最终顺利实现部署。本文将详细介绍部署全过程及可能遇到的问题,为您的 PolarDB-X 探索之旅提供参考与启发,希望能让大家在技术海洋里畅游得更加顺利!
48 2
|
23天前
|
Cloud Native 关系型数据库 分布式数据库
PolarDB开源项目未来展望:技术趋势与社区发展方向
【9月更文挑战第5天】随着云计算技术的发展,阿里云推出的云原生分布式数据库PolarDB受到广泛关注。本文探讨PolarDB的未来展望,包括云原生与容器化集成、HTAP及实时分析能力提升、智能化运维与自动化管理等技术趋势;并通过加强全球开源社区合作、拓展行业解决方案及完善开发者生态等措施推动社区发展,目标成为全球领先的云原生数据库之一,为企业提供高效、可靠的服务。
57 5
|
23天前
|
关系型数据库 MySQL 分布式数据库
PolarDB开源社区动态:最新版本功能亮点与更新解读
【9月更文挑战第6天】随着云计算技术的发展,分布式数据库系统成为企业数据处理的核心。阿里云的云原生数据库PolarDB自开源以来备受关注,近日发布的最新版本在内核稳定性、性能、分布式CDC架构及基于时间点的恢复等方面均有显著提升,并新增了MySQL一键导入功能。本文将解读这些新特性并提供示例代码,帮助企业更好地利用PolarDB处理实时数据同步和离线分析任务,提升数据安全性。未来,PolarDB将继续创新,为企业提供更高效的数据处理服务。
64 3
|
11天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
13天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
138 11
|
1月前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
8天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
49 13
MySQL的安装&数据库的简单操作
|
14天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB