DM 源码阅读系列文章(一)序

2024-04-08 03:08
文章标签 源码 dm 系列 文章 阅读

本文主要是介绍DM 源码阅读系列文章(一)序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:杨非

前言

TiDB-DM 是由 PingCAP 开发的一体化数据同步任务管理平台,支持从 MySQL 或 MariaDB 到 TiDB 的全量数据迁移和增量数据同步,在 TiDB DevCon 2019 正式开源。作为一款连接 MySQL/MariaDB 生态和 TiDB 生态的中台类型产品,DM 获得了广泛的关注,很多公司、开发者和社区的伙伴已经在使用 DM 来进行数据迁移和管理。随着大家使用的广泛和深入,遇到了不少由于对 DM 原理不理解而错误使用的情况,也发现了一些 DM 支持并不完善的场景和很多可以改进的地方。

在这样的背景下,我们希望开展 DM 源码阅读分享活动,通过对 DM 代码的分析和设计原理的解读,帮助大家理解 DM 的实现原理,和大家进行更深入的交流,也有助于我们和社区共同进行 DM 的设计、开发和测试。

背景知识

本系列文章会聚焦 DM 自身,读者需要有一些基本的知识,包括但不限于:

  • Go 语言,DM 由 Go 语言实现,有一定的 Go 语言基础有助于快速理解代码。

  • 数据库基础知识,包括 MySQL、TiDB 的功能、配置和使用等;知道基本的 DDL、DML 语句和事务的基本常识;MySQL 数据备份、主从同步的原理等。

  • 基本的后端服务知识,比如后台服务进程管理、RPC 工作原理等。

总体而言,读者需要有一定 MySQL/TiDB 的使用经验,了解 MySQL 数据备份和主从同步的原理,以及可以读懂 Go 语言程序。在阅读 DM 源码之前,可以先从阅读《TiDB-DM 架构设计与实现原理》入手,并且参考 使用文档 在本地搭建一个 DM 的测试环境,从基础原理和使用对 DM 有一个初步的认识,然后再进一步分析源码,深入理解代码的设计和实现。

内容概要

源码阅读系列将会从两条线进行展开,一条是围绕 DM 的系统架构和重要模块进行分析,另一条线围绕 DM 内部的同步机制展开分析。源码阅读不仅是对代码实现的分析,更重要的是深入的分析背后的设计思想,源码阅读和原理分析的覆盖范围包括但不限于以下列出的内容(因为目前 DM 仍处于快速迭代的阶段,会有新的功能和模块产生,部分模块在未来也会进行优化和重构,后续源码阅读的内容会随着 DM 的功能演进做适当的调整):

  • 整体架构介绍,包括 DM 有哪些模块,分别实现什么功能,模块之间交互的数据模型和 RPC 实现。

  • DM-worker 内部组件设计原理(relay-unit, dump-unit, load-unit, sync-unit)和数据同步的并发模型设计与实现。

  • 基于 binlog 的数据同步模型设计和实现。

  • relay log 的原理和实现。

  • 定制化数据同步功能的实现原理(包括库表路由,库表黑白名单,binlog event 过滤,列值转换)。

  • DM 如何支持上游 online DDL 工具(pt-osc, gh-ost)的 DDL 同步场景。

  • sharding DDL 处理的具体实现。

  • checkpoint 的设计原理和实现,深入介绍 DM 如何在各类异常情况下保证上下游数据同步的一致性。

  • DM 测试的架构和实现。

代码简介

DM 源代码完全托管在 GitHub 上,从 项目主页 可以看到所有信息,整个项目使用 Go 语言开发,按照功能划分了很多 package,下表列出了 DM 每个 package 的基本功能:

