当voiceFor为候选人Id时,为什么筏需要投票?

时间:2019-07-26 03:30:24

标签: consensus raft leader-election

我不确定我是否正确理解Raft中的RequestVote RPC详细信息。

在报纸上说

Receiver implementation:

1. Reply false if term < currentTerm (§5.1)

2. If votedFor is null or candidateId, and candidate’s log is at least as up-to-date as receiver’s log, grant vote (§5.2, §5.4)

当接收者接收到RequestVote RPC时,voteFor == candidateId在哪种情况下成立?候选人不会在同一期间内发送其他RequestVote RPC。如果重新开始选举,该任期将增加,因此接收者应转换为关注者并voteFor is null

在我以前的Raft实现中,我的逻辑如下:

If votedFor is null or me, and candidate’s log is at least as up-to-date as receiver’s log, grant vote 

尽管这显然是错误的,但它似乎可以正常工作,即领导者选举和发送requestVote可以稳定地工作。

任何建议将不胜感激,并在此先感谢

1 个答案:

答案 0 :(得分:0)

我相信这只是对网络数据包重复进行的完整性检查。 在理想情况下,在一个任期内,只有一条RequestVoteRPC消息会发送给对等方。

但是,由于网络可能处于许多不理想的状态,因此可以复制包含RequestVoteRpc的网络数据包,因此,您还需要以与检查对等方是否相同的方式来进行处理。已经授予您一票,所以您不必再数两次。