什么是Incremental Snapshot ReadingFlink CDC 系列文章:
《Flink CDC 系列(1)—— 什么是 Flink CDC》
《Flink CDC 系列(2)—— Flink CDC 源码编译》
《Flink CDC 系列(3)—— Flink CDC MySQL Connector 与 Flink SQL 的结合使用案例Demo》
《Flink CDC 系列(4)—— Flink CDC MySQL Connector 常用参数表》
《Flink CDC 系列(5)—— Flink CDC MySQL Connector 启动模式》
《Flink CDC 系列(6)—— Flink CDC MySQL Connector 工作机制之 Incremental Snapshot Reading》
Incremental snapshot reading 是读取表块照数据的新机制。和旧的快照机制相比,有以下优点:
MySQL CDC Source 支持并行读取快照数据MySQL CDC Source 在快照读取阶段,支持数据块级别的 checkpointMySQL CDC Source 不需要获取全局的读锁(FLUSH TABLES WITH READ LOCK)如果想要并行地读取快照数据,需要给每一个 reader 指定一个唯一的 server id,‘server-id’可以指定一段数值范围,如’5400-6400’。
Incremental Snapshot Reading 如何工作Flink MySQL CDC source 启动之后,Incremental Snapshot Reading 会分为两个阶段来读取数据。首先是快照阶段,并行地读取表的快照。快照阶段完成后是 binlog 阶段,以单个并行度的方式读取表的 binlog 数据。
快照阶段,快照数据按照表的主键和行数被切分为多个数据块,被分配给多个快照 reader 处理。每个快照 reader 根据块读取算法处理分配给它的数据块并把读取到的数据发送给下游。Flink MySQL CDC source 负责管理数据块的处理状态(完成与否),因此,在快照阶段可以支持数据块级别的 checkpoint。如果有故障发生,Flink MySQL CDC source 可以从 checkpoint 恢复并从上一个完成的数据块开始继续工作。
所有的快照数据块完成之后,快照阶段结束,Flink MySQL CDC source 会进入 binlog 读取阶段,在这个阶段,仅启动一个 task,即一个并行度。为了保证快照数据和 binlog 数据的顺序,binlog reader 直到快照数据块完成 checkpoint 才启动,以保证所有快照数据都已经被下游获取了。binlog reader 把 binlog 的位置记录在 Flink 状态中,因此,在 binlog 阶段可以支持行级别的 checkpoint。
Flink 周期性的对 Flink MySQL CDC source 执行 checkpoint,在出现故障时,作业可以从最后一次成功提交的 checkpoint 恢复,保证了精准一致。
补充:当表没有主键时,Incremental snapshot reading 会失败,这时需要修改配置,把 scan.incremental.snapshot.enabled 设置为 false,使用旧的快照读取机制。