返回

TiKV 源码解析:读流程探秘

闲谈

前言

TiKV,一个备受瞩目的分布式 Key-Value 数据库,已荣升为 CNCF 基金会的顶级项目。对于新加入的开发者而言,深入理解 TiKV 源码是参与社区开发的必经之路。本文将带你踏上 TiKV 源码阅读三部曲的第二站,探秘 TiKV 的读流程。

读流程概述

在 TiKV 中,读操作的流程大致可以分为以下几个步骤:

  1. 客户端发送读请求: 应用程序向 TiKV 集群发起读请求,指定需要读取的键。
  2. TiDB 路由请求: TiDB 作为 TiKV 的前端,负责将读请求路由到正确的 Region。
  3. Region 处理请求: Region 收到请求后,从本地存储中读取数据。
  4. 数据返回: Region 将读取到的数据返回给 TiDB。
  5. 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 的整体架构和提高开发效率至关重要。