CloudCanal对Online DDL 工具 GH-OST 和 PT-OSC 的支持

news2024/11/17 23:29:06

简介

CloudCanal 实现了对 Online DDL 工具如 GH-OST 和 PT-OSC 的支持,保证了对端实时同步源端的 Online DDL 操作。

本文以 MySQL -> MySQL 同步链路使用 GH-OST 为例,介绍 CloudCanal 是如何支持实时同步 GH-OST 产生的 DDL 的。

Online DDL 技术背景

市面上常用的两款MySQL Online DDL 工具分别是 GH-OST 和 PT-OSC,CloudCanal 对他们都做了兼容处理使得用户可以实时同步 Online DDL 工具产生的 DDL 。下面简单介绍下他们的工作流程,以便于读者理解后续章节的内容。

Online DDL 工具 PT-OSC 原理

PT-OSC 是较为常用的 Online DDL 工具,通过触发器来同步增量数据,相较于 MySQL 原生的 Online DDL 性能得到了极大的提高,原理如下:

  • 对源表进行检查
  • 创建一个与源表(origin)结构一致的空表,命名为 _origin_new
  • 根据alter参数修改新表的表结构
  • 在源表中创建三个触发器:Delete / Update / Insert,将源表中的增删改语句同步执行到新表中,同时将源表中的数据以数据块的形式 copy 到新表
  • 将源表(origin)rename为 _origin_old,将 _origin_new rename 为 origin,然后删除旧表(可选)
  • 删除触发器

总结:PT-OSC 是通过创建临时表,并用触发器将增量数据同步到新表,通过当前读和事务来实现增量与全量的有序,不会阻塞读写操作,但运行过程中出现异常,无法从上一个位置继续进行,需要从头开始。

Online DDL 工具 GH-OST 原理

GH-OST 也是一款常用的 Online DDL 工具,采用读取 binlog 日志的方式来同步增量数据,原理如下:

  • 对源表(origin)进行检查
  • 在主/从节点中添加binlog日志监听
  • 创建日志记录表(_origin_ghc)和与源表结构一致的影子表(_origin_gho)
  • 根据alter参数修改影子表的表结构
  • 全量拷贝源表数据同时拷贝源表增量数据到影子表中,并记录日志到日志记录表中
  • 删除日志记录表,将源表改名为 _origin_del, 将影子表改名为 origin,_origin_del 可选删除

总结: GH-OST 的性能与 PT-OSC 相近,相较于PT-OSC 的优点就在于其是不使用触发器的,只异步读取二进制日志,因此修改表定义的负载和正常的业务负载解耦开了,它不需要考虑被修改的表上的并发操作和竞争等,并且相较于 PT-OSC 的中断从头开始,GH-OST 可以从心跳日志中恢复到指定位置。

CloudCanal 技术点

前文中对 Online DDL 工具的原理中我们知道,无论采用哪种 Online DDL 工具,源端都会产生一些临时表的创建和数据写入,如果不做任何兼容处理,这会影响正常的迁移同步链路。

因此为了支持 GH-OST 和 PT-OSC 工具的使用,CloudCanal 在 MySQL 源端做了大量优化,完美的适配并优化了 GH-OST 和 PT-OSC 的 Online DDL 能力

同步临时表数据

GH-OST 和 PT-OSC 工具都有一个共同的特点,其原理都是采用临时表的方式来保证 DDL 与 DML 的并发操作。

CloudCanal 默认的表订阅模式是只订阅原表,不订阅与原表相关的临时表(订阅表即同步该表的 DDL 与 DML 语句),而 CloudCanal 为了满足对 Online DDL 工具的支持,在源数据端配置上新增了 extraDDL 参数来实现对临时表的订阅。

  • extraDDL参数
    • 可选参数:NONE / GHOST / PT
    • 作用:选择 NONE 则不订阅任何临时表,选择 GHOST / PT 则订阅相应的默认临时表

CloudCanal 针对临时表订阅采用的是两种模式:自动订阅临时表模式和自动同步元数据模式

  • 自动订阅临时表:CloudCanal 会自动根据 extraDDL 参数将默认的临时表加入到订阅表集合中,随后读取binlog日志时将不会过滤掉临时表的所有变更事件,保证了对端数据源表结构与数据的最终一致性
  • 自动同步元数据:CloudCanal 会自动过滤临时表,在读取binlog日志时不会执行 Online DDL 的操作,在 Online DDL 执行完毕后发送最新的表结构,期间的 DML 语句也会同步发送到对端,保证对端数据源表结构与数据的最终一致性

由于各数据源对同步数据的消费并不相同,如消息队列只需要解析 Online DDL 后的表结构即可,无需订阅临时表,因此我们需要根据对端数据源的消费模式做出不同的处理。

DDL 解析与转换

不同数据源的 DDL 语句会有所差异,CloudCanal 对不同数据源 DDL 语句的解析和转换做了大量的优化。

  1. 解析:将 DDL 语句解析为操作类型,如 CREATE ,DROP,ALTER 等
  2. 拆分过滤:若 DDL 语句不为单条操作,则拆分为多条 DDL 语句,根据订阅表集合和binlog位点记录过滤重复执行的 DDL 语句与去除无需同步的语句后,重新合成新的 DDL 语句
  3. 转换:将过滤好的 DDL 语句转换为对端数据源的方言

下图演示了CloudCanal对DDL语句的一些处理:

容错机制

当 CloudCanal 在同步 Online DDL 时,任务有可能在两个层面上被中断:Online DDL 工具层面和 CloudCanal任务层面

  • Online DDL 工具中断:由于 PT-OSC 和 GH-OST 的原理不同,Online DDL 过程中断的恢复方案也有所不同

    • PT-OSC:Online DDL 过程中出现异常中断,重新执行 Online DDL 操作会丢弃之前的所有操作,从头开始再次执行
    • GH-OST:Online DDL 过程中出现异常中断,重新执行 Online DDL 操作会读取ghc日志心跳表,从日志中的未完成位点开始继续执行。在此过程中,CloudCanal只需读取binlog日志,照常执行 Online DDL 的所有操作即可保证数据的最终一致性
  • CloudCanal任务中断:由于 CloudCanal 良好的异步消费特性,CloudCanal的任务中断与 Online DDL 的执行并不相关。当 CloudCanal 任务中断后,重启任务会根据位点记录继续执行binlog日志中的事件,保证了数据的最终一致性。

使用示例

前置条件

  • 安装 GH-OST
  • 登入 CloudCanal SaaS版,使用参见 快速上手文档
  • 准备一个 MySQL 数据库,对端数据库(以 MySQL -> MySQL 为例)
