摘要:MRS CDL是FusionInsight MRS推出的一种数据实时同步服务,旨在将传统OLTP数据库中的事件信息捕捉并实时推送到大数据产品中去,本文档会详细为大家介绍CDL的整体架构以及关键技术。

本文分享自华为云社区《MRS CDL架构设计与实现》,作者:rujia01。

1 前言

MRS CDL是FusionInsight MRS推出的一种数据实时同步服务,旨在将传统OLTP数据库中的事件信息捕捉并实时推送到大数据产品中去,本文档会详细为大家介绍CDL的整体架构以及关键技术。

2 CDL的概念

MRS CDL(Change Data Loader)是一款基于Kafka Connect的CDC数据同步服务,可以从多种OLTP数据源捕获数据,如Oracle、MySQL、PostgreSQL等,然后传输给目标存储,该目标存储可以大数据存储如HDFS,OBS,也可以是实时数据湖Hudi等。

2.1 什么是CDC?

CDC(Change Data Capture)是一种通过监测数据变更(新增、修改、删除等)而对变更的数据进行进一步处理的一种设计模式,通常应用在数据仓库以及和数据库密切相关的一些应用上,比如数据同步、备份、审计、ETL等。

CDC技术的诞生已经有些年头了,二十多年前,CDC技术就已经用来捕获应用数据的变更。CDC技术能够及时有效的将消息同步到对应的数仓中,并且几乎对当前的生产应用不产生影响。如今,大数据应用越来越普遍,CDC这项古老的技术重新焕发了生机,对接大数据场景已经是CDC技术的新使命。

当前业界已经有许多成熟的CDC to大数据的产品,如:Oracle GoldenGate(for Kafka)、 Ali/Canal、Linkedin/Databus、Debezium/Debezium等等。

2.2 CDL支持的场景

MRS CDL吸收了以上成熟产品的成功经验,采用Oracle LogMinner和开源的Debezium来进行CDC事件的捕捉,借助Kafka和Kafka Connect的高并发,高吞吐量,高可靠框架进行任务的部署。

现有的CDC产品在对接大数据场景时,基本都会选择将数据同步到消息队列Kafka中。MRS CDL在此基础上进一步提供了数据直接入湖的能力,可以直接对接MRS HDFS和Huawei OBS以及MRS Hudi、ClickHouse等,解决数据的最后一公里问题。

表1 MRS CDL支持的场景

3 CDL的架构

作为一个CDC系统,能够从源目标抽取数据并且传输到目标存储中去是基本能力,在此基础上,灵活、高性能、高可靠、可扩展、可重入、安全是MRS CDL着重考虑的方向,因此,CDL的核心设计原则如下:

  • 系统结构必须满足可扩展性原则,支持在不损害现有系统功能的前提下添加新的源和目标数据存储。
  • 架构设计应当满足不同角色间的业务侧重点分离
  • 在合理的情况下减少复杂性和依赖性,最大限度的降低架构、安全性、韧性方面的风险。
  • 需要满足插件式的客户需求,提供通用的插件能力,使得系统灵活、易用、可配置。
  • 业务安全,避免横向越权和信息泄露。

3.1 架构图/角色介绍

图1 CDL架构

MRS CDL包含CDL Service和CDL Connector两个角色,他们各自的职能如下:

  • CDL Service:负责任务的管理和调度,提供统一的API接口,同时监测整个CDL服务的健康状态。
  • CDL Connector:本质上是Kafka Connect的Worker进程,负责真实Task的运行,在Kafka Connect高可靠、高可用、可扩展的特性基础上增加了心跳机制来协助CDL Service完成集群的健康监测。

3.2 为什么选择Kafka?

我们将Apache Kafka与Flume和Nifi等各种其他选项进行了比较,如下表所示:

表1 框架比较

对于CDC系统,Kafka有足够的优势来支撑我们做出选择。同时,Kafka Connect的架构完美契合CDC系统:

  • 并行 - 对于一个数据复制任务,可以通过拆解成多个子任务并且并行运行来提高吞吐率。
  • 保序 - Kafka的partition机制可以保证在一个partition内数据严格有序,这样有助于我们实现数据完整性。
  • 可扩展 - Kafka Connect在集群中分布式的运行Connector。
  • 易用 - 对Kafka的接口进行了抽象,提升了易用性。
  • 均衡 - Kafka Connect自动检测故障,并在剩余进程上根据各自负载重新进行均衡调度。
  • 生命周期管理 – 提供完善的Connector的生命周期管理能力。

