flink cdc原理与使用

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://xiahunao.cn/news/2799314.html

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

相关文章

OpenCvSharp随机数与绘制文本用法

目的 RNG函数使用 PutText函数使用 GetTextSize函数使用 RNG随机数生成 生成伪随机数。注意,当初始的state一样时,每次生成的随机数序列是一样的。 PutText绘制文本 函数说明:将文本绘制到图像上(不支持中文)。无绘制的文本用问号代替。 …

[PDF编辑精选] 适用于 Windows 10/11 的PDF 编辑器列表

PDF 是 Portable Document Format 的缩写,是 Adob​​e 创建的一种文件格式,用于在保留格式的情况下轻松查看和共享——无论查看文档的任何人使用的软件或操作系统如何。然而,与PDF文档相关的一个主要问题出现了,那就是编辑文档内…

SpringSecurity安全框架

我们使用这个springSecurity安全框架,作用是认证,授权,将用户的权限和对应的资源进行绑定,默认的是在内存中保存的,实际开发中,是需要根据项目业务的需求对某些方法进行重写,使数据库中权限对应的资源进行绑定,就是查看当前登录的用户所扮演的角色,该角色有哪些权限 授权 1内…

什么是HTTP代理,socks5代理?它们的区别是什么?

什么是HTTP代理? HTTP代理是一种常见的网络代理方式,它通过在客户端和服务器之间建立一个中间层,将客户端的请求转发给服务器,并将服务器的响应返回给客户端。HTTP代理通常用于访问受限制的网站,或者在网络中隐藏客户…

【2.3深度学习开发任务实例】(1)神经网络模型的特点【大厂AI课学习笔记】

从本章开始,我把标题的顺序变了一下,大厂AI课笔记,放到后面。因为我发现App上,标题无法显示完全。 从本章开始,要学习深度学习开发任务的全部过程了。 我们将通过小汽车识别赛道上的标志牌,给出检测框&am…

UE5 摄像机晃动

1.新建camerashake蓝图类 命名为 晃动 2.调节相关参数 3.打开关卡序列 给摄像机添加 晃动 动画 4.播放

uniapp微信小程序-项目实战修改密码

图标是使用uview里面的图标&#xff0c;icfont也可以 以下是所有代码 <template><view><!-- 密码三个 --><view class"password" v-for"(item,index) in userList"><view class"contentuser"><view class&qu…

从源码解析Kruise(K8S)原地升级原理

从源码解析Kruise原地升级原理 本文从源码的角度分析 Kruise 原地升级相关功能的实现。 本篇Kruise版本为v1.5.2。 Kruise项目地址: https://github.com/openkruise/kruise 更多云原生、K8S相关文章请点击【专栏】查看&#xff01; 原地升级的概念 当我们使用deployment等Wor…

区块链游戏解说:什么是 Planet IX

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;Planet IX Dashboard 什么是 Planet IX Planet IX&#xff0c;一个由原生 IX TOKEN 推动的 Web3 玩赚平台。作为一款 GameFi 策略游戏&#xff0c; Planet IX 上的每项资…

抠人像可抠头发丝的模型-软语义分割(Semantic Human Matting)

软语义分割&#xff08;Semantic Human Matting&#xff09; 一、Semantic Human Matting原理二、Semantic Human Matting 项目文件介绍三、数据集介绍及下载地址四、训练流程五、项目代码下载地址 哔哩哔哩详细解说&#xff08;进主页看全集&#xff09;&#xff1a; https://…

极狐GitLab 如何重置管理员密码

在之前安装极狐GitLab 的文章中提到&#xff0c;极狐GitLab 安装成功后&#xff0c;初始登录密码会放在 /etc/gitlab/initial_root_password 文件下&#xff0c;用户可以使用初始用户名 root 及文件内的初始密码即可登录极狐GitLab 实例。 但是有些情况下&#xff0c;可能会发…

Sui主网升级至V1.18.1版本

Sui主网现已升级至V1.18.1版本&#xff0c;同时Sui协议升级至36版本。其他升级要点如下所示&#xff1a; #15794 解析错误不再停止编译&#xff0c;并且后续编译阶段的诊断信息也可能包含在编译结果中&#xff0c;所以开发者可能会看到比以前更多的编译器诊断信息。 #12337 …

基于springboot + vue实现的前后端分离-酒店管理系统

项目介绍 基于springboot vue实现的酒店管理系统一共有酒店管理员和用户这两种角色。 管理员功能 登录&#xff1a;管理员可以通过登录功能进入系统&#xff0c;确保只有授权人员可以访问系统。用户管理&#xff1a;管理员可以添加、编辑和删除酒店的用户&#xff0c;包括前…

线性代数:向量组及其线性相关性

目录 向量组 向量组的线性表示 向量组等价 相关定理 向量组的线性相关性 定理 向量组 向量组的线性表示 向量组等价 相关定理 向量组的线性相关性 定理

物联网在智慧景区中的应用:提升游客体验与运营效率

目录 一、物联网技术概述 二、物联网在智慧景区中的应用 1、智能门票系统 2、智能导览系统 3、智能安全监控系统 4、智能环保系统 三、物联网在智慧景区中提升游客体验 1、提高游览便捷性 2、个性化服务体验 3、提升游客安全感 四、物联网在智慧景区中提升运营效率 …

职业技能鉴定服务中心前端静态页面(官网+证书查询)

有个朋友想做职业技能培训&#xff0c;会发证书&#xff0c;证书可以在自己网站可查。想做一个这样的网站&#xff0c;而且要特别土&#xff0c;一眼看上去像xxx官方网站&#xff0c;像jsp .net技术开发的网站。用htmlcssjquery还原了这样子一个前端页面&#xff0c;这里分享给…

【嵌入式学习】QT-Day2-Qt基础

1> 思维导图 https://lingjun.life/wiki/EmbeddedNote/20QT 2>登录界面优化 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff…

聚道云软件连接器:高科技企业财务自动化,提升效率准确性!

客户介绍&#xff1a; 某互联信息技术有限公司是一家专业从事信息技术服务的高科技企业&#xff0c;在业内享有较高的知名度和影响力。近年来&#xff0c;公司业务快速发展&#xff0c;对信息化建设提出了更高的要求。 客户痛点&#xff1a; 在传统情况下&#xff0c;该公司的…

CSS3中盒子居中

&#xff08;1&#xff09;利用定位&#xff08;子绝父相&#xff09;、margin-left、和margin-top实现 &#xff08;2&#xff09;利用定位&#xff08;子绝父相&#xff09;、transfrom属性实现 &#xff08;3&#xff09;利用flex布局实现盒子居中

C#算法(12)—对图像像素做X/Y方向的偏移

我们在上位机开发领域有时候需要对获取的图像的像素做整体的偏移,比如所有像素在X方向上偏移几个像素,或者所有像素在Y方向上偏移几个像素,本文就是开发了像素整体偏移算法来解决这个问题。 public partial class Form1 : Form{public Form1(){InitializeComponent()