开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

FlinkCDC如何保证数据的一致性?

FlinkCDC如何保证数据的一致性?

展开
收起
小小鹿鹿鹿 2024-02-01 17:41:44 180 0
2 条回答
写回答
取消 提交回答
  • Apache Flink CDC(Change Data Capture)通过一系列技术和机制来保证数据的一致性:

    1. 一致性快照(Snapshotting)

      • 在开始摄取数据前,Flink CDC会对数据库进行一次初始的全量快照,确保数据源的状态与Flink作业的初始状态一致。
      • 在实时摄取过程中,Flink使用Changelog数据源(如Debezium等)捕获数据库的增量变更(插入、更新、删除),并将这些变更记录按照Flink的checkpoint机制进行处理。
    2. Checkpoint与Savepoint

      • Flink的checkpoint机制会在预定义的间隔内对整个流处理作业的状态进行持久化保存。当Flink CDC作业完成一个checkpoint时,不仅会持久化流处理程序的状态,还会确保所有已摄取但尚未处理完的变更记录也一同被保存下来。
      • 在发生故障时,Flink可以快速从最近的checkpoint恢复,以此保证处理过的数据不会丢失,且未处理的变更数据会继续得到处理,从而达到至少一次(at-least-once)语义。
    3. 精确一次(Exactly-once)处理

      • 当Flink与Kafka等支持事务的消息队列配合使用时,可以结合两阶段提交协议实现在流处理过程中的精确一次处理语义。Flink会把 checkpoint barrier 与数据一起发送到Kafka,在触发checkpoint时确保所有上游算子和下游sink都能原子性地完成状态保存和外部系统的提交操作。
    4. 幂等性Sink

      • 对于Sink端,比如写入数据库,若Sink自身支持幂等性写入(如MySQL的唯一键约束、Kafka的幂等producer等),则可以在Flink CDC作业中结合这些特性,确保即使数据被多次写入,最终的系统状态仍然是一致的。
    5. Watermarking与事件时间处理

      • 在处理带有时间戳的事件时,Flink的watermark机制可以帮助处理乱序事件,确保在一定的时间窗口内处理所有的相关事件,这对于维护数据一致性非常重要。

    综上所述,Flink CDC通过组合上述技术手段,实现了在分布式流处理环境下对数据库变更数据的一致性和完整性保障。不过,是否能达到精确一次语义还取决于上下游系统和中间件的支持程度,以及在整个数据链路中各个组件的配置和协调。

    2024-02-11 09:02:59
    赞同 展开评论 打赏
  • 端到端的一致性保证,意味着结果的正确性贯穿了整个流处理应用的始终;每一个组件都保证了它自己的一致性,整个端到端的一致性级别取决于所有组件中一致性最弱的组件。具体可以划分如下:

    • 内部保证 —— 依赖checkpoint
    • source 端 —— 需要外部源可重设数据的读取位置
    • sink 端 —— 需要保证从故障恢复时,数据不会重复写入外部系统

    而对于sink端,又有两种具体的实现方式:幂等(Idempotent)写入和事务性(Transactional)写入。

    • 幂等写入
      所谓幂等操作,是说一个操作,可以重复执行很多次,但只导致一次结果更改,也就是说,后面再重复执行就不起作用了。
    • 事务写入
      需要构建事务来写入外部系统,构建的事务对应着 checkpoint,等到 checkpoint 真正完成的时候,才把所有对应的结果写入 sink 系统中。

    不同Source和Sink的一致性保证可用下表说明:
    image.png

    ——参考链接

    2024-02-04 00:12:03
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载