DM 源码阅读系列文章(一)序 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PingCAP
V2EX    数据库

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

  •  
  •   PingCAP 2019-03-20 11:48:01 +08:00 1360 次点击
    这是一个创建于 2465 天前的主题,其中的信息可能已经有所发展或是发生改变。

    作者:杨非

    前言

    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 的基本功能:

    对于理解代码最直接的手段就是从 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 数据模型和交互接口。更多的代码阅读内容会在后面的章节中逐步展开,敬请期待。

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1278 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 17:14 PVG 01:14 LAX 09:14 JFK 12:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86