文档章节

DM 源码阅读系列文章(八)Online Schema Change 同步支持

TiDB
 TiDB
发布于 06/20 10:32
字数 1220
阅读 18
收藏 0

作者:lan

本文为 DM 源码阅读系列文章的第八篇,上篇文章 对 DM 中的定制化数据同步功能进行详细的讲解,包括库表路由(Table routing)、黑白名单(Black & white table lists)、列值转化(Column mapping)、binlog 过滤(Binlog event filter)四个主要功能的实现。

本篇文章将会以 gh-ost 为例,详细地介绍 DM 是如何支持一些 MySQL 上的第三方 online schema change 方案同步,内容包括 online schema change 方案的简单介绍,online schema change 同步方案,以及同步实现细节。

MySQL 的 Online Schema Change 方案

目前有一些第三方工具支持在 MySQL 上面进行 Online Schema Change,比较主流的包括 pt-online-schema-changegh-ost

这些工具的实现原理比较类似,本文会以 gh-ost 为例来进行分析讲解。

从上图可以大致了解到 gh-ost 的逻辑处理流程:

  1. 在操作目标数据库上使用 create table ghost table like origin table 来创建 ghost 表;
  2. 按照需求变更表结构,比如 add column/index
  3. gh-ost 自身变为 MySQL replica slave,将原表的全量数据和 binlog 增量变更数据同步到 ghost 表;
  4. 数据同步完成之后执行 rename origin table to table_del, table_gho to origin table 完成 ghost 表和原始表的切换

pt-online-schema-change 通过 trigger 的方式来实现数据同步,剩余流程类似。

在 DM 的 task 配置中可以通过设置 online-ddl-scheme 来配置的 online schema change 方案,目前仅支持 gh-ost/pt 两个配置选项。

DM Online Schema Change 同步方案

根据上个章节介绍的流程,pt 和 gh-ost 除了 replicate 数据的方式不一样之外,其他流程都类似,并且这种 native 的模式可以使得 binlog replication 几乎不需要修改就可以同步数据。但是 DM 为了减少同步的数据量,简化一些场景(如 shard tables merge)下的处理流程,并做了额外的优化,即,不同步 ghost 表的数据。

继续分析 online schema change 的流程,从数据同步的角度看有下面这些需要关注的点:

  • 原始表的增量数据同步模式有没有变化
  • ghost 表会产生跟原始表几乎一样的冗余 binlog events
  • 通过 rename origin table to table_del, table_gho to origin table 完成 ghost 表和原始表的切换

如果使用 ghost 表的 alter DDL 替换掉 rename origin table to table_del, table_gho to origin table ,那么就可以实现我们的不同步 ghost 表数据的目的。

DM Online Schema Change 同步实现细节

Online schema change 模块代码实现如下:

DM 将 同步的表分为三类

  • real table - 原始表
  • trash table - online schema change 过程中产生的非关键数据表,比如以 _ghc, _del 为后缀的表
  • ghost table - 与原始表对应的经过 DDL 变更的数据表,比如以 _gho 为后缀的表

当 DM 遇到 DDL 的时候,都会 调用 online schema change 模块的代码进行处理,首先判断表的类型,接着针对不同类型作出不同的处理:

下面是一个执行示例,方便大家对照着来理解上面的代码逻辑:

  1. Section 1: 使用 create table like statement 创建 ghost table,DM 会清空内存中 online_ddl._t2_gho 对应的 DDL 信息
  2. Section 2: 执行 alter table statement,DM 会保存 DDL 到内存中
  3. Section 3:trash table 的 DDLs 会被忽略
  4. Section 4:遇到 ghost table 的 rename table statement 会替换成 Section 2 的 DDL, 并且将该 DDL 的 table name 更换成对应 real table name 去执行

注意: rename table statement 模式检查主要是为了确保在 online schema change 变更过程中除了 rename origin table to table_del, table_gho to origin table 之外没有其他 rename table statement,避免同步状态的复杂化。

小结

本篇文章详细地介绍 DM 对 online schema change 方案的同步支持,内容包含 online schema change 方案的简单介绍, online schema change 同步方案,以及同步实现细节。下一章会对 DM 的 shard DDL merge 方案进行详细的讲解,敬请期待。

原文阅读https://www.pingcap.com/blog-cn/dm-source-code-reading-8/

© 著作权归作者所有

TiDB
粉丝 166
博文 211
码字总数 567731
作品 4
海淀
私信 提问
DM 源码阅读系列文章(九)shard DDL 与 checkpoint 机制的实现

作者:张学程 本文为 DM 源码阅读系列文章的第九篇,在 上篇文章 中我们详细介绍了 DM 对 online schema change 方案的同步支持,对 online schema change 同步方案以及实现细节等逻辑进行了...

TiDB
07/18
0
0
TiDB Executive Summary

一、重要文档 ● 【TiDB 中文文档】 https://pingcap.com/docs-cn ● 【FAQ】 https://pingcap.com/doc-FAQ-zh ● 【OPS】https://www.tidb.cc 二、TiDB 的技术原理 ● 【TiDB 技术内幕】 ○...

易野
2018/10/27
0
0
DM 源码阅读系列文章(七)定制化数据同步功能的实现

作者:王相 本文为 DM 源码阅读系列文章的第七篇,在 上篇文章 中我们介绍了 relay log 的实现,主要包括 relay log 目录结构定义、relay log 数据的处理流程、主从切换支持、relay log 的读...

TiDB
06/06
0
0
TiDB Ecosystem Tools 原理解读系列(三)TiDB-DM 架构设计与实现原理

作者:张学程 简介 TiDB-DM(Data Migration)是用于将数据从 MySQL/MariaDB 迁移到 TiDB 的工具。该工具既支持以全量备份文件的方式将 MySQL/MariaDB 的数据导入到 TiDB,也支持通过解析执行...

TiDB
2018/12/27
0
0
DM 源码阅读系列文章(二)整体架构介绍

作者:张学程 本文为 DM 源码阅读系列文章的第二篇,第一篇文章 简单介绍了 DM 源码阅读的目的和规划,以及 DM 的源码结构以及工具链。从本篇文章开始,我们会正式开始阅读 DM 的源码。 本篇...

TiDB
03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Knative Service 之流量灰度和版本管理

本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision、如何在不同的 Revision 之间按照流量比例灰度。 部署 rest-api v1 代码 测试之前我们需要...

阿里云云栖社区
10分钟前
1
0
代码管理平台git

22.5/22.6 单机上使用git 22.7 简历远程仓库 22.8 克隆远程仓库 22.9 分支管理 22.10 远程分支管理 22.11 标签管理 22.12 git别名 22.13 搭建git服务器 22.14/22.15 安装gitlab 22.16 使用g...

tobej
11分钟前
1
0
压测某HR系统,遇到的坑

遇到的问题:当多个线程组公用一个公共模块功能的时候(登录生成的cookies信息,文件的写入操作),此时出现跨域问题 场景分析: 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的...

覃光林
11分钟前
1
0
学习k8s——基本架构

对部署流水线有了个大致的认知之后,开始学习k8s k8s的基本架构 kubernateskubernates这个单词起源于古希腊,是舵手的意思,所以它的logo既像一个渔网,又像一个罗盘。K8S是它的缩写,用“8...

啊哈关关
23分钟前
1
0
好程序员分享JavaScrip数组去重操作实例小结

好程序员分享JavaScrip数组去重操作实例小结,这篇文章主要介绍了JavaScrip数组去重操作,结合实例形式总结分析了javascript针对数组的遍历、判断、去重等相关操作技巧,需要的朋友可以参考下。...

好程序员IT
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部