为什么或为什么不使用 RequestVote RPC 作为 Raft 实现中的心跳?

Diyi Wang

正如论文中所介绍的,我们使用空的 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么glibc的fork实现不使用sys_fork?

为什么Java的String中的hashCode()使用31作为乘数?

为什么Sun Java中的HashSet实现使用HashMap作为支持?

为什么在部署中不使用断言

为什么不使用golang WSGI实现

什么是LLDB RPC服务器?什么时候在Xcode中崩溃?为什么会崩溃?

为什么使用数组作为键访问对象中的元素?

为什么在Redux中需要“操作”作为数据?

为什么std :: sort不使用我的operator <实现

在类型特征中,为什么人们使用枚举而不是静态const作为值?

为什么不使用模板实现新功能?

使用协议缓冲区在ZeroMQ中实现RPC

在Raft分布式共识中,我将votedFor设置为什么?

为什么使用我的类型作为外部类型的参数来实现外部特征合法?

尝试在Hyperledger Fabric 1.4.1中使用Raft共识但获得SERVICE_UNAVAILABLE-无Raft领导程序错误

为什么javascript将这些变量作为php中的对象?

Raft如何处理AppendEntries RPC中的延迟答复?

为什么不使用root用户作为默认用户

std :: add_const,为什么实现可作为参考?

为什么将此字符作为整数放入向量中?

为什么我们使用char *作为缓冲区,为什么不使用boost :: asio中的字符串呢?

为什么不使用SSD空间作为RAM?

为什么Object.equals()的实现不使用hashCode()?

为什么不使用备用元素作为“跳过列表”中的垂直搜索节点?

为什么不使用StreamProvider中的getUriFromFile?

为什么 RangeSlider 在 QtQuick 中可用而不是作为标准 Widget

为什么在注释中禁止 null 作为默认值?

Raft follower 应该在什么时候记录 RPC?

为什么 Docker CMD 在 GKE 中作为 chronos 运行?