wenweihu86 / raft-java

Raft Java implementation which is simple and easy to understand.
Apache License 2.0
1.18k stars 406 forks source link

Leader 是否应该拒绝相同 term 的投票请求 ? #22

Closed qyvlik closed 4 years ago

qyvlik commented 4 years ago

Leader 是否应该拒绝相同 term 的投票请求 ? @wenweihu86 您的实现 RaftConsensusServiceImpl.requestVote 的实现: RaftConsensusServiceImpl.java#L67 是不对 Leader 做特殊处理。

例如: 当处理 requestVote 的 Node-A 的状态是 Leader,且 Candidate(Node-B) 的 term (1234) 与 Leader 的 currentTerm(1234) 相等。 这里有个疑问,如果 Node-A 通过了投票(符合投票要求),并 stepDown 为 Follower, 且 Node-B 成功当选 Leader,那么集群中就已经完成 Leader 更换,但是集群的 term(1234) 没有变更,这对于集群来说,是否会有问题? 让 Leader 直接拒绝 相同 term 的投票请求是否会更好?

wenweihu86 commented 4 years ago

term相同时,会比较log的term和index。

qyvlik commented 4 years ago

@wenweihu86 我在实现 raft 的时候,有如下几个疑问: 在这个情景下,集群完成 Leader 更换,但是集群的 term(1234) 没有变更,这对于集群来说,是否会有问题? 如果让 Leader 直接拒绝 相同 term 的投票请求,又有可能丢失日志。

wenweihu86 commented 4 years ago

candidate在发起投票时,会把currentTerm++的,所以不会出现candidate和leader的term一样大的。

qyvlik commented 4 years ago

@wenweihu86 谢谢解答,我再去看看论文和其他人的实现

SuperChrisliu commented 4 years ago

@qyvlik 你不是搞Qt的吗...