博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DM 源码阅读系列文章(三)数据同步处理单元介绍
阅读量:6381 次
发布时间:2019-06-23

本文共 2394 字,大约阅读时间需要 7 分钟。

作者:lan

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

数据同步处理单元

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

处理单元 功能
relay log 持久化 MySQL/MariaDB Binlog 到磁盘
dump 从 MySQL/MariaDB dump 全量数据
load 加载全量数据到 TiDB cluster
binlog replication(sync) 复制 relay log 存储的 Binlog 到 TiDB cluster

数据同步流程

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

  1. DM-master 接收到 task, 后 ;

  2. DM-worker 接收到 subtask 后 ,然后 。

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

task-mode 同步流程 需要的数据同步处理单元
all 全量同步 -> 增量数据同步 relay log、dump、load、binlog replication(sync)
full 全量同步 dump、load
incremental 增量同步 relay log,binlog replication(sync)

运行逻辑

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

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

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

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

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

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

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

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

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

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

  • stage:subtask 的运行阶段状态, 包含 NewRunningPausedStoppedFinished,具体定义的代码在 。

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

主要的逻辑有:

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

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

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

    • 如果 ,则会根据 units 来 ,如果没有需要的数据同步处理单元,那么会将 subtask 的 stage 设置为 Finished。这里有个注意点,因为 binlog replication 单元永远不会结束,所以不会进入 Finished 的状态。

    • 如果 ,则会将 subtask 的 stage 设置为 Paused,并且打印具体的错误信息。

    • 如果是用户手动暂停或者停止,则会将 subtask 的 stage 设置为 Paused/Stopped。这里有个注意点,这个时候 stage=Paused 是没有错误信息的。

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

小结

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

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

转载于:https://juejin.im/post/5caeb6a8e51d456e2809fb5a

你可能感兴趣的文章
Android Google 地图 API for Android
查看>>
从 Zero 到 Hero ,一文掌握 Python--转
查看>>
【软件下载】整理一些外国的工具软件下载到网盘方便国内使用
查看>>
idea项目左边栏只能看到文件看不到项目结构
查看>>
idea如何编译maven项目
查看>>
在centos7下安装svn
查看>>
删除软链接
查看>>
windows7下MSN如何最小化到任务栏
查看>>
HDU-3016 Man Down 线段树
查看>>
初步认识注册表(待续)
查看>>
只能输入数字的TextBox自定义控件
查看>>
自定义事件
查看>>
浮点数的二进制
查看>>
主库配置关于Dataguard Online redo log 和 Standby redo log
查看>>
[内核笔记1]内核文件结构与缓存——inode和对应描述
查看>>
Red Hat忘记root密码了怎么办?
查看>>
Team Foundation Server (TFS) 2015 安装指导
查看>>
IOS-导航路线
查看>>
word2010图片仅仅显示边框
查看>>
启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法...
查看>>