当前位置: 首页 > news >正文

【GaussDB迁移攻略】DRS支持CDC,解决大规模数据迁移挑战

目录

1 背景介绍

2 CDC的实现原理

3 DRS的CDC实现方式

4 DRS的CDC使用介绍

5 总结


1

背景介绍

随着国内各大行业数字化转型的加速,客户的数据同步需求越来越复杂。特别是当需要将一个源数据库的数据同时迁移到不同的目标库场景时,华为云通常会创建一个或多个DRS(Data Replication Service)任务来进行数据同步。

但是,随着源库数据量的增大,DRS任务数量也越来越多,会造成源库性能下降,甚至影响源库正常业务。

为了解决这一问题,华为云采用了DRS支持CDC(Change Data Capture,变更数据捕获)的数据迁移方案。本文将详细介绍其实现原理、实现方式及使用方法。

2

CDC的实现原理

CDC的核心思想是监测并捕获数据库的变动(包括插入、更新和删除操作),并将这些变更按发生的顺序完整记录下来,以供其他服务进行订阅及消费。

CDC主流的实现机制有2种:基于查询和基于日志

  • 第一种,基于查询

实现方式:通过SQL语句查询数据库中的变更记录。

优点:实现简单。通过简单SQL命令,即可完成数据查询,无需额外适配。

缺点

1)高延迟,依赖查询效率。

2)影响源库性能。

  • 第二种,基于日志

实现方式:通过解析日志,获取数据库的变动记录。

优点

1)低时延。数据变化快速记录到日志中,解析识别速度快。

2)高保真。日志中包含完整的DDL和DML变更,可以精确捕捉源库的各种变动。

3)不会增加源库压力。

缺点:灵活性有限。各个引擎的日志机制不同,需要深入了解后适配开发。

3

DRS的CDC实现方式

DRS的CDC功能主要借鉴了CDC的思想,采用基于日志的方式,并提出了1+N的架构创新,如图1所示。该架构通过一个CDC任务连接源库进行日志抽取和解析,而下游的多个DRS任务则直接通过CDC获取数据进行增量同步,不再连接源库。因此也不会对源库产生压力。

图片

1 DRSCDC实现架构

图1中,CDC负责日志下载、日志解析和增量数据的发布;DRS负责全量迁移、日志下载、日志解析(过滤)和增量数据回放。

在新架构中,需要2个任务来完成数据迁移,相对于单任务完成迁移操作,低时延和高可靠成为该架构的主要技术挑战。

3.1 低时延

3.1.1 NIO网络通信

为了保证低时延,需要CDC和DRS任务之间的数据高效传输。NIO技术成为华为云的优选,这种面向缓冲区、基于通道的I/O处理方式,能够高效地处理大量数据和高并发请求。

NIO的核心组件:

缓冲区(Buffer)

用于存储和处理CDC和DRS任务各自的数据,确保数据传输的高效性。

通道 (Channel)

实现CDC和DRS任务之间的数据传输,支持双向和异步操作,提高数据传输的效率和可靠性。

选择器(Selector)

管理多个通道的IO事件,确保一个线程可以同时监控多个通道的IO操作,实现非阻塞IO,提高系统的并发处理能力。

典型NIO模型的处理方式,如图2所示,一个线程可以管理多个网络连接。

图片

典型NIO模型的处理方式

回到我们业务本身CDC(RFS-Server)和DRS(RFS-Client)进行数据传递时,我们采用多路复用IO模型,交互方式如图3所示:

图片

3 CDCDRS组件交互

SocketListener线程:实时监听来自RFS-Client发送的连接请求;

SocketReader线程:负责校验请求是否有效,读取下游任务发送的命令,并进行分发处理;

RequestProcesser线程:执行具体操作,如读取文件长度、读取文件属性等。

传输性能测试结果:

测试项(客户端数量)

平均速度(MB/s)

最小(MB/s)

最大(MB/s)

1

268.2

129.1

622.9

5

112.9

29.1

833.9

测试环境:

类型

规格

ECS实例

c3.xlarge.2

3.1.2 数据压缩

对已解析的日志文件进行压缩,以减少磁盘占用,降低存储成本,并进一步提高数据的读写性能。

  • 压缩算法

在数据迁移过程中,如果进行压缩,那么无损压缩算法成为我们的必选。当前选用LZ4压缩算法,尽管压缩率不是最优(接近2.0),但是压缩和解压缩速度极快。

LZ4 的主要算法思想是将重复的字符串替换为对已识别字符串的引用。具体工作原理是在数据流中使用滑动窗口识别出现在一定范围内的数据序列。找到匹配项后,算法会将第二次出现的匹配项替换为对第一次出现的引用,从而减少数据的大小。

LZ4专注于查找固定长度的序列,简化了匹配过程。同时,使用哈希表存储和快速检索固定长度序列的位置,以实现快速引用。

从源库抽取的日志文件,统一解析为THL文件。存储格式如下:

字符串:使用一个字节表示是否存在,实际内容使用UTF格式;

基本数据类型:使用固定长度。

THL文件是序列化和反序列严格对称。这种紧凑性设计,占用更少的存储空间。

  • 数据剪枝

从实际业务需求出发,在CDC任务中提供2种对象选择方式:整库和部分表选择。通过对象选择,过滤冗余的源库日志数据,减少磁盘空间占用。

3.2 高可靠