PackageIntroduction
checker同步任务上下游数据库配置、权限前置检查模块
cmd/dm-ctl, cmd/dm-master, cmd/dm-workerdmctl, DM-master, DM-worker 的 main 文件所在模块
dm/config同步任务配置、子任务配置、前置检查配置定义模块
dm/ctldmctl 所有 RPC 调用实现的模块
dm/masterDM-master 的核心实现,包含了 DM-master 后台服务,对 dmctl 到 DM-master 的 RPC 调用的处理逻辑,对 DM-worker 的管理,对 sharding DDL 进行协调调度等功能
dm/pb, dm/protodm/proto 定义了 DM-master 和 DM-worker 相关交互的 protobuf 协议,dm/pb 是对应的生成代码
dm/unit定义了子任务执行的逻辑单元(包括 dump unit, load unit, sync unit, relay unit)接口,在每个不同逻辑单元对应的 package 内都有对应的 接口实现
dm/workerDM-worker 的核心实现,实现 DM-worker 后台服务,管理维护每个任务的 relay 逻辑单元,管理、调度每个子任务的逻辑单元
loader子任务 load 逻辑单元的实现,用于全量数据的导入
mydumper子任务 dump 逻辑单元的实现,用于全量数据的导出
pkg包含了一些基础功能的实现,例如 gtid 操作、SQL parser 封装、binlog 文件流读写封装等
relay处理 relay log 同步的核心模块
syncer子任务 sync 逻辑单元的实现,用于增量数据的同步

对于理解代码最直接的手段就是从 DM-server, DM-worker 和 dmctl 三个 binary 对应的 main 文件入手,看 DM-worker, DM-master 是如何启动,DM-worker 如何管理一个上游实例和同步任务;如何从 dmctl 开始同步子任务;然后看一个同步子任务从全量状态,到增量同步状态,binlog 如何处理、sql 任务如何分发等。通过这样一个流程对 DM 的整体架构就会有全面的理解。进一步就可以针对每个使用细节去了解 DM 背后的设计逻辑和代码实现,可以从具体每个 package 入手,也可以从感兴趣的功能入手。

实际上 DM 代码中使用了很多优秀的第三方开源代码,包括但不仅限于:

  • 借助 grpc 实现各组件之间的 RPC 通信

  • 借助 pingcap/parser 进行 DDL 的语法解析和语句还原

  • 借助 pingcap/tidb-tools 提供的工具实现复杂的数据同步定制

  • 借助 go-mysql 解析 MySQL/MariaDB binlog 等

在源码阅读过程中对于比较重要的、与实现原理有很高相关度的第三方模块,我们会进行相应的扩展阅读。

工具链

工欲善其事,必先利其器,在阅读 DM 源码之前,我们先来介绍 DM 项目使用到的一些外部工具,这些工具通常用于 DM 的构建、部署、运行和测试,在逐步使用 DM,阅读代码、理解原理的过程中都会使用到这些工具。

  • golang 工具链:构建 DM 需要 go >= 1.11.4,目前支持 Linux 和 MacOS 环境。

  • gogoprotobuf:用于从 proto 描述文件生成 protobuf 代码,DM 代码仓库的 generate-dm.sh 文件封装了自动生成 DM 内部 protobuf 代码的脚本。

  • Ansible:DM 封装了 DM-Ansible 脚本用于 DM 集群的自动化部署,部署流程可以参考 使用 ansible 部署 DM。

  • pt-osc, gh-ost:用于上游 MySQL 进行 online-ddl 的同步场景。

  • mydumper:DM 的全量数据 dump 阶段直接使用 mydumper 的 binary。

  • MySQL, TiDB, sync_diff_inspector:这些主要用于单元测试和集成测试,可以参考 tests#preparations 这部分描述。

小结

本篇文章主要介绍了 DM 源码阅读的目的和源码阅读的规划,简单介绍了 DM 的源码结构和工具链。下一篇文章我们会从 DM 的整体架构入手,详细分析 DM-master、DM-worker 和 dmctl 三个组件服务逻辑的实现和功能抽象,RPC 数据模型和交互接口。更多的代码阅读内容会在后面的章节中逐步展开,敬请期待。

这篇关于DM 源码阅读系列文章(一)序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884406

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear