# Raft: In Search of an Understandable Consensus Algorithm 和Viewstamped Replication类似. Raft将一致性算法分成三个子问题: - Leader election - Log replication - Safety 几个特点: - 强Leader - 日志只从Leader向其它机器发 - Leader选举: - 使用随机计时器消除选举冲突 - Membership变更 rpc接口: - `RequestVote` - Candidate在选举期间发起 - `AppendEntries` - Leader发起 节点的三种状态(角色): - Leader - Candidate - Follower leader election 两个超时时间: - election timeout - follower 等待直到leader消息, 直至变成candidate - 随机150ms~300ms不等 - 超时时间到, follower变成candidate, 增加election term, 开始新的选举 - 其它节点收到vote请求, 发现这个歌election term还没有投票, 那么就投给他 - 收到多数票, 就成了Leader - heartbeat timeout - leader向follower发送append请求, follower响应这次请求 - 以一定的间隔发送. 状态迁移: | cond | from | to | |--|--|--| | follower收不到leader的消息 | Follower | Candidate | | candidate发起投票,收到多数票| Candidate | Leader | Log Replication, 一次状态变更的流程(两次沟通) - leader把日志append到本地 - leader向follower发送日志 - leader等待多数节点确认日志的append - leader确认commit这次变更, 修改本地状态 - leader向follower发送commit通知 -