3.2.1 数据安全

在数据迁移过程中,下游的所有DRS任务都依赖CDC,从中拉取日志数据。除了性能外,如何可靠地传输数据,并保证传输过程中数据不丢失,成为衡量可靠性的关键因素。

  • 文件完整性校验

由于网络环境的复杂性,数据在传输时有可能会出错。因此,针对传输的每条数据,将校验其序列号和长度是否一致。传输完成后,再次校验文件长度,来保证文件的一致性。

  • 加密传输

针对安全极度敏感客户,可以启动SSL传输加密。SSL通过使用数字证书和加密算法建立加密连接,保证数据传输过程的机密性。然而,启用 SSL 传输会导致性能下降约三倍,建议按需使用。

  • 安全位点

CDC任务从源库拉取日志时,受限于源库日志的保留时间。如果日志被清理,则无法继续从源库拉取。对于DRS任务,从CDC拉取日志时,不再受限源库日志的清理,可以持续拉取使用。

但是,用户可以调整放大CDC任务的同步对象范围。在这种情况下,调整前产生的数据,即没有新增对象的日志数据将不再可用。故引入“安全位点”概念,确保之前的数据不再支持拉取使用,且从安全位点之后的数据都是完整有效。

3.2.2 故障恢复

DRS任务自身已具备断点续传和故障恢复等功能,针对CDC任务和DRS任务之间因为网络闪断等原因,导致通信断开时DRS任务失败,如果通信条件恢复,那么,DRS任务也需要快速恢复。

  • 文件异常快速识别

通信中断后,为了保证THL文件数据的完整性,会清理本地文件,并重新拉取。

DRS任务在生成本地THL文件时,会标记文件的UUID,通过UUID的变动,可以快速识别文件变化,如图4所示。

图片

文件异常快速识别 

4

DRS的CDC使用介绍

DRS的CDC使用介绍(以MySQL为例)

1)创建CDC任务

  • 步骤一 创建CDC实例

设置数据流动方向、源库引擎、源库实例

图片

  • 步骤二 源库配置

填写源库用户名和密码,进行测试连接。

图片

  • 步骤三 任务配置

设置同步对象的范围,支持不同库配置不同规则。

图片

  • 步骤四 预检查

检查源库是否满足迁移条件,权限、表结构、源库参数等校验。

2)创建同步任务

  • 步骤一 创建同步实例

配置数据流动方向、源库引擎、同步模式。

图片

  • 步骤二 源库及目标库

源库信息中,开启CDC开关,可以选择CDC任务,后续从CDC中拉取日志。

图片

  • 步骤三 设置同步

在“编辑同步任务”页面,默认的同步对象是CDC中已选择的对象范围,选择后,支持映射。

图片

  • 步骤四 数据加工

针对已选择的对象,配置数据过滤,列加工等。

  • 步骤五 预检查

检验CDC任务连通性、对象选择范围是否合理等。

3) CDC任务运行

  • 发布列表

DRS任务启动后,即可再发布列表中查看下游的所有DRS任务。

图片

5

总结

DRS支持CDC的数据迁移方案,即CDC通过拉取源库日志,解析成标准的THL格式文件,进行增量数据发布。DRS直接拉取THL文件,进行解析和过滤,实现增量数据回放,有效的降低了多个DRS任务直连源库对源库性能的影响。针对源库数据量级大需要拆分任务迁移(一对多场景),以及对源库性能敏感客户优先推荐使用该方案。

http://www.xdnf.cn/news/486289.html

相关文章:

  • 芯谷产业园:双流元宇宙开放数字贸易新坐标
  • C++:字符串操作函数
  • 刷leetcodehot100返航版--双指针5/16
  • 虚拟来电 4.3.0 |集虚拟来电与短信于一体,解锁VIP优雅脱身
  • 腾讯云代码助手CodeBuddy使用体验
  • 7.1Java多线程安全和同步
  • vue 指令
  • python版本管理工具-pyenv轻松切换多个Python版本
  • DATE_FORMAT可以接收date类型,也可以接收String类型!
  • this.$set的用法-响应式数据更新
  • oracle主备切换参考
  • 初学者如何用 Python 写第一个爬虫?
  • 【LLM】大模型落地应用的技术 ——— 推理训练 MOE,AI搜索 RAG,AI Agent MCP
  • ​小店推客系统开发SEO全攻略:从技术架构到流量裂变,打造私域增长引擎
  • Android framework 中间件开发(二)
  • 贝叶斯英文单词拼写纠错器(Python)
  • 小型研发团队的项目管理:挑战与高效工具推荐
  • 实时数据流处理的利器:如何利用 Spark Streaming 让数据动起来?
  • Java 流(Stream)API
  • CSS- 3.1 盒子模型-块级元素、行内元素、行内块级元素和display属性
  • MySQL高效开发规范
  • 不清楚的点
  • RNope:结合 RoPE 和 NoPE 的长文本建模架构
  • git相关配置
  • 深入理解 this 指向与作用域解析
  • 使用 gcloud CLI 自动化管理 Google Cloud 虚拟机
  • AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)
  • FreeSWITCH Jitter Buffer 技术解析与应用指南
  • OpenCV边界填充(Border Padding)详解:原理、方法与代码实现
  • TDuckX 2.6 正式发布|API 能力开放,核心表单逻辑重构,多项实用功能上线。