server的规则
全部server:
若commitIndex > lastApplied: 增加lastApplied,将log[lastApplied]提交给状态机
若RPC请求或回应一个包含大于currentTerm 的 term T,那么设置currentTerm = T, 变成一个follower
followers:
响应candidates和leaders的rpc
如果election超时了,但没有收到当前leader的appendentries rpc或candidate的授权vote,转成一个candidate
candidates:
一旦变成一个candidate,开始选举:增加currentTerm、自我投票、重设选举计时器、向其他所有server发送requestvote rpc
若收到大多数servers的投票:变成leader
若收到新leader的appendentries rpc:变成follower
若选举超时:开始新的选举
leaders:
在选举中:发送初始的空appendentries rpc(心跳)给每个sever;在空闲事件内不停重复防止election超时
若收到client的命令:向local log中append entry, 在entry加入到state machine后进行respond
若一个follower的last log index >= nextindex,发送一个以nextIndex开始的带有log entries的appendentries rpc;若成功,为follower更新nextindex和matchindex;若appendentries因为log的不一致而失败,减少nextindex并retry
若存在一个N,使得N > commitIndex, 并且大多数的matchIndex[i] >= N, 且 log[N].term == currentTerm: 令
commitIndex = N
5.1raft基础
一个raft集群包含几个servers;5是一个经典的数字,这就使得系统可以容错2个。在任何时间,每一个server都处于以下三个状态:leader、follower、candidate。在通常的 *** 作中,只有一个leader,剩余的servers都是followers。followers很被动哦,它们自己不处理任何请求,只是很简单地从leader和candidates中进行请求的响应。leader咧,就会处理所有client的请求(如果client不小心联系到了follower,follower就会重定向给leader,真听话hhh)。candidate就是用来选取一个新的leader的(5.2节会讲),图4展示了几种关系和它们的转化。
follower仅仅对其他server的请求做出响应。若一个follower没有收到任何信息,他就会变成一个candidate然后初始化一个election。candidate若收到大多数的投票就会变成新的leader。leader一直运行直到它们失效。
raft将时间切分成任意长度的terms,如图5所示。
时间被分给成terms,每一个term都以一个election作为开始。在一个成功的election之后,一个单一的leader掌管集群直到term结束。有时候elections会fail,这样的话这个term就没有选到一个leader而结束了。terms之间的过渡会被不同的servers在不同时间观测到。
terms用连续的数字做标记。每个term都以一个election开始,在这时候一个或多个candidate都争相恐后地想成为leader(5.2节细讲)。如果一个candidate获胜,那么它将在这个term的剩余时间里成为leader。在某些情况下,一个election会以分裂的投票收尾,这样就会导致这个term没有leader。这样,一个新的term就会很快开始。raft保证,在一个给定的term里面最多只有一个leader。
不同的server可能在不同时间观测terms之间的间隙,在某些情况下server可能观测不到一个election或者整个terms。terms在raft扮演的是一个逻辑时钟,它们允许server去访问过时的信息例如过期的leader。每一个server都存折一个当前term的数字,随着时间的增加就会动态增加。current terms在server通信的时候将会被交换;若一个server的current term比另一个的小,那么它就会将其current term更新到更大的。若一个candidate或是一个leader发现自己的term过时了,他就会很自觉地马上变成一个follower(免得误人子弟)。若一个server收到一个过期的term数字,它就会拒绝!!
raft server通过rpc(remote procedure calls)进行通信,基本的共识算法只需要两种类型的rpc。requestvote rpc在选举过程中被candidates进行初始化,appendentries rpc被leader初始化,用来复制log entries和提供心跳(5.3节)。第7节增加了第三种rpc,用来传输servers之间的快照。server如果在一个合理的时间中没有收到回应,它们就是重试rpc,并且它们并行地处理rpc为了更好的性能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)