返回
TiKV 源码解析:读流程探秘
闲谈
2024-02-19 00:23:50
前言
TiKV,一个备受瞩目的分布式 Key-Value 数据库,已荣升为 CNCF 基金会的顶级项目。对于新加入的开发者而言,深入理解 TiKV 源码是参与社区开发的必经之路。本文将带你踏上 TiKV 源码阅读三部曲的第二站,探秘 TiKV 的读流程。
读流程概述
在 TiKV 中,读操作的流程大致可以分为以下几个步骤:
- 客户端发送读请求: 应用程序向 TiKV 集群发起读请求,指定需要读取的键。
- TiDB 路由请求: TiDB 作为 TiKV 的前端,负责将读请求路由到正确的 Region。
- Region 处理请求: Region 收到请求后,从本地存储中读取数据。
- 数据返回: Region 将读取到的数据返回给 TiDB。
- TiDB 返回结果: TiDB 将数据返回给应用程序。
源码解析
接下来,我们将深入 TiKV 源码,逐一解析读流程的各个步骤。
1. 客户端发送读请求
客户端通过 TiDB 与 TiKV 交互,发送读请求时会调用 pd::KvClient::get
函数。
let resp = client.get(k)?;
2. TiDB 路由请求
TiDB 通过 RegionCache 获取 Region 信息,并根据键的范围路由请求到正确的 Region。
let key_ranges = vec![start_key..end_key];
let regions = client.get_regions(key_ranges)?;
3. Region 处理请求
Region 收到请求后,根据键的范围查找本地存储中的数据。如果找到数据,则直接返回。否则,将请求转发给下游 Region。
match self.storage.get(ctx, cf, key)? {
Some(mut value) => {
// 数据命中,直接返回
}
None => {
// 数据未命中,转发请求
}
}
4. 数据返回
Region 将读取到的数据封装成 CoprocessorResponse
对象,并返回给 TiDB。
let resp = CoprocessorResponse {
data: Some(value),
};
5. TiDB 返回结果
TiDB 收到数据后,将其返回给应用程序。
let mut cb = ResponseCallback {
callback: callback,
txn: txn.clone(),
};
cb.receive(region.get_region_id(), resp);
总结
通过对 TiKV 源码的解析,我们深入了解了 TiKV 读流程的各个步骤。掌握读流程的细节,对于理解 TiKV 的整体架构和提高开发效率至关重要。