# 数据的写入

__*TiKV 写入*__
__*数据写入*__

![smart](./student-guide/diagram/WritingData_aa_001_2022051.png)
-------------------------------------------------------------
TiKV 的数据写入流程如下:

假设我们要写入 key = 100, value = Jack

1. 客户端（ 一般是 TiDB server ）询问 PD 关于 key = 100 所在的 Region。

2. PD 告知 Leader 所在的 Region 位置（TiKV 节点）。

3. 客户端（ 一般是 TiDB server ） 将写操作的指令发送给 leader 所在的 TiKV 节点。

4. Leader 节点接受写指令之后, 开始启动 TiKV 的写流程
- 在这里, 我们用到两个组件, 一个叫做 raftstore pool, 另一个叫做 apply pool, 它们都是用来写入持久化存储引擎（RocksDB）的机制。
- 至于存储引擎, 也就是 RocksDB 实例, 在一个 TiKV 中我们有两个 RocksDB 实例, 其中一个负责持久化 Raft Log, 我们称之为 RocksDB Raft, 另一个负责持久化真正的 key-value 数据, 我们称之为 RocksDB KV。
- 当 Leader 节点接收到写命令, raftstore pool 会将其序列化成日志（ Raft Log ）, 并提交给 RocksDB Raft 进行持久化（append）。同时, raftstore pool 还负责将日志（Raft Log）分发给 followers 所在的 TiKV 节点（replicate）, 当集群的大多数 followers 节点都收到了这个日志（ Raft Log ）, 我们就认为这个（ Raft Log ）是 committed。

接下来, apply pool 会将已经 committed 的日志（ Raft Log ）解析并应用到 RocksDB KV  中。

5. Leader 将 key = 100, value = Jack Apply 到 KV RocksDB 然后向客户端返回写入成功。

6. 之后, 客户端的 commit 才被认为成功, 其他会话才能读取到这份数据。

以上就是 TiKV 中数据的写入流程。