# `Raft` 与 多个 `Raft` 对比

![`smart`](RaftAndMultiRaft_aa_001_20220511.png)

------------------------------------------------------------
1. Leader是集群中的管理者，所有客户端流量都会通过Leader。通常只有一个Leader，它会定期发送心跳给Followers以维持其统治。当它发现自己不是Leader时，它会变成一个Follower。

2. Follower 是集群中被管理的一方，只会响应其他服务器的命令。在长时间没有收到 Leader 的响应后，它会变成一个 Candidate。

3. 候选人是集群的候选人，将发起投票以试图当选领导。

在之前的课程中，我们学习到TiKV使用Raft共识算法来实现分布式环境中数据的强一致性，TiDB只能通过Leader写入，Leader会以日志的形式将写入指令复制给Followers，当集群中的大多数节点接收到这个日志时，我们认为这个日志已经提交并可以应用到数据持久化存储引擎中。

TiDB 默认提供三个副本来支持，形成一个 Raft Group。由于 Raft Group 处理的数据有限，我们会将数据拆分成多个 Raft Group，我们称之为 Multi Raft。拆分的方式是基于 Range，也就是我们会按照字节顺序对数据的 key 进行排序，形成一个无限的 key-value Map 数据结构，然后将其拆分成连续 key 范围的部分，每个 key 范围被视为一个 Region。

两个相邻的区域不能有任何间隙，意味着前一个区域的结束键就是下一个区域的开始键。

这个区域的范围是左闭右开的，对于起始键来说，它属于这个区域，但是对于结束键来说，它实际上属于下一个区域。

TiKV 区域会有一个限制，当它超过这个阈值时，它会分裂成两个区域，例如 [a, c) -> [a, b) + [b, c)。

如果该区域没有数据，或者只有少量数据，它将与相邻的区域合并形成一个更大的区域，例如[a, b) + [b, c) -> [a, c)。

以上所说，多个区域形成多个Raft组，我们称之为Multi Raft。