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

Flink CDC 介绍

一、什么是 CDC

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

二、Flink CDC

        Flink CDC 通过捕获数据库的变更日志(如 MySQL binlog、Postgres WAL),实现高效、低延迟的数据同步。其核心工作原理可分为变更数据捕获转换处理输出同步三个阶段:

2.1 变更数据捕获

  1. 日志抓取

    使用 Debezium (Flink CDC 底层引擎) 连接数据库,通过各自协议读取变更日志

    MySQL ——> binlog
    PostgreSQL ——> WAL
    Oracle ——> Redo Log
  2. 初始快照

    首次启动时执行全量快照(snapshot),将表中已有数据转为 INSERT 事件流。

        采用分块并行读取(如按主键分片)加速同步。

2.2 转换处理

  1. 日志解析与转换

    格式转换:

    Debezium 将原始二进制日志解析为 JSON / Avro 结构,Flink CDC将其转换为 RowData结构(Flink 内部数据结构)。

    Schema 映射:

      自动推断表结构(字段名、类型、主键),动态处理 DDL 变更(如新增列)。
  2. Flink 实时处理

    流式处理:


    变更事件(INSERT / UPDATE / DELETE)作为无界数据流进入 Flink。

    Exactly-Once 语义:

     通过 Checkpoint 机制 + binlog 位点持久化(如 Kafka 或 Flink State)保证数据一致性。

    转换能力:

    支持使用 Flink SQL 或 DataStream API 进行过滤、聚合、关联维表等操作。

2.3 输出同步

将处理后的数据写入下游系统:

  • 数据胡:Hudi / IceBerg
  • OLAP 引擎:Clickhouse / Doris
  • 消息队列:Kafka / Pulsar
  • 数据库:Mysql / PostgreSQL(需要支持 Upsert)

三、关键技术

3.1 全量+增量无缝切换

  • 无锁读取

    快照阶段使用 SELECT ... FROM 而非锁表(Mysql 使用 mysqldump 的轻量模式)。
  • 断点续传

    Checkpoint 存储 binlog 位点,故障恢复时从断点继续同步。                         

3.2 动态表结构处理

  • 自动 Schema 同步

    源表新增列时,Flink CDC 自动更新 Schema,下游系统需支持 DDL 传播。
  • 兼容性处理

    旧数缺失实新增列时填充 NULL。

3.3 并行读取优化

  • 分片策略

    按主键范围或按时间分区并行快照。
  • 增量阶段并行度

    单任务串行读取 binlog(避免乱序),但可并行处理后续计算。

四、典型应用场景

4.1 实时数仓同步

-- Flink SQL 实现 MySQL → Hudi
CREATE TABLE orders_cdc (id BIGINT,amount DECIMAL(10,2),PRIMARY KEY (id) NOT ENFORCED
) WITH ('connector' = 'mysql-cdc','hostname' = 'mysql-host','database-name' = 'test','table-name' = 'orders'
);CREATE TABLE hudi_orders (...) WITH ('connector'='hudi');INSERT INTO hudi_orders SELECT * FROM orders_cdc;

4.2 多源数据聚合

// DataStream 实现订单+用户表关联
DataSource<Order> orders = env.fromSource(MySqlSource.<Order>builder().build(), ...);DataSource<User> users = env.fromSource(PostgresSource.<User>builder().build(), ...);orders.connect(users).keyBy(o -> o.userId, u -> u.id).process(new EnrichOrderFunction()); // 关联用户信息

4.3 微服务数据融合

将分散的数据库变更同步到 Kafka 统一主题,供下游服务消费。

五、性能优化策略

  1. 增量阶段跳过快照
    配置 'scan.startup.mode'='latest-offset' 仅同步新增数据(无需全量)。

  2. 批量读取加速
    调整 debezium.snapshot.fetch.size(单次读取行数)提升快照效率。

  3. 无主键表处理
    启用 'chunk-key.even-distribution'='false' 优化全表扫描性能。

  4. 资源隔离
    将 CDC 源任务与其他计算任务部署在不同 TaskManager 上,避免资源竞争。

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

相关文章:

  • Linux 系统重置用户密码指南
  • docker镜像源配置教程,以及解决安装好docker配置镜像源后,出现报错。Job for docker.service failed
  • 【Canvas与文字】生存与生活
  • WPF中引用其他元素各种方法
  • 【Mac】OrbStack:桌面端虚拟机配置与使用
  • 机器学习05——正则化与逻辑回归
  • 数据结构:反转链表(reverse the linked list)
  • 华为OD机考2025C卷 - 开源项目热度榜单 (Java Python JS C++ C )
  • Android Espresso 测试框架深度解析:从入门到精通
  • 如何设计和实施高效的向量化数据检索解决方案
  • python基础:数据解析BeatuifulSoup,不需要考虑前端形式的一种获取元素的方法
  • 量子计算接口开发:Python vs Rust 性能对决
  • 我用一个 Postgres 实现一整套后端架构!
  • 分布式版本控制工具Git
  • javacc学习笔记 01、JavaCC本地安装与测试
  • HCIP笔记1
  • Mac中M系列芯片采用rbenv管理ruby版本
  • pytorch 学习笔记3-利用框架内网络训练糖尿病数据集
  • 深入剖析通用目标跟踪:一项综述
  • 抽像代数概念理解——陪集(coset)
  • 0.08B参数以小博大:用小模型生成媲美GPT-4o的古典诗词
  • 嵌入式学习之51单片机——串口(UART)
  • Webpack 搭建 Vue3 脚手架详细步骤
  • Unix 命令行shell基础--学习系列003
  • 跳板机实现 SSHFS 挂载
  • Tomcat虚拟主机配置详解和多实例部署
  • C + +
  • 交叉验证:原理、作用与在机器学习流程中的位置
  • SpringBoot3.x入门到精通系列:3.2 整合 RabbitMQ 详解
  • Ubuntu系统VScode实现opencv(c++)图像一维直方图