正如论文中所介绍的,我们使用空的 AppendEntries RPC 进行心跳。那么RequestVote RPC呢?当 FOLLOWER 或 CANDIDATE 收到 RequestVote RPC 调用时,是否也要重置选举超时?为什么或为什么不这样做?
我认为的一个好处是,当 RequestVote RPC 调用也被视为心跳时,我们可以潜在地防止多个候选条件。由于多个候选人可能会分裂选票,并且在选举阶段需要更长的时间。通过将其用作心跳,来自一名候选人的 RequestVote RPC 调用将重置选举计时器,以便其他实时对等方不太可能超时并成为候选人。
好吧,它可能没有任何本质上不安全的地方。But the problem is nodes that can't win an election can still start one. 因此,如果一个无法获胜的节点开始选举并请求所有其他节点的投票,重置它们的计时器将阻止选举。由于无法获胜的候选人首先启动了它的计时器,它也可能会超时并先开始另一次选举,从而再次阻塞集群,并再次进行选举,依此类推。
当然,解决此问题的方法可能是仅在投票时重置选举超时。这可能是安全的。毕竟,选举超时无论如何都是随机的。但问题是它是否有效。它不会阻止分裂投票,因为它不会阻止多个节点同时请求投票,并且在分裂投票期间,它只会使选举花费更长的时间。由于这个原因,我怀疑预投票协议的效率要高得多,并且可能会避免分裂投票以及可以避免的分裂投票。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句