V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PingCAP
V2EX  ›  推广

DM 源码阅读系列文章(三)数据同步处理单元介绍

  •  
  •   PingCAP · 2019-04-11 12:12:07 +08:00 · 956 次点击
    这是一个创建于 1848 天前的主题,其中的信息可能已经有所发展或是发生改变。

    作者:lan

    本文为 DM 源码阅读系列文章的第三篇,上篇文章 介绍了 DM 的整体架构,DM 组件 DM-master 和 DM-worker 的入口代码,以及两者之间的数据交互模型。本篇文章详细地介绍 DM 数据同步处理单元( DM-worker 内部用来同步数据的逻辑单元),包括数据同步处理单元实现了什么功能,数据同步流程、运行逻辑,以及数据同步处理单元的 interface 设计。

    数据同步处理单元

    从上图可以了解到目前 DM 包含 relay log、dump、load、binlog replication ( sync ) 4 个数据同步处理单元,涵盖了以下数据同步处理的功能:

    数据同步流程

    Task 数据同步流程初始化操作步骤:

    1. DM-master 接收到 task,将 task 拆分成 subtask分发给对应的各个 DM-worker

    2. DM-worker 接收到 subtask 后 创建一个 subtask 对象,然后 初始化数据同步流程

    初始化数据同步流程 的代码中我们可以看到,根据 task 配置项 task-mode 的不同,DM-worker 会初始化不同的数据同步流程:

    运行逻辑

    DM 数据同步处理单元 interface 定义在 dm/unit,relay log、dump、load、binlog replication ( sync )都实现了该 interface (golang interface 介绍)。

    实际上 DM-worker 中的数据同步处理单元分为两类:

    • 全局共享单例。dm-worker 启动的时候只初始化一次这类数据同步处理单元,所有的 subtask 都可以使用这类数据同步处理单元的服务; relay log 属于这种类型。

    • subtask 独享。dm-worker 会为每个 subtask 初始化一系列的数据同步处理单元; dump、load、binlog replication ( sync )属于这种类型。

    两类数据同步处理单元的使用逻辑不同,这篇文档会着重讲一下 subtask 独享的数据同步处理单元的使用逻辑,不会囊括更多的 relay log 相关的内容,后面会有单独一篇文章详细介绍它。

    relay log 相关使用代码在 dm/worker/relay.go 、具体功能实现代码在 relay/relay.go,有兴趣的同学也可以先行阅读一下相关代码,relay log 的代码注释也是比较丰富,并且简单易懂。

    subtask 独享数据同步处理单元使用逻辑相关代码在 dm/worker/subtask.go。subtask 对象包含的主要属性有:

    • units:初始化后要运行的数据同步处理单元。

    • currUnit:当前正在运行的数据同步处理单元。

    • prevUnit:上一个运行的数据同步处理单元。

    • stage:subtask 的运行阶段状态, 包含 NewRunningPausedStoppedFinished,具体定义的代码在 dm/proto/dmworker.proto

    • result:subtask 当前数据同步处理单元的运行结果,对应着 stage = Paused/Stopped/Finished 的详细信息。

    主要的逻辑有:

    • 初始化 subtask 对象实例的时候会 编排数据同步处理单元的运行先后顺序。所有的数据同步处理单元都实现了 dm/unit interface,所以接下来的运行中就不需要关心具体的数据同步处理单元的类型,可以按照统一的 interface 方法来运行数据同步处理单元,以及对其进行状态监控。

    • 初始化各个数据同步处理单元。subtask 在运行前集中地初始化所有的数据同步处理单元,我们计划之后优化成在各个数据同步处理单元运行前再进行初始化,这样子减少资源的提前或者无效的占用。

    • 数据同步处理单元运行状态监控。通过监控当前运行的数据同步处理单元的结果,将 subtask 的 stage 设置为 Paused/Stopped/Finished

    • 数据同步处理单元之间的运行交接处理逻辑。部分数据同步处理单元在开始工作的时候需要满足一些前置条件,例如 binlog replication ( sync )的运行需要等待 relay log 处理单元已经储存下来其开始同步需要的 binlog 文件,否则 subtask 将处于 stage=Paused 的暂停等待状态。

    小结

    本篇文章主要介绍了数据同步处理单元实现了什么功能,数据同步流程、运行逻辑,以及数据同步处理单元的 interface 设计。后续会分三篇文章详细地介绍数据同步处理单元的实现,包括:

    • dump/load 全量同步实现
    • binlog replication 增量同步实现
    • relay log 实现

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   911 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:09 · PVG 07:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.