Flink 详解 | Flink CDC 2.0 正式发布,详解核心改进
HBase技术社区
共 9177字,需浏览 19分钟
·
2021-08-14 02:29
摘要:本文由社区志愿者陈政羽整理,内容来源自阿里巴巴高级开发工程师徐榜江 (雪尽) 7 月 10 日在北京站 Flink Meetup 分享的《详解 Flink-CDC》。深入讲解了最新发布的 Flink CDC 2.0.0 版本带来的核心特性,包括:全量数据的并发读取、checkpoint、无锁读取等重大改进。
GitHub 项目地址:
https://github.com/ververica/flink-cdc-connectors
一、CDC 概述
CDC 的全称是 Change Data Capture ,在广义的概念上,只要是能捕获数据变更的技术,我们都可以称之为 CDC 。目前通常描述的 CDC 技术主要面向数据库的变更,是一种用于捕获数据库中数据变更的技术。CDC 技术的应用场景非常广泛:
数据同步:用于备份,容灾;
数据分发:一个数据源分发给多个下游系统; 数据采集:面向数据仓库 / 数据湖的 ETL 数据集成,是非常重要的数据源。
基于查询的 CDC:
离线调度查询作业,批处理。把一张表同步到其他系统,每次通过查询去获取表中最新的数据; 无法保障数据一致性,查的过程中有可能数据已经发生了多次变更; 不保障实时性,基于离线调度存在天然的延迟。
基于日志的 CDC:
实时消费日志,流处理,例如 MySQL 的 binlog 日志完整记录了数据库中的变更,可以把 binlog 文件当作流的数据源; 保障数据一致性,因为 binlog 文件包含了所有历史变更明细; 保障实时性,因为类似 binlog 的日志文件是可以流式消费的,提供的是实时数据。
对比增量同步能力,
基于日志的方式,可以很好的做到增量同步; 而基于查询的方式是很难做到增量同步的。
对比全量同步能力,基于查询或者日志的 CDC 方案基本都支持,除了 Canal。 而对比全量 + 增量同步的能力,只有 Flink CDC、Debezium、Oracle Goldengate 支持较好。 从架构角度去看,该表将架构分为单机和分布式,这里的分布式架构不单纯体现在数据读取能力的水平扩展上,更重要的是在大数据场景下分布式系统接入能力。例如 Flink CDC 的数据入湖或者入仓的时候,下游通常是分布式的系统,如 Hive、HDFS、Iceberg、Hudi 等,那么从对接入分布式系统能力上看,Flink CDC 的架构能够很好地接入此类系统。 在数据转换 / 数据清洗能力上,当数据进入到 CDC 工具的时候是否能较方便的对数据做一些过滤或者清洗,甚至聚合? 在 Flink CDC 上操作相当简单,可以通过 Flink SQL 去操作这些数据; 但是像 DataX、Debezium 等则需要通过脚本或者模板去做,所以用户的使用门槛会比较高。 另外,在生态方面,这里指的是下游的一些数据库或者数据源的支持。Flink CDC 下游有丰富的 Connector,例如写入到 TiDB、MySQL、Pg、HBase、Kafka、ClickHouse 等常见的一些系统,也支持各种自定义 connector。
二、Flink CDC 项目
1. Dynamic Table & ChangeLog Stream
Dynamic Table 就是 Flink SQL 定义的动态表,动态表和流的概念是对等的。参照上图,流可以转换成动态表,动态表也可以转换成流。 在 Flink SQL中,数据在从一个算子流向另外一个算子时都是以 Changelog Stream 的形式,任意时刻的 Changelog Stream 可以翻译为一个表,也可以翻译为一个流。
每条 RowData 都有一个元数据 RowKind,包括 4 种类型, 分别是插入 (INSERT)、更新前镜像 (UPDATE_BEFORE)、更新后镜像 (UPDATE_AFTER)、删除 (DELETE),这四种类型和数据库里面的 binlog 概念保持一致。 而 Debezium 的数据结构,也有一个类似的元数据 op 字段, op 字段的取值也有四种,分别是 c、u、d、r,各自对应 create、update、delete、read。对于代表更新操作的 u,其数据部分同时包含了前镜像 (before) 和后镜像 (after)。
2. 传统 CDC ETL 分析
3. 基于 Flink CDC 的 ETL 分析
4. Flink CDC 项目发展
2020 年 7 月由云邪提交了第一个 commit,这是基于个人兴趣孵化的项目; 2020 年 7 中旬支持了 MySQL-CDC; 2020 年 7 月末支持了 Postgres-CDC; 一年的时间,该项目在 GitHub 上的 star 数已经超过 800。
三、Flink CDC 2.0 详解
1. Flink CDC 痛点
全量 + 增量读取的过程需要保证所有数据的一致性,因此需要通过加锁保证,但是加锁在数据库层面上是一个十分高危的操作。底层 Debezium 在保证数据一致性时,需要对读取的库或表加锁,全局锁可能导致数据库锁住,表级锁会锁住表的读,DBA 一般不给锁权限。 不支持水平扩展,因为 Flink CDC 底层是基于 Debezium,起架构是单节点,所以Flink CDC 只支持单并发。在全量阶段读取阶段,如果表非常大 (亿级别),读取时间在小时甚至天级别,用户不能通过增加资源去提升作业速度。 全量读取阶段不支持 checkpoint:CDC 读取分为两个阶段,全量读取和增量读取,目前全量读取阶段是不支持 checkpoint 的,因此会存在一个问题:当我们同步全量数据时,假设需要 5 个小时,当我们同步了 4 小时的时候作业失败,这时候就需要重新开始,再读取 5 个小时。
2. Debezium 锁分析
全量阶段:查询当前表中所有记录; 增量阶段:从 binlog 消费变更数据。
3. Flink CDC 2.0 设计 ( 以 MySQL 为例)
图中的 - ( k2,100 ) + ( k2,108 ) 记录表示这条数据的值从 100 更新到 108; 第二条记录是删除 k3; 第三条记录是更新 k2 为 119; 第四条记录是 k5 的数据由原来的 77 变更为 100。
对于 k1、k4、k6、k7 来说,在高位点读取完毕之后,这些记录没有变化过,所以这些数据是可以直接输出的; 对于改变过的数据,则需要将增量的数据合并到全量的数据中,只保留合并后的最终数据。例如,k2 最终的结果是 119 ,那么只需要输出 +(k2,119),而不需要中间发生过改变的数据。
提供 MySQL CDC 2.0,核心 feature 包括 并发读取,全量数据的读取性能可以水平扩展; 全程无锁,不对线上业务产生锁的风险; 断点续传,支持全量阶段的 checkpoint。 搭建文档网站,提供多版本文档支持,文档支持关键词搜索
MySQL CDC 2.0 用时 13 分钟; MySQL CDC 1.4 用时 89 分钟; 读取性能提升 6.8 倍。
四、未来规划
稳定性 通过社区的方式吸引更多的开发者,公司的开源力量提升 Flink CDC 的成熟度; 支持 Lazy Assigning。Lazy Assigning 的思路是将 chunk 先划分一批,而不是一次性进行全部划分。当前 Source Reader 对数据读取进行分片是一次性全部划分好所有 chunk,例如有 1 万个 chunk,可以先划分 1 千个 chunk,而不是一次性全部划分,在 SourceReader 读取完 1 千 chunk 后再继续划分,节约划分 chunk 的时间。 进阶 Feature 支持 Schema Evolution。这个场景是:当同步数据库的过程中,突然在表中添加了一个字段,并且希望后续同步下游系统的时候能够自动加入这个字段; 支持 Watermark Pushdown 通过 CDC 的 binlog 获取到一些心跳信息,这些心跳的信息可以作为一个 Watermark,通过这个心跳信息可以知道到这个流当前消费的一些进度; 支持 META 数据,分库分表的场景下,有可能需要元数据知道这条数据来源哪个库哪个表,在下游系统入湖入仓可以有更多的灵活操作; 整库同步:用户要同步整个数据库只需一行 SQL 语法即可完成,而不用每张表定义一个 DDL 和 query。 生态集成 集成更多上游数据库,如 Oracle,MS SqlServer。Cloudera 目前正在积极贡献 oracle-cdc connector; 在入湖层面,Hudi 和 Iceberg 写入上有一定的优化空间,例如在高 QPS 入湖的时候,数据分布有比较大的性能影响,这一点可以通过与生态打通和集成继续优化。
附录
实时数仓 Meetup 议题征集:
8 月 29 日左右 (时间暂定),Flink 社区计划举办 Meetup 实时数仓专场,现征集议题中!
关于实时数仓,大家的关注度一直很高,目前业界也有许多落地的公司。在 Meetup 实时数仓专场, 我们将更加注重 “交流”,希望将大家聚集在一起相互探讨关于实时数仓的话题,重点在踩过的坑、碰到的痛点都是怎样解决的~
现征集实时数仓 Meetup 的议题,围绕 “实时数仓踩坑痛点和避坑经验”,欢迎各位老师和同学带上贵公司的介绍,以及议题的初步大纲来找小松鼠。
公司不议大小,经验才论足缺。我们会选取其中最具代表性的议题,邀请您参加实时数仓 Meetup 专场~ 你们的经验对于其他技术开发者和 Flink 社区都很重要!
▼ 扫码添加小松鼠微信 ▼
评论