1、徐榜江(雪尽)Flink CDC Maintainer&Apache Flink Committer|深入解读 Flink CDC 增量快照框架01Flink CDC 简介02Flink CDC 增量快照算法03Flink CDC 增量快照框架04社区发展规划目录|Flink CDC 简介01|Flink CDC 技术|?Flink CDC 是基于数据库的日志CDC(Change Data Capture)技术,实现了全量和增量的一体化读取能力,借助 Flink 优秀的管道能力和丰富的上下游生态,支持实时捕获、加工多种数据库的变更并输出到下游。|Flink CDC 技术|Flink CDC 技
2、术Flink CDC 增量快照算法02|Flink CDC 1.0 在全量读取阶段是不支持 checkpoint 的,因此会存在一个问题:当我们同步全量数据时,假设需要 5 个 小时,当我们同步了 4 小时的时候作业失败,这时候就需要重新开始,重新读取 5 个小时。一致性通过加锁保证 不支持水平扩展 全量读取阶段不支持 checkpointFlink CDC 1.0 痛点Debezium 在保证数据一致性时,需要对读取的库或表加锁,全局锁可能导致数据库hang住,表级锁会锁住加锁的表(无法更新),DBA 一般不给锁权限。Flink CDC 1.0 只支持单并发,在全量阶段读取阶段,如果表非常大
3、(亿级别),读取时间都在 小时 级别Flink CDC 增量快照算法|Flink CDC 1.0 底层封装了 Debezium,Debezium 同步一张表分为两个阶段:全量阶段:查询当前表中所有记录 增量阶段:从 binlog 消费变更数据加锁发生在全量阶段,目的是为了确定增量阶段的初始位点,保证增量+全量实现一条不多,一条不少,保证数据一致性(exactly-once 语义)Flink CDC 1.0 锁分析Flink CDC 增量快照算法|Flink CDC 1.0 锁分析Flink CDC 增量快照算法 该命令等待所有正在进行的 update 完成,同时阻止所有新来的 update。该
4、命令执行成功前必须等待所有正在运行的 select 完成,所有等待执行的update 会等待的更久。更坏的情况是,在等待正在运行 select 完成时,DB 实际上处于不可用状态,即使是新加入的 SELECT 也会被阻止,这是MySQL Query Cache 机制。该命令阻止其他事务 commit。MySQL FLUSH TABLES WITH READ LOCK 结论:加锁时间是不确定的,极端情况会 hang 住数据库Percona 文章:https:/ CDC 1.0 锁分析Flink CDC 增量快照算法|单并发失败重做使用锁无锁读取水平扩展断点续传DebeziumFlink CDC设
5、计标Flink CDC 增量快照算法设计案p 无锁算法p 并行读取p 断点续传DBLog 论文算法变种1,全程无锁FLIP-27 Source 实现2,架构优雅1:https:/arxiv.org/pdf/2010.12597v1.pdf2:https:/cwiki.apache.org/confluence/display/FLINK/FLIP-27%3A+Refactor+Source+InterfaceFlink CDC 增量快照算法|Flink CDC 增量快照算法DBLog 算法原理|ChunkChunk-1 1ID(PK)C1C2K1AK2BK3C.K100XK101YK103XK
6、104ZChunkChunk-1414ChunkChunk-1515lselect max(id)from T1=K104lselect max(id)from T1 where id K3lselect max(id)from T1 where id K101 and id K104Chunk-IDkey rangeChunk-0(null,k1)Chunk-1k1,k3).Chunk-14k101,K104)Chunk-15K104,null)ChunkChunk-0 0Flink CDC 增量快照算法Chunk 划分|Flink CDC 增量快照算法Chunk 读取|chunk-1-op