导图社区 ETCD-02-Raft模块
ETCD中的Raft状态机,包括stepLeader、stepCandidate、stepFollower、send发送信息几个方面的阐述。
ETCD的网络层思维导图,包括RaftHttp模块和HttpServer的启动流程。供大家学习参考。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
Raft状态机
func (r *raft) Step
消息的Term值大于本地Term: m.Term > r.Term
消息类型为MsgVote或MsgPreVote
检查是否force,inLease
MsgPreVote消息
MsgPreVoteResp消息,且没有拒绝
MsgApp消息,MsgHeartbeat消息,MsgSnap消息
becomeFollower(m.Term, m.From)
其他消息
r.becomeFollower(m.Term, None)
m.Term < r.Term
如果是MsgHeartbeat消息、MsgApp消息,且(r.checkQuorum || r.preVote)
调用r.send发送MsgAppResp消息
忽略其他类型消息
判断消息类型
MsgHup
preVote
真,开始预选举r.hup(campaignPreElection)
假,开始选举r.hup(campaignElection)
MsgVote, MsgPreVote
判断是否可以投票canVote
可以,调用r.send发送投票响应消息
MsgVoteResp
MsgPreVoteResp
不能投票,则调用r.send发送拒绝消息
其他类型
调用相应角色的step函数r.step(r, m)
stepLeader
不需要消息来源m.From的progress
pb.MsgBeat
bcastHeartbeat
bcastHeartbeatWithCtx
sendHeartbeat
发送心跳消息MsgHeartbeat
pb.MsgCheckQuorum
检查是否QuorumActive
否,则becomeFollower
pb.MsgProp
遍历消息中Entries,检查是否有配置变更
可能会更新pendingConfIndex
复制日志appendEntry
获取raftLog的lastIndex
increaseUncommittedSize
调用raftLog的append追加日志
在收到follower的MsgAppResp后调用MaybeUpdate
调用maybeCommit更新commit index
向所有peers广播rpc消息,复制日志bcastAppend
向给定的peer发送append消息sendAppend
maybeSendAppend带着new entries和current commit index
如果获取term和entries失败则发送snapshot
发送entries和committed
调用raft.send发送消息
pb.MsgReadIndex
如果该leader在其***中没有commit任何日志项,则不能返回响应
暂存到pendingReadIndexMessages
返回响应sendMsgReadIndexResponse
ReadOnlySafe
ReadOnlyLeaseBased
需要消息来源的progress
pb.MsgAppResp
判断Reject
真
如果m.LogTerm > 0
调用findConflictByTerm,赋值给nextProbeIdx
MaybeDecrTo
如果pr.State == tracker.StateReplicate
BecomeProbe
sendAppend
假
如果MaybeUpdate
如果pr.State == tracker.StateProbe
BecomeReplicate
如果pr.State == tracker.StateSnapshot && pr.Match >= pr.PendingSnapshot
FreeLE
如果maybeCommit
releasePendingReadIndexMessages
bcastAppend
异常处理
pb.MsgHeartbeatResp
FreeFirstOne
readOnly.advance
处理responseToReadIndexReq,调用r.send发送响应消息
pb.MsgSnapStatus
pb.MsgUnreachable
pb.MsgTransferLeader
abortLeaderTransfer
r.sendTimeoutNow(leadTransferee)
r.sendAppend(leadTransferee)
stepCandidate
MsgProp
MsgApp
becomeFollower
handleAppendEntries
MsgHeartbeat
handleHeartbeat
MsgSnap
handleSnapshot
MsgPreVoteResp, MsgVoteResp
poll统计选票
VoteWon
如果r.state == StatePreCandidate
campaign(campaignElection)
否则
becomeLeader
VoteLost
MsgTimeoutNow
stepFollower
转发消息给leader
r.send
MsgTransferLeader
r.hup(campaignTransfer)
MsgReadIndex
MsgReadIndexResp
Send发送消息
把persisting state存储到stable storage,接着发送消息(作为下一次Ready消息处理的一部分)
Raft日志
unstable
stable即memoryStorage
raftLog