raft论文笔记

raft论文笔记

使用目的:Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,是用来管理复制日志(replicated log)的一致性协议。

复制状态机:复制状态机用于解决分布式系统中的各种容错问题。通常使用复制日志实现,每个服务器存储一个包含一系列命令的日志,其状态机按顺序执行日志中的命令。 每个日志中命令都相同并且顺序也一样,因此每个状态机处理相同的命令序列。 这样就能得到相同的状态和相同的输出序列。

State

Persistent state on all servers:

currentTerm     latest term server has seen (initialized to 0 on first boot, increases monotomically)
 voteFor    candidateId that received vote in current term (or null if none)
 log[]          log entries; each entry contains commend for state machine, and term when entry was received by leader ( first index is 1)

Volatile state in all servers:

commitIndex     index of highest logentry known to be committed ( initialized to 0, increases monotonically)
lastApplied index of highest log entry applied to state machine (initalized to 0, increases monotonically)

Volatile state on leaders:

nextIndex[] for each server, index of the next log entry to send to that server (intialized to leader last log index +1 )
matchIndex[]    for each server, index of highest log entry konwn to be replicated on server (initalized to 0 increases monotonically)

RequestVote RPC:
Invoked by candidates to gather votes

Arguments:

term    candidate's term
candidateId candidate reqyesting vote
lastLogIndex    index of candidate's last log entry
lastLogTerm     term of candidate's last log entry

Result:

term    currentTerm, for candidate to update itself
voteGranted true means candidate received vote

Receiver implementation:

1. Reply false if term < currentTerm
2. If voteFor is null or candidateId, and candidate's log is at least as up-to-date as receiver's log, grant vote

AppendEntries RPC
Invoked by leader to replicate log entries; also used as heart beat

Argument:

term    leader's term
leaderId    so follower can redirect clients
prevLogIndex    index of log entry immediately preceding new ones

prevLogTerm term of prevLogIndex entry
entries[]   log entries to store(empty for heartbeat; may send more than one for efficiency)

leaderCommit    leader's commitIndex 

Results:

term    currentTerm, for leader to update itself
success     true if follower contained entry matching prevLogIndex and prevLogTerm

Receiver implementation:

1.Reply false if term < currentTerm
2.Reply false if log doesn't contain an entry at prevLogIndex whose term matches prevLogTerm
3.if an existing entry conflicts with a new one (same index but different terms), delete the existing entry and all that follow it
4.Appebd any new entries not already in the log 
5.If leaderCommit > commitIndex, set commitIndex = min(leaderCommit, index of last new entry)

Rules for Servers

All Servers:

  • If commitIndex > lastApplied: increment lastApplied, apply log[lastAppied] to state machine
  • If RPC request or response contains term T > currentTerm: set currentTerm = T, converetf to follower

Followers:

  • Respond to RPCs from candidates and leaders
  • If election timeout elapses without receiving AppendEntries RPC from current leader orr granting vote to candidate: convert to candidate

Candidates:

  • On conversion to candidate, start election:

    • Increment currentTerm
    • Vote for self
    • Reset election timer
    • Send RequestVote RPCs to all other servers
  • If votes received from majority of servers: become leader

  • If AppendEntries RPC received from new leader: convert to follower

  • If election timeout elapses: start new election

Leader:

  • Upon election: send initial empty AppendEntries RPCs(heartbeat) to each server; repeat during idle periods to prevent election timeouts

  • If command received from client: append entry to local log, respond after entry applied to state machine

  • If last log index >= nextIndex for a follower: send AppendEntries PRC with log entries starting at next Index

    • If successful: update nextIndex and matchIndex for follower
    • If AppendEntries fails because of log inconsistency: decrement nextIndex and retry
    • If there exists an N such that N > commitIndex, amajority of matchIndex[i] >= N, and log[N].term == currentTerm: set commitIndex = N

Election Safety: at most one leader can be elected in a given term.
Leader Append-Only: a leader never overwrites or deletes entries in its log; ig only appends new entries.
Log Matching: if two logs contain an entry with the same index and term, then the logs are identical in all entries up through the given index.
Leader Completeness: if a log entry is committed in a given term, then that entry will be present in the logs of the leaders for all higher-numbered terms.
State Machine Safety: if a server has applied alog entry at a given index to its state machine, no other server will ever apply a different log entry for the same index

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。