Flink CDC 原理

简介

Flink CDC(Change Data Capture)是 Apache Flink 提供的一个变更数据捕获工具集。它可以监控数据库的变更,并将这些变更实时地以流的形式提供给下游系统,这些变更包括插入、更新和删除操作。

Flink CDC 适用于需要实时数据管道和数据流处理的场景,如实时数据分析、数据仓库更新、缓存同步、ETL 过程、微服务架构中的数据一致性等。

官网简介:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

和Flink 什么区别?

Flink 是一个更通用的流处理平台,而 Flink CDC 是构建在 Flink 之上,专注于变更数据捕获和流式数据同步的工具集。

Apache Flink 是一个开源的流处理框架,用于实时数据流的处理和分析。Flink 提供了用于构建分布式流处理应用的丰富API,包括数据流编程模型、窗口操作、状态管理、时间语义等。Flink 能够以极高的吞吐量和低延迟运行复杂的数据分析任务,并且保证数据流的一致性和准确性。Flink 也支持批处理,因此它可以作为批处理和流处理的统一引擎。

Flink CDC 是 Flink 社区提供的变更数据捕获工具集,它允许用户捕获数据库的增量变化,并将这些变化实时地以流的形式提供给下游系统。Flink CDC 工具可以监控数据库的变更,并将这些变更作为事件流输出,这些事件流可以被 Flink 流处理作业所消费。

联系

  1. Flink CDC 是基于 Flink 的生态系统构建的,它利用 Flink 的流处理能力来捕获和分发数据库的变更数据。
  2. Flink CDC 产生的变更数据流可以被 Flink 流处理作业直接消费,实现近实时的数据同步和流处理。
  3. Flink CDC 与 Flink 的集成提供了端到端的数据流解决方案,从数据源的变更捕获到数据的流式处理。

区别

  1. 功能定位:Flink 是一个通用的流处理框架,适用于各种流处理和批处理场景。Flink CDC 专注于捕获和分发数据库的变更数据。
  2. 使用场景:Flink 可以用于构建广泛的数据处理应用,而 Flink CDC 主要用于数据同步、流式ETL、实时数据仓库等需要数据库变更捕获的场景。
  3. 实现细节:Flink CDC 利用了 Flink 的内部机制,如状态后端和检查点机制,来保证变更数据的一致性和准确性。但它为数据库变更捕获提供了特定的连接器和API。

特点

  1. 实时性:
    • Flink CDC 利用数据库的日志文件(如 MySQL 的 binlog)来捕获数据变更事件,这意味着它可以几乎无延迟地获取到数据变化。
    • 通过流处理框架 Apache Flink, 变更数据可以快速被处理和传输到下游系统,适合需要低延迟反应的业务场景。
  2. 支持多种数据库:
    • 目前Flink CDC 支持广泛使用的关系型数据库如 MySQL,PostgreSQL, MongoDB,Oracle,SQL Server 等的支持。
    • 这种广泛的支持使得 Flink CDC 可以适用于多种存储系统背景下的实时数据同步和分析需求。
  3. 容错性:
    • 结合 Apache Flink 的状态管理和检查点机制(Checkpointing),Flink CDC 能够在发生故障时保证数据处理的一致性并恢复到正确状态。
    • 这是企业级应用中非常重要的特征,确保了数据处理任务在面对硬件故障或网络问题时依然能够可靠运行。
  4. 灵活性与易用性:
    • 用户可以通过简单配置就能启动一个CDC任务,无需编写复杂代码。
    • 支持自定义Deserialization schema来解析变更事件,用户可以根据自己需求进行定制化开发。
  5. 扩展性:
    • 由于基于 Apache Flink 实现,Flink CDC 自然继承了 Flink 的可伸缩架构。用户可以根据负载增加或减少任务节点。
    • 支持动态表功能(Dynamic Table),允许用户在不停止现有应用程序情况下修改表结构。
  6. 集成性:
    • 可以与Apache Kafka、Elasticsearch等其他大数据组件轻松集成,为复杂的大数据生态系统提供强大支撑。
    • 提供了连接器(Connector)接口,使得将CDC与其他外部系统连接起来变得简单快捷。
  7. 开源社区活跃
    • 作为 Apache 软件基金会项目之一,Flink 和其CDC组件拥有活跃且庞大的开发者社区。这意味着问题和bug通常能够快速被响应和解决,并且不断有新功能被添加进来。

