编者按:
本文为 TiDB Hackathon 2020 比赛中 TiFlink 项目最新进展的介绍,使用 TiKV 和 Flink 实现了强一致的物化视图的功能。
作者张茄子,算法、分布式技术和函数式编程爱好者。个人博客:https://io-meter.com/
在本年初的 TiDB Hackathon 上,我和一众队友尝试使用 Flink 为 TiDB 添加物化视图功能,并摘得了 “最佳人气奖”。可以说,物化视图在这届比赛中可谓是一个热点。单单是结合 Flink 实现相关功能的队伍就有三四个。必须承认的是,在比赛结束时我们项目的完成度很低,虽然基本思路已经定型,最终呈现的结果却远没达到预期。经过半年多断断续续的修补,在今天终于可以发布一个预览版本给大家试用。这篇文章就是对我们思路和成果的一个介绍。
相比其他队伍,我们的主要目标是实现强一致的物化视图构建。也就是保证查询时的物化视图可以达到接近快照隔离(Snapshot Isolation)的隔离级别,而不是一般流处理系统的最终一致性(Eventual Consistency)。关于实现一致性的讨论在下文有详细介绍。
使用简介
尽管是一个实验性的项目,我们仍然探索了一些方便实用的特性,包括:
零外部依赖:除了 TiDB 集群和 Flink 部署环境之外,无需维护任何其他组件(包括 Kafka 集群和 TiCDC)。这是因为 TiFlink 直接从 TiKV 读写数据,不经过任何中间层,为更高吞吐、更低延迟和更易维护创造了可能。
易用的接口:尽管为了实现强一致性 TiFlink 引进了一些新的概念,但是通过特别编写的TiFlinkApp 接口,用户可以快速启动一个任务,也无需手动创建写入目标表。
批流结合:任务启动后会先批量消费源表当前已有的数据,随后自动切换到 CDC 日志消费。这个过程也会确保视图的一致性。
关于 TiFlink 实用的详细信息,请参考 README。下面是快速启动一个任务的代码片段:
TiFlinkApp.newBuilder() .setJdbcUrl("jdbc:mysql://root@localhost:4000/test") // Please make sure the user has correct permission .setQuery( "select id, " + "first_name, " + "last_name, " + "email, " + "(select count(*) from posts where author_id = authors.id) as posts " + "from authors") // .setColumnNames("a", "b", "c", "d") // Override column names inferred from the query // .setPrimaryKeys("a") // Specify the primary key columns, defaults to the first column // .setDefaultDatabase("test") // Default TiDB database to use, defaults to that specified by JDBC URL .setTargetTable("author_posts") // TiFlink will automatically create the table if not exist // .setTargetTable("test", "author_posts") // It is possible to sepecify the full table path .setParallelism(3) // Parallelism of the Flink Job .setCheckpointInterval(1000) // Checkpoint interval in milliseconds. This interval determines data refresh rate .setDropOldTable(true) // If TiFlink should drop old target table on start .setForceNewTable(true) // If to throw an error if the target table already exists .build() .start(); // Start the app
物化视图(流处理系统)的一致性
目前主流的物化视图(流处理)系统主要使用最终一致性。也就是说尽管最终结果会收敛到一致的状态,但在处理期间终端用户仍可能查询到一些不一致的结果。最终一致性在很多应用中被证明是足够的,那么更强的一致性是否真的需要呢?这里的一致性和 Flink 的 Exact Once 语义又有什么关系呢?有必要进行一些介绍。
ACID
ACID 是数据库的一个基本的概念。一般来说,作为 CDC 日志来源的数据库已经保证了这四条要求。但是在使用 CDC 数据进行流式处理的时候,其中的某些约束却有可能被破坏。

本文介绍了在TiDBHackathon中,作者团队如何使用Flink和TiKV实现实时、强一致的物化视图,克服了最终一致性问题,提供了零外部依赖、易用接口和批流结合的特性。文章详细探讨了一致性实现、技术方案及未来改进方向。
最低0.47元/天 解锁文章
859

被折叠的 条评论
为什么被折叠?



