# TiKV 架构和作用

+ 数据持久化
+ 分布式一致性
+ MVCC
+ 分布式事务
+ Coprocessor

![right](./student-guide/diagram/03-structure-01-01.png)
-------------------------------------------------------------
之前的课程中，我们了解了 TiDB Server 作为 SQL 层，对外暴露 MySQL 协议的连接 endpoint，负责接受客户端的连接，执行 SQL 解析和优化，最终生成分布式执行计划，TiDB Server 本身是无状态的。

下面我们会介绍 TiKV ，TiKV 的主要核心功能是负责 TiDB 数据库的数据持久化，这个功能是靠集成在 TiKV 中的 RocksDB 实现的，所以我们会着重介绍 TiKV 中 RocksDB 的数据写入（也就是持久化）与读取，另外介绍 RocksDB 中 Column Families 的功能，这个功能对后面事务和 MVCC 的支持有很大的影响。

TiKV 的另一个功能是支持分布式事务和 MVCC，所以我们会从 TiKV 层面来介绍它们的实现。

在 TiDB 数据库中，TiKV 是一个分布式的存储引擎，数据以 region 为单位分布式存储，所以我们就用到了 raft 共识算法来实现了分布式环境下面数据的强一致性。每个 region 及其副本构成一个 raft group，多个 raft group 的组合就叫做 multi raft。我们会为大家介绍，raft 中的复制和 leader 选举，以及基于 raft 共识算法的数据写入、读取、split 和 merge。这里说的基于 raft 共识算法的写入 / 读取与之前提到的 RocksDB 的写入和读取有所不同，RocksDB 的写入和读取主要指的是在单个 TiKV 节点上的数据持久性和一致性读取的保证，是纵向的，而基于 raft 共识算法的写入 / 读取主要是对于多个 TiKV 节点组成的集群的操作，可以认为是横向的。

后面，我们介绍了 Coprocessor 功能组件，这个功能组件为 TiKV 提供了算子下推的能力，我们可以利用这个功能组件将一部分过滤、聚合和投影等 SQL 计算交给 TiKV 来完成，不需要将 TiKV 中的数据全部通过网络发送给 TiDB Server，也没有必要将全部计算压力发送到 TiDB Server 上。这样节省了网络带宽和 TiDB Server 的 CPU 负载。