增量快照读取

Flink CDC的增量快照读取机制是在Flink CDC 2.x版本中引入的。这一机制允许Flink CDC以更高效的方式进行数据捕获,它通过将数据表分割成多个chunk(分片),并行地对这些chunk进行快照读取,从而提高了读取速度和整体性能。

  1. 并发读取:支持多个并发读取任务,提高了数据捕获的速度。
  2. Chunk级别的checkpoint:在每个chunk读取完成后进行一次checkpoint,提高了故障恢复的准确性和效率。
  3. 全量增量无锁读取算法:不需要数据库锁权限,降低了对数据库的依赖和权限要求。

此外,Flink CDC 2.x版本还引入了Exactly-Once语义,确保数据处理结果的精确一次性,并且支持动态加表和无主键表的处理。

在Flink CDC 2.3版本中,除了对MySQL CDC的优化,还增加了对Db2、MongoDB和Oracle CDC的支持,并且这些连接器也都接入了增量快照框架,从而提供了无锁读取、并行读取和断点续传的能力。

使用示例

假设你需要从 MySQL 数据库捕获变更,并将变更数据流转发到 Kafka。以下是一个使用 Flink CDC 的简单代码示例:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.connector.jdbc.JdbcExecutionOptions;
import org.apache.flink.connector.jdbc.JdbcSink;
import com.ververica.cdc.connectors.mysql.MySqlSource;
import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;

public class FlinkCdcDemo {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
            .hostname("your-db-hostname")
            .port(3306)
            .databaseList("your-database-name")
            .tableList("your-database-name.your-table-name") // 可以更精确地指定表名
            .username("your-db-user")
            .password("your-db-password")
            .deserializer(new JsonDebeziumDeserializationSchema()) // 使用 JSON 格式解析数据
            .build();

        DataStream<String> stream = env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source");

        stream.addSink(new FlinkKafkaProducer<String>(
            "your-kafka-topic",
            new SimpleStringSchema(),
            PropertiesUtil.getKafkaProperties()
        ));

        env.execute("Flink CDC MySQL to Kafka");
    }
}

原理

Flink CDC 的原理基于变更数据捕获(Change Data Capture)技术,其核心思想是监测并捕获数据库的增量变化,如新增、修改和删除操作,然后将这些变化实时地以流的形式提供给下游系统。

工作原理可以概括为以下几个步骤:

  1. 数据捕获:CDC 引擎通过 Source Connector 从数据源中捕获变更数据。这些变更数据可以是新增、更新、删除等操作对数据的修改,通常以日志形式存在于数据源中。

  2. 数据解析:CDC 引擎对捕获的变更数据进行解析,将其转换成 Flink 的数据流格式。这包括解析变更操作的类型、影响的数据记录以及具体的变更内容等信息。

  3. 数据转换:在解析的基础上,CDC 引擎可能会对变更数据进行一些额外的转换操作,以适应目标系统或处理逻辑的要求。例如,将数据库中的行数据转换成 Flink 中的数据流格式。

  4. 数据传输:转换后的数据流被发送到 Flink 流式处理框架中进行进一步的实时处理和分析。这可以包括各种流处理操作,如数据过滤、聚合、计算等。

  5. 数据写入:处理后的数据流最终被 Sink Connector 写入到目标系统或存储介质中。这可以是将数据写入到文件系统、数据库表、消息队列等,以供后续的查询、分析或其他用途。

MySQL CDC Connector 实现原理:

1、Flink 的 MySQL CDC Connector 使用 MySQL 的二进制日志(Binlog)来捕获数据变更。Binlog 是 MySQL 中记录对数据进行更改的二进制日志文件。

2、Connector 连接到 MySQL 的 Binlog,监控其中的变更事件。通过解析 Binlog,Connector 可以了解到数据库中发生的插入、更新和删除等操作。

3、Connector 将捕获到的变更事件转换为 Flink DataStream,使其成为 Flink 流处理应用程序的输入。

PostgreSQL CDC Connector 实现原理:

1、Flink 的 PostgreSQL CDC Connector 使用 PostgreSQL 的逻辑复制机制来捕获数据变更。

