TiKV 源码解析系列文章(十四)Coprocessor 概览
本文将简要介绍 TiKV Coprocessor 的基本原理,面向想要了解 TiKV 数据读取执行过程的同学,同时也面向想对该模块贡献代码的同学。阅读本文前,建议读者对 TiDB 整体架构有所了解,先阅读三篇文章了解 TiDB 技术内幕:说存储、说计算、谈调度。
什么是 Coprocessor


主要功能及处理概览
DAG:执行物理算子,为 SQL 计算出中间结果,从而减少 TiDB 的计算和网络开销。这个是绝大多数场景下 Coprocessor 执行的任务。 Analyze:分析表数据,统计、采样表数据信息,持久化后被 TiDB 的优化器采用。 CheckSum:对表数据进行校验,用于导入数据后一致性校验。

由 gRPC server 接收并将请求分发给 Coprocessor Endpoint 进行处理。 Endpoint 在收到请求后,根据请求的优先级,将请求分发给对应的线程池。 所有请求会先异步从存储层获取 snapshot,然后开始真正的处理阶段。 根据请求的不同类型,构造不同的 Handler 进行数据的处理。
DAG Request 概览
火山模型:每个算子按行按需吐出,3.0 之后开始弃用。
向量化计算模型:每个算子批量化处理数据,3.0 之后开始推广。

src/coprocessor/dag/mod.rs。
算子概览
BatchExecutor接口,其主要定义了一个
get_batch的函数:
pub trait BatchExecutor: Send {
fn next_batch(&mut self, scan_rows: usize) -> BatchExecuteResult;
}
pub struct BatchExecuteResult {
pub physical_columns: LazyBatchColumnVec,
pub logical_rows: Vec<usize>,
pub is_drained: Result<bool, Error>,
...
}
next_batch
中scan_rows
由上层控制,由于扫的数据过多会慢,因此该数字从 32 倍增到 1024。返回值 BatchExecuteResult
中,由于返回了一批空数据不代表所有数据都处理完毕了,例如可能只是全被过滤,因而使用单独字段表示所有数据处理完毕。
TableScan
定义:根据指定主键范围扫表数据,并过滤出一部分列返回。它只会作为最底层算子出现,从底层 KV 获取数据。
源码路径:
components/tidb_query/src/batch/executors/table_scan_executor.rs
案例:
select col from t
IndexScan
定义:根据指定索引返回扫索引数据,并过滤出一部分索引列返回。它只会作为最底层算子出现,从底层 KV 获取数据。 源码路径: components/tidb_query/src/batch/executors/index_scan_executor.rs 案例: select index from t
Selection
定义:对底层算子的结果按照过滤条件进行过滤,其中这些条件由多个表达式组成。 源码路径: components/tidb_query/src/batch/executors/selection_executor.rs案例: select col from t where a+b=10

Limit
定义:从底层算子吐出的数据中,限定返回若干行。
源码路径: components/tidb_query/src/batch/executors/limit_executor.rs案例: select col from t limit 10

TopN
定义:按照给定表达式进行排序后,取出前若干行数据。
源码路径:
components/tidb_query/src/batch/executors/top_n_executor.rs
案例:select col from t order by a+1 limit 10

Aggregation
定义:按照给定表达式进行分组、聚合。
源码路径: components/tidb_query/src/batch/executors/*_aggr_executor.rs案例: select count(1) from t group by score + 1

混合使用各个算子
综上,各个算子之间可以按照以下方式任意组合,如下图所示:

select count(1) from t where age>10
小结
💡文中划线部分均有跳转,点击【阅读原文】查看原版文章
TiKV 源码解析系列文章
TiKV 是一个开源的分布式事务 Key-Value 数据库,支持跨行 ACID 事务,同时实现了自动水平伸缩、数据强一致性、跨数据中心高可用和云原生等重要特性。作为一个基础组件,TiKV 可作为构建其它系统的基石。目前,TiKV 已用于支持分布式 HTAP 数据库—— TiDB 中,负责存储数据,并已被多个行业的领先企业应用在实际生产环境。2019 年 5 月,CNCF 的 TOC(技术监督委员会)投票决定接受 TiKV 晋级为孵化项目。
· 源码地址:https://github.com/tikv/tikv
· 更多信息:https://tikv.org





