如何构建批流一体数据融合平台的一致性语义保证?(16)

数据一致性衔接

关于批量数据与实时数据如何衔接的问题,主要有两个关键点:

第一,当开始进行一个批量数据同步时,以关系型数据库为例,你应该拿到当时一个整体数据的 Snapshot,并在一个事务中同时记录当时对应的日志起始值。以 MySQL 为例,当要获取一个 Binlog 起始偏移量时,需要开启一个 START TRANSACTION WITH CONSISTENT SNAPSHOT,这样才能保证完成全量之后,后期的读取增量日志同步不会产生重复数据。

第二,如果采用增量同步模式,则必须根据实际的数据业务领域,采用一种比较灵活的增量表达式,才能避免读到写到一半的数据。比如在你的数据中,其 ID 是一个完全自增,没有任何重复的可能,此时只需每次单纯的大于上一次同步的最后一条记录即可。

但如果是一个时间戳,无论精度多高,都有可能在数据库产生相同的时间戳,所以安全的做法是每次迭代时,取比当前时间稍微少一点,保证留出一个安全时间,比如五秒甚至一分钟,这样你永远不会读到一些时间戳可能会产生冲突的这部分数据,避免遗漏数据。这是一个小技巧,但如果没有注意,在使用过程中就会产生各种各样的问题。

推荐阅读