# Raft 与 Multi Raft（A）

![left](./student-guide/diagram/28-Raft-and-Multi-Raft-01-01.png)

-------------------------------------------------------------

1. Raft 基本概念
Raft 是一种分布式一致性算法，在 TiDB 集群的多种组件中，PD 和 TiKV 都通过 Raft 实现了数据的容灾。Raft 的灾难恢复能力通过如下机制实现：
   - Raft 成员的本质是日志复制和状态机。Raft 成员之间通过复制日志来实现数据同步；Raft 成员在不同条件下切换自己的成员状态，其目标是选出 leader 以提供对外服务。 
   - Raft 是一个表决系统，它遵循多数派协议，在一个 Raft Group 中，某成员获得大多数投票，它的成员状态就会转变为 leader。也就是说，当一个 Raft Group 还保有大多数节点 (majority) 时，它就能够选出 leader 以提供对外服务。

遵循 Raft 可靠性的特点，放到现实场景中：
   - 想克服任意 1 台服务器 (host) 的故障，应至少提供 3 台服务器。
   - 想克服任意 1 个机柜 (rack) 的故障，应至少提供 3 个机柜。
   - 想克服任意 1 个数据中心（dc，又称机房）的故障，应至少提供 3 个数据中心。
   - 想应对任意 1 个城市的灾难场景，应至少规划 3 个城市用于部署。

可见，原生 Raft 协议对于偶数副本的支持并不是很友好，考虑跨城网络延迟影响，或许同城三数据中心是最适合部署 Raft 的高可用及容灾方案。