2、Connector 创建一个 PostgreSQL 的逻辑复制插槽(replication slot),然后订阅这个插槽以获取数据库中的变更事件。

3、通过逻辑复制插槽,Connector 可以获取到插入、更新和删除等操作的变更事件,并将其转换为 Flink DataStream。

Debezium Connector 实现原理:

1、Debezium 是一个独立的开源 CDC 连接器,支持多种数据库。Flink 可以通过 Flink 的 Kafka Connector 与 Debezium 集成。

2、Debezium 连接到数据库的事务日志,并将变更事件发送到 Apache Kafka 中。Flink 使用 Flink 的 Kafka Connector 从 Kafka 中读取这些变更事件。

3、通过与 Debezium 集成,Flink 能够实现对多种数据库的 CDC 支持,包括 MySQL、PostgreSQL、MongoDB等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用matplotlib和KNeighborsClassifier,进行DBSACN聚类算法

代码&#xff1a; # -*- coding: utf-8 -*- """ Created on Sat May 11 10:23:50 2024author: admin """ # 调用库 import numpy as np import matplotlib.pyplot as plt # 调用人工智能模型库 from sklearn.neighbors import KNeighborsClassi…

自定义el-select下拉菜单的内容以及数据回显的内容

最终的效果 下拉选项的自定义内容好实现&#xff0c;因为他有默认插槽&#xff0c;所以直接在el-option标签里面写自定义内容就可以实现 <el-selectref"seriesBorderTypeRef"class"series-border-type"change"changeSeriesBorderType"v-model…

如何轻松获得稳定的静态IP?

在当今互联网时代&#xff0c;静态IP地址对于许多领域至关重要。无论是个人用户还是企业&#xff0c;拥有一个稳定的静态IP地址都能够提供诸多便利。静态IP地址与动态IP地址相比&#xff0c;具有不变性和可追溯性&#xff0c;适用于需要长期稳定通信和追踪的场景。了解静态IP的…

【前端】打砖块游戏:实现细节介绍

打砖块游戏:实现细节介绍 在本文中,我将详细介绍如何使用HTML、CSS和JavaScript技术构建一个简单的打砖块游戏。我们将重点讨论游戏的三个核心技术方面:碰撞检测、画图和事件监听。 完整代码我放在:github可以直接拉取代码测试。 游戏概览 打砖块游戏中,玩家通过控制底…

[Cesium]Cesium基础学习——Primitive

Cesium开发高级篇 | 01空间数据可视化之Primitive - 知乎 Primitive由两部分组成&#xff1a;几何体&#xff08;Geometry&#xff09;和外观&#xff08;Appearance&#xff09;。几何体定义了几何类型、位置和颜色&#xff0c;例如三角形、多边形、折线、点、标签等&#xf…

Linux之·网络编程·I/O复用·select

系列文章目录 文章目录 前言一、概述1.1 介绍IO复用的概念和作用1.1.1 I/O复用具体使用的场景1.1.2 I/O复用常用函数 二、select函数的重要性和用途2.1 基本的select函数2.2 如何使用FD_SET、FD_CLR等宏来设置和清除文件描述符集合2.3 select()函数函数整体使用框架&#xff1a…

被动防护不如主动出击

自网络的诞生以来&#xff0c;攻击威胁事件不断涌现&#xff0c;网络攻防对抗已然成为信息时代背景下的一场无硝烟的战争。然而&#xff0c;传统的网络防御技术&#xff0c;如防火墙和入侵检测技术&#xff0c;往往局限于一种被动的敌暗我明的防御模式&#xff0c;面对攻击者无…

CSS实现渐变色

渐变色分为线性渐变和径向渐变。 线性渐变linear-gradient(方向, 颜色1, 颜色2, … ,颜色n)径向渐变radial-gradient(颜色1 覆盖区域大小, 颜色2 覆盖区域大小, … ) 线性渐变的方向可以为&#xff1a; ​ 1、一个方向值时&#xff1a; to bottom 表示从上边到下边渐变 ​ 2、…

GO语言核心30讲 实战与应用 (WaitGroup和Once,context,Pool,Map,字符编码,string包,bytes包)

