TiFlink:使用 TiKV 和 Flink 实现强一致的物化视图丨TiDB Hackathon 项目分享

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

编者按:

本文为 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 数据进行流式处理的时候,其中的某些约束却有可能被破坏。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值