博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DM 源码阅读系列文章(五)Binlog replication 实现
阅读量:6505 次
发布时间:2019-06-24

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

hot3.png

作者:lan

本文为 DM 源码阅读系列文章的第五篇。 介绍了 dump 和 load 两个数据同步处理单元的设计实现,对核心 interface 实现、数据导入并发模型、数据导入暂停或中断的恢复进行了分析。本篇文章将详细地介绍 DM 核心处理单元 Binlog replication,内容包含 binlog 读取、过滤、路由、转换,以及执行等逻辑。 文内涉及到 shard merge 相关逻辑功能,如 column mapping、shard DDL 同步处理,会在 shard merge 篇单独详细讲解,这里就不赘述了。

Binlog replication 处理流程

从上图可以大致了解到 Binlog replication 的逻辑处理流程,对应的 。

  1. 从 relay log 或者 MySQL/MariaDB 读取 binlog events。

  2. 对 binlog events 进行处理转换(transformation),这里可以做三类操作:

    操作 说明
    Filter 根据 对库/表进行过滤;根据 。
    Routing 根据 对库/表名进行转换,用于合库合表。
    Convert 将 binlog 转换为 ,发送到 executor。
  3. executor 对 job 进行冲突检测,然后根据固定规则分发给对应的 worker 执行。

  4. 定期保存 binlog position/gtid 到 checkpoint。

Binlog 读取

Binlog replication 支持两种方式读取 binlog events:

两种方式都提供了同样的读取方法,处理核心都是 。该库主要提供了两个功能:

  • 注册为 MySQL/MariaDB 的 slave server ,从 MySQL/MariaDB 顺序读取 raw binlog events。
  • 解析 raw binlog events。

更多的处理细节会在下篇关于 relay log 的文章中进行介绍,迫不及待的小伙伴可以先翻阅一下相关代码实现。

Binlog 转换

处理程序拿到解析好的 binlog event 后,。Binlog replication 主要关心以下类型的 binlog event :

类型 说明
rotate event 消费完一个 binlog 文件,开始消费下一个 binlog 文件,用于更新 checkpoint 的 binlog position。
row event 包含 insert/update/delete DML 数据。
query event 包含 DDL 或者 statement DML 等数据。
xid event 代表一个 transaction 的 commit,经过 ,可以用来保存 checkpoint。

Binlog replication 数据处理单元会对每一类 binlog event 进行以下的处理步骤,具体实现的处理顺序可能略有差异,以代码实现为准。

过滤

Binlog replication 会从两个维度对 binlog event 来进行过滤:

  • 根据 ,过滤掉对应库/表的所有 binlog event。
  • 根据 ,过滤掉对应库/表指定的 binlog event。

和 的实现在逻辑上面存在一些差异:

  • row event 包含 信息;query event 需要通过 。
  • tidb parser 不是完全 100% 兼容 MySQL 语法,当遇到 parser 不支持的 query statement 时候,解析就会报错,从而无法获取到对应的库名和表名信息。Binlog replication 提供了一些 ,配合 ,来跳过 parser 不支持的 query statement。
  • query event 里面也会包含 statement format binlog event,此时 Binlog replication 就可以利用 parser 解析出来具体的 statement 类型,对不支持的 statement format binlog event 作出相应的处理: ;。

路由

binlog 过滤完成之后,对于需要同步的表就会根据过滤步骤获得的库名和表名,通过 ,在接下来的转换步骤来使用目标库名和表名来转换出正确的 DML 和 DDL statement。

转换

row event 转换处理和 query event 转换处理的实现存在一些差异,这里分开来讲述。

row event 转换处理通过三个转换函数生成对应的 statements:

  • :将 write rows event 转换为 replace into statements
    • safe mode = true,。
    • safe mode = false,。
  • :将 delete rows event 转换为 delete statements。

query event 转换处理:

  • 因为 TiDB 目前不支持一条 DDL 语句包含多个 DDL 操作,query event 转换处理会首先尝试将 包含多个 DDL 变更操作的单条 DDL 语句 拆分成 只包含一个 DDL 操作的多条 DDL 语句()。

  • 使用 parser 将 DDL statement 对应的 ast 结构里面的库名和表名替换成对应的目标库名和表名()。

通过转换处理之后,将不同的 binlog event 包装成不同的 job 发送到 executor 执行:

Job 执行

冲突检测

binlog 顺序同步模型要求按照 binlog 顺序一个一个来同步 binlog event,这样的顺序同步势必不能满足高 QPS 低同步延迟的同步需求,并且不是所有的 binlog 涉及到的操作都存在冲突。Binlog replication 采用冲突检测机制,鉴别出来需要顺序执行的 jobs,在确保这些 jobs 的顺序执行的基础上,最大程度地保持其他 job 的并发执行来满足性能方面的要求。

冲突检测流程如下:

  • 遇到 DDL job,,然后单独执行该 DDL job,执行完成之后保存 checkpoint 信息。
  • 遇到 DML job,会 。如果检测到冲突(即存在两个 executor 的 worker 的 jobs 都需要与当前的 job 保持顺序执行),,然后再将 job 分发到对应的 worker,。在没有冲突的情况下,如果不需要与已经分发出去的 job 保持顺序的话,发送 job 到任意 worker 上;如果需要保持顺序的话,那么根据内存储存的历史分发信息,发送 job 到对应的 worker 上。

冲突检测实现比较简单,根据转换步骤获得每条 statement 对应的 primary/unique key 信息,来进行交集检测,如果存在交集那么认定是需要顺序的执行两条 statement,请参考 。

执行

job 分发到对应的 worker 后,worker 根据一定的规则来批量执行这些 job,如下:

  • 或者积累的 job 数量超过 立即执行。

根据上面三个规则可以很快地将已经分发的 jobs 应用到下游 TiDB。

小结

本篇文章详细地介绍 DM 核心处理单元 Binlog replication,内容包含 binlog 读取、过滤、路由、转换,以及执行等逻辑。下一篇我们会对 relay log 数据处理单元的设计进行详细的讲解。

转载于:https://my.oschina.net/zhaiyuan/blog/3047133

你可能感兴趣的文章
smarty使用php代码,笑谈配置,使用Smarty技术_php
查看>>
oracle数据实际值限制,c# – Oracle数据库TNS密钥“数据源”的值长度超过了’128’的限制...
查看>>
silk v3 decoder php,解码转换QQ微信的SILK v3编码音频为MP3或其他格式
查看>>
linux不能访问80端口,lunux开放80端口(本地访问不了linux文件可能是这个原因)...
查看>>
android单位转换小程序,微信小程序中rpx与rem单位转换
查看>>
ps切图教程 android,PS前端切图完整教程
查看>>
html显示服务器状态,显示服务器时间并一直显示(html代码)
查看>>
在线html代码优化,网站seo优化html代码方法
查看>>
HTML如何把输入框变成必填值,required输入框为必填项
查看>>
html定位有几种,POSITION定位有哪几种?各有什么特点?
查看>>
背锅侠逆袭之路
查看>>
演示:使用协议分析器取证IPv6的报文结构
查看>>
oracle 11gr2 rac中的4种IP解说
查看>>
为什么你找不到工作?
查看>>
20 个免费的 jQuery 的工具提示插件:
查看>>
汇编语言的应用
查看>>
device platform 相应的表
查看>>
php des 加密解密实例
查看>>
【Mac】Mac键盘实现Home, End, Page UP, Page DOWN
查看>>
实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求
查看>>