原站地址&#xff1a;Go语言核心36讲_Golang_Go语言-极客时间 一、sync.WaitGroup和sync.Once 1. sync.WaitGroup 比通道更加适合实现一对多的 goroutine 协作流程。 2. WaitGroup类型有三个指针方法&#xff1a;Wait、Add和Done&#xff0c;以及内部有一个计数器。 (1) Wa…

《控制系统实验与综合设计》自控第二次(含程序和题目)

实验五 二阶系统的瞬态响应 一、实验完成任务 1、测试在不同阻尼比的条件下单位阶跃响应曲线&#xff0c;并进行其他动态性能指标测量。 2、通过调节开环增益得到相应K值&#xff0c;并进行其他动态性能指标测量。 3、在阻尼比一定时&#xff0c;测试角频率不同时的单位阶跃…

Service Worker的生命周期和全局对象和API

Service Worker的生命周期和全局对象和API 当我们注册了Service Worker后&#xff0c;它会经历生命周期的各个阶段&#xff0c;同时会触发相应的事件。整个生命周期包括了&#xff1a;installing --> installed --> activating --> activated --> redundant。当Se…

深度剖析进程概念与进程状态

文章目录 1. 前言2. 什么是进程2.1 进程概念2.2 进程描述——PCB 3. 进程的一些基本操作3.1 查看进程3.2 结束进程3.3 通过系统调用获取进程标示符3.4 通过系统调用创建子进程 4. 进程状态4.1 普适的操作系统层面4.2 具体Linux操作系统层面 5. 两种特殊的进程5.1 僵尸进程5.2 孤…

每日OJ题_贪心算法四⑧_力扣767. 重构字符串

目录 力扣767. 重构字符串 解析代码 力扣767. 重构字符串 767. 重构字符串 难度 中等 给定一个字符串 s &#xff0c;检查是否能重新排布其中的字母&#xff0c;使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行&#xff0c;返回空字符串 "" 。 …

【Java基础】枚举类的方法及应用

如何实现让一个类有固定个数的对象 手动封装构造方法&#xff08;private&#xff09; → 创建静态对象 → final修饰静态对象&#xff0c;使其成为常量 class Season { //枚举类public final static Season SPRING new Season();public final static Season SUMMER new Se…

Redis的集群模式——Java全栈知识(20)

1、主从模式 Redis 支持主从模式的集群搭建&#xff0c;这是 Redis 提供的最简单的集群模式搭建方案&#xff0c;目的是解决单点服务器宕机的问题。当单点服务器发生故障的时候保证 Redis 正常运行。 主从模式主要是将集群中的 Redis 节点分为主节点和从节点。然后读和写发生在…

C++11续——智能指针(出现原因至源码模拟)

前言&#xff1a;在C11里面提出了一个新的语法 try catch用来捕捉异常&#xff0c;这样子能不使用return和exit的前提下退出程序就得到错误信息&#xff0c;但是随之而来的就是一个新的问题&#xff0c;try catch退出程序之后可能带来了无法释放的内存泄露问题&#xff0c;原因…

微信小程序 19:小程序分包

对小程序进行分包的好处主要有以下两点 可以优化小程序首次启动的下载时间在多团队共同开发时可以更好的解偶协作 分包前小程序的项目构成 分包前&#xff0c;小程序项目中所有的页面资源都被打包到一起&#xff0c;导致整个项目体积过大&#xff0c;影响小程序首次启动的下…

vue自定义权限指令

定义v-hasPermi指令 /*** v-hasPermi 操作权限处理*/import useUserStore from /store/modules/userexport default {mounted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions useUserStore().permissions&#xff…

算法-卡尔曼滤波之基本数学的概念

1.均值 定义&#xff1a;均值是一组数据中所有数值的总和除以数据的数量。均值是数据的中心趋势的一种度量&#xff0c;通常用符号 xˉ 表示。 &#xff1a;对于包含 n 个数据的数据集 {&#x1d465;1,&#x1d465;2,...,&#x1d465;&#x1d45b;}&#xff0c;均值 xˉ 计…

常见 Web 安全攻防总结

Web 安全的对于 Web 从业人员来说是一个非常重要的课题&#xff0c;所以在这里总结一下 Web 相关的安全攻防知识&#xff0c;希望以后不要再踩雷&#xff0c;也希望对看到这篇文章的同学有所帮助。今天这边文章主要的内容就是分析几种常见的攻击的类型以及防御的方法。 也许你对…