CREATE TABLE `ghost_test`.`abc` (
  `id` int NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `cdata` datetime DEFAULT NULL,
  `udata` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
  • 登录 CloudCanal 平台 ,添加源端与目标端数据源

任务创建

  • 任务管理 -> 任务创建。
  • 测试连接并选择 目标 数据库。
  • 选择增量同步任务和需要订阅的表与字段,并创建任务
  • 增量任务中,功能列表 -> 参数修改 -> 源数据源配置 -> 参数 extraDDL 设置为 GHOST

创建并且启动任务,当任务正常执行到增量阶段时,此时我们可以利用数据生成工具和Online DDL工具对源端数据库触发一些增量DML变更和DDL变更,然后查看CloudCanal是否能正常实时同步这些DML和DDL事件。

使用 Online DDL 工具修改表结构

  • 首先使用数据生成工具实时随机生成数据,增删改比例为(4:4:3)

  • 在大量写入数据的同时,使用 GH-OST 工具执行 DDL 语句:ALTER TABLE ADD COLUMN aaa VARCHAR(30) NOT NULL AFTER id。在我们的测试例子中,有 DML 语句的同时使用 GH-OST 执行 DDL 语句,源端总计写入14147 条数据和1条DDL。
[root@zjx local] ./gh-ost --debug --user="{数据库用户名}" --password="{数据库密码}" --host="{数据库主机IP}" --port="{数据库端口号}" --database="ghost_test" --table="abc" --initially-drop-ghost-table --initially-drop-old-table --allow-on-master --alter="ADD COLUMN aaa varchar(30) NOT NULL AFTER id" --execute

确认同步结果

CloudCanal会自动完成源端实时DML和DDL事件的同步,在执行完源端事件写入之后,我们确认下同步结果。

  • 更改后的源对端 表结构一致

  • 源对端进行数据校验 数据一致

总结:由上可知,在 CloudCanal 中使用 GH-OST 工具执行 Online DDL 指令,源表完成表结构修改后,CloudCanal 将源表的表结构成功同步到了目标端数据表中。

常见问题

CloudCanal 支持的同步链路

目前 CloudCanal 支持使用 Online DDL 工具的链路为:

  • MySQL -> MySQL
  • MySQL -> PostgreSQL
  • MySQL -> Greenplum
  • MySQL -> Kafka
  • MySQL -> RocketMQ
  • MySQL -> RabbitMQ

不支持同步的 DDL 语句

使用 Online DDL 工具执行的 DDL 语句中不支持 RENAME 原表与临时表的操作,如上述用例中,ALTER 语句若改为 RENAME TABLE ghost_test.abc TO ghost_test.ccc,那么 Online DDL 工具后续的 RENAME TABLE ghost_test.abc TO ghost_test._abc_del, ghost_test._abc_gho TO ghost_test.abc 操作就会失败,致使 Online DDL 操作失败。

总结

本文主要介绍了 Online DDL 工具的使用并展示了 CloudCanal 对 Online DDL 工具的实时同步能力,得益于 GH-OST、PT-OSC 优秀的表结构修改性能和 CloudCanal 强大的同步能力,基本能满足企业在日常执行 DDL 的业务中,数据表的 DML 执行和数据同步性能要求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS7版本中mysql卸载和安装步骤问题汇总记录--2020-12-29

目录一、如何卸载1.1 查询系统是否安装了MySQL1.2 关闭MySQL服务1.3 删除MySQL安装的服务1.4 删除MySQL相关的文件夹二、如何安装2.1 下载MySQL5.7安装包2.2 安装MySQL2.3 配置MySQL2.3.1 初始化数据库2.3.2 配置开机自启2.3.3 启动MySQL服务2.3.4 登录MySQL进行初始化参考文献…

【开源项目】消息队列XXL-MQ源码解析

消息队列XXL-MQ源码解析 项目介绍 XXL-MQ是一款轻量级分布式消息队列,拥有 “水平扩展、高可用、海量数据堆积、单机TPS过10万、毫秒级投递” 等特性, 支持 “并发消息、串行消息、广播消息、延迟消息、事务消费、失败重试、超时控制” 等消息特性。现已开放源代码…

专栏目录总览

文章目录摘要1. Backbone2. Neck3. Bottleneck4. Head5.GAP或者avgpool:6.Embedding摘要 梳理了一些长见的名词,方便大家够好的理解论文和Ai方向的文章。 1. Backbone 骨干网络或者说是主干网络,指的是提取特征的网络,其作用就…

Bean 作用域,Bean生命周期,Bean执行原理

Spring 是⽤来读取和存储 Bean,因此在 Spring 中 Bean 是最核⼼的操作资源,所以接下来我们深⼊学习⼀下 Bean 对象. 1.通过⼀个案例来看 Bean 作⽤域的问题 假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的…

线程池的原理和使用

ThreadPoolExecutor 为什么用线程池 线程池做的主要工作就是控制运行的线程的数量,处理过程中,将任务放入到队列中,然后线程创建后,启动这些任务,如果线程数量超过了最大数量的线程排队等候,等其它线程执…

7.移动端笔记-less基础

1.css的弊端 CSS需要书写大量的看似没有逻辑的代码,冗余度高不方便维护,不利于复用没有很好的计算能力 2.Less介绍 简单说:Less是CSS预处理语言,扩展了CSS的动态性 CSS的扩展语言,也成为CSS的预处理器。在CSS基础上…

论文精读:Centernet:Objects as Points

论文地址:https://arxiv.org/pdf/1904.07850.pdf 代码地址:https://github. com/xingyizhou/CenterNet. Abstract 基于anchor的目标检测算法通常会列举大量可能存在对象位置的列表,这是浪费的、低效的。作者采用了一种不同的方法。将一个对象建模为单个点——其边…

魔术小游戏

魔术游戏一、问题描述二、基本流程三、具体步骤1.在集合中随机生成起始牌2.菜单栏3.找到包含[选中牌]的一组牌在大集合中的索引4.洗牌5.发牌四、完整代码五、效果展示一、问题描述 这是一个魔术游戏,将15张牌分为三组,每组5张,让玩家从中任选…

填鸭表单|2022年度总结功能发布

自从我们在2020年发布了开源版本以来,我们结识了许多社区伙伴。在和这些社区伙伴的接触中,我们深刻地感受到了“做产品的感觉,令人振奋且充满激情”。 我们认为,专注于做一件事情,持续深耕,时间自然会给出…

C#语言实例源码系列-实现对文件进行加密保护

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

jmeter压测使用实践

环境搭建篇见https://blog.csdn.net/weixin_42498050/article/details/12847945 参考Jmter压测使用实践 jmeter压测实战总结 搭建 Apache Jmeter 分布式压测与监控 Jmeter常用断言 1. 添加线程组 测试计划 (右键->添加->Threads(Users&#x…

做了这么久的自动化测试现在才知道API 接口测试还能...

接口测试作为最常用的集成测试方法的一部分,通过直接调用被测试的接口来确定系统在功能性、可靠性、安全性和性能方面是否能达到预期,有些情况是功能测试无法覆盖的,所以接口测试是非常必要的。首先需要对接口测试的基本信息做一些了解&#…

Linux如何安装BeyondCompare

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录安装yumtar.gz使用示例BeyondCompare是一款广受好评的文本对比工具。本…

文件上传漏洞渗透与攻防(一)

目录 前言 文件上传漏洞原理 Webshell介绍 一句话木马: 小马: 大马: Webshell集合: 网站控制工具 文件上传漏洞危害 文件上传漏洞靶场练习 Pass-01 Pass-02 Pass-03 Pass-04 Pass-06 Pass-07 Pass-08 Pass-09 Pass-10 Pas…

Java并发编程(二)

线程方法 API Thread 类 API: 方法说明public void start()启动一个新线程,Java虚拟机调用此线程的 run 方法public void run()线程启动后调用该方法public void setName(String name)给当前线程取名字public void getName()获取当前线程的名字 线程存…

实战演练 | 使用 Navicat Premium 自动运行数据库复制

与同步(使两个数据库的模式和数据同步的一次性过程)不同,复制是一个连续(自动)在两个数据库之间重现数据的过程(尽管模式更新也是可能的)。复制可以异步完成,因此不需要永久连接两个…

【Lniux】目录的权限,默认权限,粘滞位详细讲解

大家好,今天详细讲解一些关于目录权限的细节 很多细节都是通过问答方式,希望大家可以先自己思考一下答案然后再听我的分析 欢迎指正错误,我们共同成长 目录 1.目录的权限 2.默认权限 3.粘滞位 1.目录的权限 如果我们要进图一个目录只需要…

ArcGIS基础实验操作100例--实验25统一多分辨率栅格数据

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验25 统一多分辨率栅格数据 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

springboot admin-server的使用

指标监控可视化文档&#xff1a; 用于管理 Spring Boot 应用程序的管理 UI Spring Boot Admin Reference Guide 一、创建项目 就勾选Spring Web项目即可 二、基础设置 (1) 依赖引入 <dependency><groupId>de.codecentric</groupId><artifactId>sp…

Android: Binder: 彻底顿悟Android Binder

Binder机制可谓是Android 知识体系的重中之中&#xff0c;作为偏底层的基础组件&#xff0c;平时我们很少关注它&#xff0c;但是它却无处不在&#xff0c;这也是android面试考察点之一&#xff0c;本篇将从流程上将Binder通信过一遍。 文章目录 1&#xff1a;Binder作用 2&…