4 MRS CDL关键技术

图2 CDL关键技术

4.1 CDL Job

MRS CDL对业务进行了上层的抽象,通过引入CDL Job的概念来定义一个完整的业务流程。在一个Job中,用户可以选择数据源和目标存储类型,并且可以筛选要复制的数据表。

在Job结构的基础上,MRS CDL提供执行CDL Job的机制,在运行时,使用Kafka Connect Source Connector结合日志复制技术将CDC事件从源数据存储捕获到Kafka,然后使用Kafka Connect Sink Connector从Kafka提取数据,在应用各种转换规则后将最终结果推送到目标存储。

提供定义表级和列级映射转换的机制,在定义CDL Job的过程中可以指定转换规则。

4.2 Data Comparison

MRS CDL提供一种特殊的Job,用于进行数据一致性对比。用户可以选择源和目标数据存储架构,从源和目标架构中选择各种比较对进行数据比较,以确保数据在源和目标数据存储中一致。

图3 Data Comparison抽象视图

MRS CDL提供了专用的Rest API来运行Data Compare Job,并且提供如下能力:

  • 提供多样的数据比较算法,如行哈希算法,非主键列比较等。
  • 提供专门的查询接口,可以查询同步报表,展示当前Compare任务的执行明细。
  • 提供实时的基于源和目标存储的修复脚本,一键修复不同步数据。

如下是Data Compare Job执行流程:

图4 Data Compare Job执行和查看流程

4.3 Source Connectors

MRS CDL通过Kafka Connect SDK创建各种源连接器,这些连接器从各种数据源捕获CDC事件并推送到Kafka。CDL提供专门的Rest API来管理这些数据源连接器的生命周期。

4.3.1 Oracle Source Connector

Oracle Source Connector使用Oracle RDBMS提供的Log Miner接口从Oracle数据库捕获DDL和DML事件。

图5 Log Miner抓取数据示意图

在处理DML事件时,如果表中存在BOLB/CLOB列,CDL同样可以提供支持。对于BOLB列的处理,关键点处理如下:

  • 当insert/update操作发生时,会触发一系列的LOB_WRITE操作。
  • LOB_WRITE用于将文件加载到BLOB字段中。
  • 每个LOB_WRITE只能写入1KB数据。
  • 对于一个1GB的图片文件,我们会整理全部的100万个LOB_WRITE操作中的二进制数据,然后合并成一个对象。我们会把这个对象存储到Huawei OBS中,最终在写入Kafka的message中给出该对象在OBS中的位置。

对于DDL事件的捕获,我们创建单独的会话来持续跟踪。当前支持的DDL语句如下:

表2 支持的DDL语句

4.3.2 MYSQL Source Connector

MYSQL的Binary Log(Bin Log)文件顺序记录了所有提交到数据库的操作,包括了对表结构的变更和对表数据的变更。MYSQL Source Connector通过读取Bin Log文件,生产CDC事件并提交到Kafka的Topic中。

MYSQL Source Connector主要支持的功能场景有:

  • 捕获DML事件,并且支持并行处理所捕获的DML事件,提升整体性能
  • 支持表过滤
  • 支持配置表和Topic的映射关系
  • 为了保证CDC事件的绝对顺序,我们一般要求一张表只对应一个Partition,但是,MYSQL Source Connector仍然提供了写入多Partition的能力,来满足某些需要牺牲消息保序性来提升性能的场景
  • 提供基于指定Bin Log文件、指定位置或GTID来重启任务的能力,保证异常场景下数据不丢失
  • 支持多种复杂数据类型
  • 支持捕获DDL事件

4.3.3 PostgreSQL Source Connector

PostgreSQL的逻辑解码特性允许我们解析提交到事务日志的变更事件,这需要通过输出插件来处理这些变更。PostgreSQL Source Connector使用pgoutput插件来完成这项工作。pgoutput插件是PostgreSQL 10+提供的标准逻辑解码插件,无需安装额外的依赖包。

