目录服务器
- 三个状态
- 什么是任期
- 节点之间的通讯
1. 三个状态
Raft 设计了 3 个状态,用于表示节点的状态,分别是跟随者,候选者,领导者。设计
- 领导者:一般只有一个领导人,而且其余节点都是跟随者。
- 跟随者:跟随者不会发送任何请求,只是简单的响应领导者或者候选人的请求,由领导人处理全部的客户端请求(若是客户端请求了跟随者,那么跟随者会将请求转发给领导者)
- 候选者:选举新的领导人时使用。
3 个角色的转换关系和流程:日志

能够看到,这张图里的几个概念:blog
- 初始化:全部服务器启动时,都是跟随者
- 超时:当初始时, 没有收到领导人的心跳,便开始选举。若是候选者选举的时候,也超时了,便从新选举。
- 大多数的选票:成为领导人的关键是 —— 获取大多数服务器的选票,能够看作是鸽笼原理。
2. 什么是任期
目录:集群
- 2 个阶段
- 任期
- 服务器之间的通讯
背景:因为机器的物理时间是不可靠的,因此须要一个逻辑时间。称之为任期(term)。原理
从 2 个阶段开始提及:随机数
集群节点一般有 2 个节点:请求
- 选举阶段
- 领导者正常运行
例外:当选举失败,会进行加时赛,即连续有 2 个选举过程。方法
见下图:im

图 2 可见任期 3 选举失败,而后进行了从新选举。
从新选举会继续失败吗?
答:若是不作限制,是会理解失败的。
Raft 使用了一个限制来规避:每台服务器在选举的时候,使用一个随机数(150 -200),即每一个服务器在不一样的时间发出选举。防止冲突。称之为“加时赛”。
任期号
在上文中说道:因为机器的物理时间是不可靠的,因此须要一个逻辑时间。称之为任期(term)。
有关任期的几个特色:
- 节点有可能观察不到任何一次选举或者任期。
- 任期充当逻辑时钟,服务器节点能够经过任期号查明过时的领导者或过时的信息。
- 每一个节点存储当前任期号,单调递增。
- 服务器之间的每次通讯,都会交换当前任期号,交换任期号的目的: 4.1 若是一个服务器的当前任期号比其余人小,则更新本身。 4.2 若是一个候选人或者领导人发现本身的任期号过时了,马上将本身变成跟随者状态。 4.3 若是一个节点收到一个过时的任期号的请求,直接拒绝。
3. 节点之间的通讯
服务器之间经过 RPC 通讯,即远程方法调用。
在 Raft 中,RPC 分红 3 种:
- 请求投票: RequestVote 由候选人在选举任期发起
- 附加条目 AppendEntries 由领导人发起,用来复制日志和提供心跳。
- 为了传输快照单独增长的 RPC。
备注:当服务没有及时收到 RPC 的响应时,会发起重试。
Summary
- 3 个状态的意义和他们之间切换
- 任期的设计背景,任期在节点通讯时的做用,任期在增加策略。
- 节点直接的通讯 RPC 类型以及策略。