# 数据的写入

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

![left](./student-guide/diagram/WritingData_aa_001_2022051.png)
-------------------------------------------------------------
在有了 Raft 共识算法和 RocksDB 的基础后,我们可以介绍下 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 中数据的写入流程流程。