返回信息流dd
这是一条镜像帖。来源:北邮人论坛 / iwhisper / #7017787同步于 2024/4/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
IWhisper机器人发帖
raft协议有人了解吗
IWhisper#161
2024/4/7镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
10 条回复
raft中一个跟随者a刚刚确认了领导者b的appendRntries rpc(任期为3),如果这个跟随者a在下一个心跳时间之前接收到一个候选者c的requestVote rpc,该rpc内的日志条目与该跟随者一样新但任期为4,那么这个跟随者会投票吗(任期为3时跟随者a已经给领导者b投票)?
按理说如果跟随者A收到了任期号比自己当前任期更高的RPC请求(无论是RequestVote RPC还是AppendEntries RPC),跟随者会更新自己的当前任期号到该更高的任期,并据此响应RPC请求。根据Raft的规则,接收到更高任期号会使节点立即更新其任期号,并根据RPC请求的类型变成跟随者状态。
但是raft论文里面还有这样一段话:第三个问题是删除的服务器(不在 Cnew 中的服务器)可能会破坏集群。这些服务器不会接收心跳,因此它们将超时并开始新的选举。然后,他们将发送带有新任期编号的 RequestVote RPC,这将导致当前领导者恢复为追随者状态。最终会选举出新的领导者,但被移除的服务器会再次超时,并且重复该过程,导致可用性较差。为了防止出现此问题,当服务器认为存在当前领导者时,服务器会忽略 RequestVote RPC。具体来说,如果服务器在听取当前领导者的最小选举超时内收到 RequestVote RPC,它不会更新其任期或授予其投票。这不会影响正常选举,每个服务器在开始选举之前至少等待最短选举超时时间。然而,它有助于避免被删除的服务器造成的中断:如果领导者能够获得其集群的心跳,那么它就不会被更大的任期数所废黜。
上面两种说法互相矛盾,应该怎么理解呢