PostgreSQL Source Connector和MYSQL Source Connector除了部分数据类型的区别外其他功能基本一致。

4.4 Sink Connectors

MRS提供多种Sink Connector,可以从Kafka中拉取数据并推送到不同的目标存储中。现在支持的Sink Connector有:

  • HDFS Sink Connector
  • OBS Sink Connector
  • Hudi Sink Connector
  • ClickHouse Sink Connector
  • Hive Sink Connector

其中Hudi Sink Connector和ClickHouse Sink Connector也支持通过Flink/Spark应用来调度运行。

4.5 表过滤

当我们想在一个CDL Job中同时捕获多张表的变更时,我们可以使用通配符(正则表达式)来代替表名,即允许同时捕获名称满足规则的表的CDC事件。当通配符(正则表达式)不能严格匹配目标时,就会出现多余的表被捕获。为此,CDL提供表过滤功能,来辅助通配符模糊匹配的场景。当前CDL同时支持白名单和黑名单两种过滤方式。

4.6 统一数据格式

MRS CDL对于不同的数据源类型如Oracle、MYSQL、PostgreSQL采用了统一的消息格式存储在Kafka中,后端消费者只需解析一种数据格式来进行后续的数据处理和传输,避免了数据格式多样导致后端开发成本增加的问题。

4.7 任务级的日志浏览

通常境况下,一个CDL Connector会运行多个Task线程来进行CDC事件的抓取,当其中一个Task失败时,很难从海量的日志中抽取出强相关的日志信息,来进行进一步的分析。

为了解决如上问题,CDL规范了CDL Connector的日志打印,并且提供了专用的REST API,用户可以通过该API一键获取指定Connector或者Task的日志文件。甚至可以指定起止时间来进一步缩小日志查询的范围。

4.8 监控

MRS CDL提供REST API来查询CDL服务所有核心部件的Metric信息,包括服务级、角色级、实例级以及任务级。

4.9 应用程序错误处理

在业务运行过程中,常常会出现某些消息无法发送到目标数据源的情况,我们把这种消息叫做错误记录。在CDL中,出现错误记录的场景有很多种,比如:

  • Topic中的消息体与特定的序列化方式不匹配,导致无法正常读取
  • 目标存储中并不存在消息中所存储的表名称,导致消息无法发送到目标端

为了处理这种问题,CDL定义了一种“dead letter queue”,专门用于存储运行过程中出现的错误记录。本质上“dead letter queue”是由Sink Connector创建的特定的Topic,当出现错误记录时,由Sink Connector将其发往“dead letter queue”进行存储。

同时,CDL提供了REST API来供用户随时查询这些错误记录进行进一步分析,并且提供Rest API可以允许用户对这些错误记录进行编辑和重发。

图6 CDL Application Error Handling

5 性能

CDL使用了多种性能优化方案来提高吞吐量:

  • Task并发

我们利用Kafka Connect提供的任务并行化功能,其中Connect可以将作业拆分为多个任务来并行复制数据,如下所示:

图7 Task并发

  • 使用Executor线程并行化执行任务

由于Log Miner,Bin Log等数据复制技术的限制,我们的Source Connector只能顺序的捕获CDC事件,因此,为了提高性能,我们将这些CDC事件先缓存到内存队列中,然后使用Executor线程并行的处理它们。这些线程会先从内部队列中读取数据,然后处理并且推送到Kafka中。

图8 Executor线程并发

6 总结

MRS CDL是数据实时入湖场景下重要的一块拼图,我们仍然需要在数据一致性、易用性、多组件对接以及性能提升等场景需要进一步扩展和完善,在未来能够更好的为客户创造价值。

点击关注,第一时间了解华为云新鲜技术~

