内容概要
TiCDC 是一款 TiDB 增量数据同步工具,通过拉取上游 TiKV 的数据变更日志,TiCDC 可以将数据解析为有序的行级变更数据输出到下游。
本文是 TiCDC 源码解读的第二篇,将于大家介绍 TiCDC 的重要组成部分,TiKV 中的 CDC 模块。我们会围绕 4 个问题和 2 个目标展开。
- TiKV 中的 CDC 模块是什么?
- TiKV 如何输出数据变更事件流?
- 数据变更事件有哪些?
- 如何确保完整地捕捉分布式事务的数据变更事件?
希望在回答完这4个问题之后,大家能:
- 🔔 了解数据从 TiDB 写入到 TiKV CDC 模块输出的流程。
- 🗝️ 了解如何完整地捕捉分布式事务的数据变更事件。
在下面的内容中,我们在和这两个目标相关的地方会标记上 🔔 和 🗝️,以便提醒读者留意自己感兴趣的地方。
TiKV 中的 CDC 模块是什么?
CDC 模块的形态
从代码上看,CDC 模块是 TiKV 源码的一部分,它是用 rust 写的,在 TiKV 代码库里面;从运行时上看,CDC 模块运行在 TiKV 进程中,是一个线程,专门处理 TiCDC 的请求和数据变更的捕捉。
CDC 模块的作用
CDC 模块的作用有两个:
- 它负责捕捉实时写入和读取历史数据变更。这里提一下历史数据变更指已经写到 rocksdb 里面的变更。
- 它还负责计算 resolved ts。这个 resolved ts 是 CDC 模块里面特有的概念,形式上是一个 uint64 的 timestamp。它是 TiKV 事务变更流中的 perfect watermark,perfect watermark 的详细概念参考《Streaming System》的第三章,我们可以用 resolved ts 来告知下游,也就是 TiCDC,在 tikv 上所有 commit ts 小于 resolved ts 事务都已经完整发送了,下游 TiCDC 可以完整地处理这批事务了。
CDC 模块的代码分布
CDC 模块的代码在 TiKV 代码仓库的 compoenetns/cdc 和 components/resolved_ts 模块。我们在下图中的黑框里面用红色标注了几个重点文件。
在 delegate.rs 文件中有个同名的 Delegate 结构体,它可以认为是 Region 在 CDC 模块中的“委派”,负责处理这个 region 的变更数据,包括实时的 raft 写入和历史增量数据。
在 endpoint.rs 文件中有个 Endpoint 结构体,它运行在 CDC 的主线程中,驱动整个 CDC 模块,上面的 delegate 也是运行在整个线程中的。
initializer.rs 文件中的 Initializer 结构体负责增量扫逻辑,同时也负责 delegate 的初始化,这里的增量扫就是读取保存在 rocksdb 中的历史数据变更。
service.rs 文件中的 Service 结构体,它实现了 ChagneData gRPC 服务,运行在 gRPC 的线程中,它负责 TiKV 和 TiCDC 的 RPC 交互,同时它和 Endpoint 中的 Delegate 和 Initializer 也会有交互,主要是接受来自它俩的数据变更事件,然后把这些事件通过 RPC 发送给 TiCDC。
最后一个重要文件是 resolver.rs,它与上面的文件不太一样,在 resolve_ts 这个 component 中,里面的 Resolver 负责计算 resolved ts。

TiKV 如何输出数据变更事件流?
我们从端到端的角度完整地走一遍数据的写入和流出。下图概括了数据的流动,我们以数据保存到磁盘为界,红色箭头代表数据从 TiDB 写入 TiKV 磁盘的方向,蓝色箭头代表数据从 TiKV 磁盘流出到 TiCDC 的方向。</

本文介绍了TiKV中的CDC模块,包括其功能、数据流经的路径和如何确保事务完整性的过程。TiKV的CDC模块捕捉实时和历史数据变更,计算resolvedts以确保数据完整传输到TiCDC。文章详细阐述了数据从TiDB写入到TiKV,再到TiCDC的流程,以及事务完整捕捉的方法和resolvedts的角色。
最低0.47元/天 解锁文章
868

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



