flink cdc原理与使用

news2024/11/16 18:01:57

flink cdc原理与使用

  • 1 cdc 介绍
    • 1.1 cdc简介与对比
    • 1.2 基于日志的 CDC 方案介绍
  • 2 基于 Flink SQL CDC 的数据同步方案实践
    • 2.1 案例 1 : Flink SQL CDC + JDBC Connector
    • 2.2 案例 2 : CDC Streaming ETL
    • 2.3 案例 3 : Streaming Changes to Kafka
  • 3 Flink SQL CDC 的更多应用场景
  • 4 Flink SQL CDC : 打通更多场景

1 cdc 介绍

1.1 cdc简介与对比

CDC 是(Change Data Capture 变更数据获取)的简称。

核心思想是,监测并捕获数据库的变动(包括数据 或 数据表的插入 INSERT、更新 UPDATE、删除 DELETE 等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅 及消费。

像是常用来同步mysql binlog的canal 就是一个cdc工具。

CDC 全称是 Change Data Capture ,它是一个比较广义的概念,只要能捕获变更的数据,我们都可以 称为 CDC 。业界主要有基于查询的 CDC 和基于日志的 CDC ,可以从下面表格对比他们功能和差 异点。

在这里插入图片描述
经过以上对比,我们可以发现基于日志 CDC 有以下这几种优势:

  • · 能够捕获所有数据的变化,捕获完整的变更记录。在异地容灾,数据备份等场景中得到广泛应用, 如果是基于查询的 CDC 有可能导致两次查询的中间一部分数据丢失
  • · 每次 DML 操作均有记录无需像查询 CDC 这样发起全表扫描进行过滤,拥有更高的效率和性能, 具有低延迟,不增加数据库负载的优势
  • · 无需入侵业务,业务解耦,无需更改业务模型
  • · 捕获删除事件和捕获旧记录的状态,在查询 CDC 中,周期的查询无法感知中间数据是否删除
    在这里插入图片描述
    在实时性、吞吐量方面占优,如果数据源是 MySQL、PostgreSQL、MongoDB 等常见的数据库实现,
    建议使用 Debezium 来实现变更数据的捕获(下图来自 Debezium 官方文档)。如果使用的只有 MySQL,则可以用 Canal。
    在这里插入图片描述

1.2 基于日志的 CDC 方案介绍

从 ETL 的角度进行分析,一般采集的都是业务库数据,这里使用 MySQL 作为需要采集的数据库, 通过 Debezium 把 MySQL Binlog 进行采集后发送至 Kafka 消息队列,然后对接一些实时计算引擎 或者 APP 进行消费后把数据传输入 OLAP 系统或者其他存储介质。
Flink 希望打通更多数据源,发挥完整的计算能力。我们生产中主要来源于业务日志和数据库日志, Flink 在业务日志的支持上已经非常完善,但是在数据库日志支持方面在 Flink 1.11 前还属于一片空 白,这就是为什么要集成 CDC 的原因之一。
Flink SQL 内部支持了完整的 changelog 机制,所以 Flink 对接 CDC 数据只需要把 CDC 数据转换 成 Flink 认识的数据,所以在 Flink 1.11 里面重构了 TableSource 接口,以便更好支持和集成 CDC。
在这里插入图片描述

重构后的 TableSource 输出的都是 RowData 数据结构,代表了一行的数据。在 RowData 上面会有 一个元数据的信息,我们称为 RowKind 。RowKind 里面包括了插入、更新前、更新后、删除,这 样和数据库里面的 binlog 概念十分类似。通过 Debezium 采集的 JSON 格式,包含了旧数据和新数 据行以及原数据信息,op 的 u 表示是 update 更新操作标识符,ts_ms 表示同步的时间戳。因此, 对接 Debezium JSON 的数据,其实就是将这种原始的 JSON 数据转换成 Flink 认识的 RowData。 选择 Flink 作为 ETL 工具。
当选择 Flink 作为 ETL 工具时,在数据同步场景,如下图同步结构:
在这里插入图片描述
通过 Debezium 订阅业务库 MySQL 的 Binlog 传输至 Kafka ,Flink 通过创建 Kafka 表指定 format 格式为 debezium-json ,然后通过 Flink 进行计算后或者直接插入到其他外部数据存储系统, 例如图中的 Elasticsearch 和 PostgreSQL。
在这里插入图片描述
但是这个架构有个缺点,我们可以看到采集端组件过多导致维护繁杂,这时候就会想是否可以用 Flink SQL 直接对接 MySQL 的 binlog 数据呢,有没可以替代的方案呢? 答案是有的!经过改进后结构如下图:
在这里插入图片描述
社区开发了 flink-cdc-connectors 组件,这是一个可以直接从 MySQL、PostgreSQL 等数据库直接读
取全量数据和增量变更数据的 source 组件。目前也已开源,开源地址: https://github.com/ververica/flink-cdc-connectors
flink-cdc-connectors 可以用来替换 Debezium+Kafka 的数据采集模块,从而实现 Flink SQL 采集+计 算+传输(ETL)一体化,这样做的优点有以下:

  •  开箱即用,简单易上手
  •  减少维护的组件,简化实时链路,减轻部署成本
  •  减小端到端延迟
  •  Flink 自身支持 Exactly Once 的读取和计算
  •  数据不落地,减少存储成本
  •  支持全量和增量流式读取
  •  binlog 采集位点可回溯

2 基于 Flink SQL CDC 的数据同步方案实践

2.1 案例 1 : Flink SQL CDC + JDBC Connector

这个案例通过订阅我们订单表(事实表)数据,通过 Debezium 将 MySQL Binlog 发送至 Kafka, 通过维表 Join 和 ETL 操作把结果输出至下游的 PG 数据库。
在这里插入图片描述

2.2 案例 2 : CDC Streaming ETL

模拟电商公司的订单表和物流表,需要对订单数据进行统计分析,对于不同的信息需要进行关联后续 形成订单的大宽表后,交给下游的业务方使用 ES 做数据分析,这个案例演示了如何只依赖 Flink 不 依赖其他组件,借助 Flink 强大的计算能力实时把 Binlog 的数据流关联一次并同步至 ES 。
在这里插入图片描述
例如如下的这段 Flink SQL 代码就能完成实时同步 MySQL 中 orders 表的全量+增量数据的目的。

CREATE TABLE orders ( order_id INT, order_date TIMESTAMP(0), customer_name STRING, price DECIMAL(10, 5), product_id INT, order_status BOOLEAN ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'root', 'p@assw@ord' = '1@23456', 'database-name' = 'mydb', 'table-name' = 'orders' );SELECT * FROM orders

2.3 案例 3 : Streaming Changes to Kafka

下面案例就是对 GMV 进行天级别的全站统计。包含插入/更新/删除,只有付款的订单才能计算进入 GMV ,观察 GMV 值的变化。
在这里插入图片描述

3 Flink SQL CDC 的更多应用场景

Flink SQL CDC 不仅可以灵活地应用于实时数据同步场景中,还可以打通更多场景提供给用户选择。 Flink 在数据同步场景中的灵活定位

  •  如果已有 Debezium/Canal + Kafka 的采集层 (E),可以使用 Flink 作为计算层 (T) 和传输层 (L)
  •  也可用 Flink 替代 Debezium/Canal ,由 Flink 直接同步变更数据到 Kafka,Flink 统一 ETL 流程
  •  如果不需要 Kafka 数据缓存,可以由 Flink 直接同步变更数据到目的地,Flink 统一 ETL 流程

4 Flink SQL CDC : 打通更多场景

  •  实时数据同步,数据备份,数据迁移,数仓构建 优势:丰富的上下游(E & L),强大的计算(T),易用的 API(SQL),流式计算低延迟
  •  数据库之上的实时物化视图、流式数据分析
  •  索引构建和实时维护
  •  业务 cache 刷新
  •  审计跟踪
  •  微服务的解耦,读写分离
  •  基于 CDC 的维表关联

下面介绍一下为何用 CDC 的维表关联会比基于查询的维表查询快。

  • 基于查询的维表关联
    在这里插入图片描述
    目前维表查询的方式主要是通过 Join 的方式,数据从消息队列进来后通过向数据库发起 IO 的请 求,由数据库把结果返回后合并再输出到下游,但是这个过程无可避免的产生了 IO 和网络通信的消 耗,导致吞吐量无法进一步提升,就算使用一些缓存机制,但是因为缓存更新不及时可能会导致精确 性也没那么高。

  • ■ 基于 CDC 的维表关联
    在这里插入图片描述
    我们可以通过 CDC 把维表的数据导入到维表 Join 的状态里面,在这个 State 里面因为它是一个分 布式的 State ,里面保存了 Database 里面实时的数据库维表镜像,当消息队列数据过来时候无需再 次查询远程的数据库了,直接查询本地磁盘的 State ,避免了 IO 操作,实现了低延迟、高吞吐,更 精准。

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

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

相关文章

Java EE企业级应用开发(SSM)第10章

第10章MyBatis核心配置及动态SQL 一.预习笔记 1.第九章的细节处理 1-1.mappers标签中的配置 1-2.jdbc属性文件的配置 1-3.包的别名配置 2.Mybatis核心配置文件 2-1:settings标签(P145-146中的表10-1) 2-2.类型别名 3.Mybatis映射文件 3-1…

项目集管理绩效领域

项目集管理绩效领域是对活动或职能相关领域的补充分组,这些活动或职能在项目集管理工作的 整个范围内,专门描述和区分一个绩效领域中的活动。 本章包括: 项目集管理绩效领域的定义项目集管理绩效领域的交互组织战略、项目组合管理和项目集管…

vue 水印组件

效果图展示 Watermark 参数说明类型默认值版本width水印的宽度,content 的默认值为自身的宽度number120height水印的高度,content 的默认值为自身的高度number64rotate水印绘制时,旋转的角度,单位 number-22zIndex追加的水印元素…

24.eslint

eslint是约束代码写法的插件,比如组件的命名必须要用驼峰命名这种 eslint官网 检测并修复 JavaScript 代码中的问题。 - ESLint - 插件化的 JavaScript 代码检查工具 目录 1 vue-cli的eslint 2 标准规则 2.1 不能连续出现两个空行 2.2 结尾必须有空行 2.3…

深入了解Dubbo SPI 工作机制——@Activate (5)

在上一篇Dubbo 基于xml文件分析主流程源码 (4)_chen_yao_kerr的博客-CSDN博客中, 我们已经初步了解了Dubbo SPI的 key - value 结构。接下来将会继续分享Dubbo SPI其他功能的使用方式,并且从源码的角度去一谈究竟。 Activate注解 参数名 …

【数据结构】链表OJ:力扣141.环形链表、142.环形链表II

今天要分享的关于链表的题目是环形链表 目录 题目141. 环形链表 - 力扣(LeetCode) 题解 关于快慢指针的深入研究 题目2:142. 环形链表 II - 力扣(LeetCode) 题解 以下是题目链接 141. 环形链表 - 力扣&#xff…

塑料回收---未来化工行业的新兴增长领域

大量的旧塑料被浪费 从南极洲到北极,在原始海岸线上冲刷的塑料废物,以及太平洋上巨大的塑料废物浮岛,得到了媒体的广泛报道,并促成了消费者消费意识发生转变。 研究表明,大多数废旧塑料被送往垃圾填埋场和焚烧&#…

Go语言设计模式之责任链模式

其实很多人不知道,责任链模式是我们工作中经常遇到的模式,特别是web后端工程师,我们工作中每时每刻都在用:因为市面上大部分的web框架的过滤器基本都是基于这个设计模式为基本模式搭建的。 1.模式介绍 我们先来看一下责任链模式(Chain Of Responsibility Design Pattern…

react实现点击获取json对象的jsonPath

准备 安装 react-json-view:npm install --save react-json-view 可参考的一些开源库:react-json-path-picker,json-path-picker 线上工具:jsonpath tool JsonPath JsonPath官方文档 用来解析多层嵌套的json数据。JsonPath 是一…

8分钟的面试,我直呼太变态了......

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…

08 FPGA—计数器与分频器的应用

1. 理论 时序逻辑电路中最基本的单元—寄存器,我们可以使用寄存器来做计数器。基本上关于时间的设计都离不开计数器。 计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能。计数器一般都是从 0 开…

JSON-框架的具体使用

JSON-框架的具体使用 非 SpringBoot 项目 Jackson Jackson 是另一个流行的JSON序列化和反序列化库,具有以下特点 速度快:Jackson 采用了高效的JSON解析算法和字节码生成技术,使得其序列化和反序列化速度非常快。支持全类型序列化&#xff1…

V8 过去版本的性能提升汇总

(预测未来最好的方法就是把它创造出来——尼葛洛庞帝) V8 官方链接 NodeJs8.3之前的代码优化建议 NodeJs8.3版本之后的turbofan虚拟机引擎 编写性能更高的JavaScript代码 chromium 优化博客 chrom v8版本发布路线图 V8 是 Google 的开源高性能 JavaScri…

unity 实现水的波纹效果

之前的实现过这个效果,可惜没有记笔记,所以现在有点遗忘,连多个波纹一起在水面上实现的效果都忘记了,所以,查看了下之前实现的代码,现在再记一下笔记。 基础的波纹效果 要实现波纹,首先要知道…

技术转管理,先来试试管理好项目

今天分享的主题是:如果你想技术转管理,先来试试管好一个项目 技术转管理,是很多技术人员的梦想,这也是30多岁之前还在做技术的人,也会对自己常常发出居安思危的意识表现,所以经常有人问我,怎么样…

chatGPT润色中英论文软件-文章修改润色器

chatGPT可以润色英文论文吗? ChatGPT可以润色英文论文,它具备自动纠错、自动完善语法和严格全面的语法、句法和内容结构检查等功能,可以对英文论文进行高质量的润色和优化。此外,ChatGPT还支持学术翻译润色、查重及语言改写等服务…

Java每日一练(20230510) 生成器类、螺旋矩阵II、删除链表的重复元素II

目录 1. 定义一个类Generator 🌟🌟 2. 螺旋矩阵 II 🌟🌟 3. 删除排序链表中的重复元素 II 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日…

Linux 设备树

1 什么是设备树? 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如 CPU 数量…

【Proteus仿真】| 05——问题记录

系列文章目录 【Proteus仿真】| 01——软件安装 【Proteus仿真】| 02——基础使用 【Proteus仿真】| 03——超详细使用教程 【Proteus仿真】| 04——绘制原理图模板 【Proteus仿真】| 05——问题记录 文章目录 前言1、51单片机仿真2、stm32仿真1. stm32 adc 采集电压一直为0 3、…

显卡3080设备CentOS 7.9 环境安装最新anconda、tensorflow-gpu 、cudatoolkit、cudnn、 python

目标:使用3080显卡搭建环境 系统安装 显卡驱动安装: 安装anconda 安装 python 安装 :cuda 安装:cudnn 安装 :tensorflow 一:系统安装:详见历史文档 二:显卡驱动安装:详见历史 三:整…