1. 拜占庭将军

多个将军，信使可靠但有可能被杀的情况下，将军们如何达成一致性决定
> 选举出一个大将军，用来做所有决定

2. 共识算法

> 即使面对故障，服务器也可以在共享状态上达成一致

允许一组节点像一个整体一样一起工作，即使出现某些故障也可以继续工作

一般使用复制日志实现复制状态机，每一个 Server 存储一份包括命令序列


特性：
- **安全**，在非拜占庭条件下的安全性，包括网络延迟，分区，包丢失，复制和重新排序
- **高可用**，只要大部分服务器可操作，可通信，就可以与客户端进行通信
- **一致性不依赖时序**，错误的始终和极端的消息延迟，在最坏情况下也只会造成可用性，不会产生一致性问题
- **大多数服务器完成响应即可完成命令**，不被少数运行缓慢服务器影响整体性能

3. 节点类型

- `Leader`负责发起心跳，响应客户端，创建和同步日志,
- `Candidate`在Leader选举过程中的临时角色，由Follower转化而来，发起投票和参与竞选,
- `Follower`接受Leader的心跳和同步日志，投票给Candidate

4. 任期

将时间划分为任意长度的任期，用连续数字表示，每一个任期开始都是选举，如果没有选出Leader，进入下一个任期

5. 日志

- entry：每一个时间成为entry，只有Leader可以创建entry
- log：由entry构成的数组，每一个entry都有一个表明自己在log中的index

6. 领导人选举

使用心跳机制出发Leader选举，一个Follower在一个周期内

7. 日志复制

收到请求后，生成一个entry\<index，term，cmd>，将这个entry添加到日志末尾后向所有节点广播这个entry

Follower接受该entry会添加到自己日志后面，返回给Leader同意

如果大部分响应成功，Leader 将这个 entry 应用到自己的状态机中，然后这个 entry 就是 commited 的，并向客户端返回结果

Leader崩溃导致日志不一样，一致性检查失败，Leader强制Follower复制自己的日志处理不一致

8. 安全性

Leader需要保证自己存储所有已提交的日志，通过term和index确认日志新旧