raft算法中raft日志的复制流程
1) 客户端向Leader发送写请求
2) Leader将写请求解析成操作指令追加到本地日志文件中。
3) Leader 为每个Follower广播AppendEntries RPC
4) Follower 通过一致性检查,选择从那个位置开始追加Leader的日志条目。
5) 一旦日志项提交成功,Leader就将该日志条目对应的指令应用(apply)到本地状态机,并向客户端返回操作结果。
6) Leader 后续通过ApplendEntries RPC将已经成功(大多说节点上)提交的日志项告知Follower。
7) Follower收到提交的日志项之后,将其应用至本地状态机。
raft 算法设计了一下日志机制来保证不同节点上日志的一致性
1) 如果在不同的日志中有两个条目有着相同的索引和任期号,则它们所存储的命令是相同的
2) 如果在不同的日志中两个条目有着相同的索引和任期号,则它们之前的所有条目都是完全一样的。
leader 日志追加
leader的日志apply 后,会发消息告诉所有FOLLOWER进行apply
然后leader 进行commit 更改状态机的信息,leader 通过状态机的信息去确定数据的安全性(即是否达成多数派)
FOLLOWER进行commit 更改状态机的信息
VoteRequest RPC --只有候选者能调用的RPC
Append-Entries RPC --只有leader能调用的RPC
选举超时机制
候选人处于僵持阶段,会有候选人的超时设置,候选人超时后,会采用随机时间(150ms-300ms)重新发起选举,这个超时对应的是候选人
类似于选举超时时间,选举超时时间针对于Follower