详解MRS CDL整体架构设计的更多相关文章

  1. Netty4详解三:Netty架构设计(转)

    http://blog.csdn.net/suifeng3051/article/details/28861883?utm_source=tuicool&utm_medium=referral ...

  2. 万字详解TDengine 2.0整体架构设计思路

    ​导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...

  3. 深度解读MRS IoTDB时序数据库的整体架构设计与实现

    [本期推荐]华为云社区6月刊来了,新鲜出炉的Top10技术干货.重磅技术专题分享:还有毕业季闯关大挑战,华为云专家带你做好职业规划. 摘要:本文将会系统地为大家介绍MRS IoTDB的来龙去脉和功能特 ...

  4. RocketMQ详解(四)核心设计原理

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  5. Hadoop详解(06) - Yarn平台架构和资源调度器

    Hadoop详解(06) - Yarn平台架构和资源调度器 Yarn平台架构 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程 ...

  6. [转]Android App整体架构设计的思考

    1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...

  7. 基于Hadoop的大数据平台实施记——整体架构设计[转]

    http://blog.csdn.net/jacktan/article/details/9200979 大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底 ...

  8. 基于Hadoop的大数据平台实施记——整体架构设计

    大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底是否适用于您的组织,至少在互联网上已经被吹嘘成无所不能的超级战舰.好像一夜之间我们就从互联网时代跳跃进了大 ...

  9. Java-异常机制详解以及开发时异常设计的原则要求

    Java-异常机制详解以及开发时异常设计的原则要求 http://blog.csdn.net/Jack__Frost/article/details/52760930?locationNum=6

  10. Dubbo源码剖析一之整体架构设计

    Dubbo基础二之架构及处理流程概述 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中进行Dubbo职能上的简单介绍,下面就其内部进行详细探究: 1.Dubbo调用关系 这个图是不是很熟 ...

随机推荐

  1. Java文件与IO流

    首先我们要清楚什么是流,正如其名,很形象,流就是像水一样的东西,具有方向性,在java中 ,流大概就是类 接下来,我们要对输入输出流有一个基本认识,什么是输入输出流呢? 输入输出明显需要一个参照,而这 ...

  2. .Net Core 3.1升级 .Net 5后出现代码错误 rzc generate exited with code 1.

    安装.Net 5后出现错误,错误定位到了CodeGeneration相关的文件,找了半天也不知道哪里的问题. 升级类库,清理解决方案,删除obj.bin文件夹什么的卵用没有. 最后发现升级.Net 5 ...

  3. Spring系列:Spring6简介和基本使用

    一.概述 1.1 特点 Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由"Spring 之父"Rod Johnson 提出并创立,其目的是用于简化 J ...

  4. uni-app框架开发app发布流程

    uni-app框架开发app发布流程 1.首先公司申请软著 步骤:申请软著详细流程 - 阿长*长 - 博客园 (cnblogs.com) 一.安卓端 1,点击发行>原生-app云打包 正式包和自 ...

  5. 如何理解微服务体系结构中的 CQRS

    本文翻译自 How To Understand CQRS In Microservices Architecture,原作者 OLEKSII. 问题描述 在典型的软件应用程序中,有一个负责写入和读取操 ...

  6. 使用 PyTorch 完全分片数据并行技术加速大模型训练

    本文,我们将了解如何基于 PyTorch 最新的 完全分片数据并行 (Fully Sharded Data Parallel,FSDP) 功能用 Accelerate 库来训练大模型. 动机 随着机器 ...

  7. 数据库是mysql,使用DBeaver的SQL编辑器执行sql脚本文件时,报错:No active connection 。

    遇到这种问题,多半是因为没有与数据库关联 具体操作点击右键,选择与数据库关联 结果如下 出现这个就好了.

  8. Kernel Memory 入门系列:生成并获取文档摘要

    Kernel Memory 入门系列:生成并获取文档摘要 前面在RAG和文档预处理的流程中,我们得到一个解决方案,可以让用户直接获取最终的问题答案. 但是实际的业务场景中,仍然存在一些基础的场景,不需 ...

  9. 万界星空科技MES系统中的生产调度流程

      MES系统生产调度的目标是达到作业有序.协调.可控和高效的运行效果,作业计划的快速生成以及面向生产扰动事件的快速响应处理是生产调度系统的核心和关键. 为了顺利生成作业计划,需要为调度系统提供完整的 ...

  10. 关于 K8s 的一些基础概念整理

    〇.前言 Kubernetes,将中间八个字母用数字 8 替换掉简称 k8s,是一个开源的容器集群管理系统,由谷歌开发并维护.它为跨主机的容器化应用提供资源调度.服务发现.高可用管理和弹性伸缩等功能. ...