首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >木筏如何保证一个领导人总是可以当选?

木筏如何保证一个领导人总是可以当选?
EN

Stack Overflow用户
提问于 2022-04-08 18:57:38
回答 1查看 60关注 0票数 1

木筏纸说:

Raft使用投票过程来阻止候选人赢得选举,除非它的日志包含所有提交的条目。候选人必须联系集群的大多数成员才能当选,这意味着每个提交的条目必须至少出现在其中一个服务器中。如果候选人的日志至少和其他大多数日志一样是最新的,那么它将保存所有提交的条目。RequestVote RPC实现了这个限制: RPC包含有关候选人日志的信息,如果它自己的日志比候选人的日志更最新,则投票者拒绝投票。

然而,它如何保证永远都会有一位可选举的领导人(也就是说,作为集群中大多数人的最新情况)?

例如,假设我们有一个由A、B、C三台服务器组成的集群,其中A是领头羊。第一个日志条目存储在A和B中,第二个日志条目存储在A和C中,然后A崩溃,B和C试图选择一个领导者。但在这一点上,没有大多数(即3台服务器中的2台)具有第一和第二项的服务器。因此,领导人选举似乎永远不可能发生(除非重新启动,但救生筏应该能够抵御每3台服务器中就有1台)的故障。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-08 20:25:12

本文定义了与此场景相关的“日志匹配属性”:

·.. 如果不同日志中的两个条目具有相同的索引和术语,那么前面所有条目中的日志都是相同的。

因为A和C都包含相同的第二个条目,所以C也必须包含第一个条目。确保这一点是因为:

第二个属性由AppendEntries执行的简单一致性检查来保证。在发送AppendEntries RPC时,先导在其日志中包含索引和条目,该条目紧接在新条目之前。如果跟随者在其日志中找不到具有相同索引和条件的条目,那么它将拒绝新条目。

直到C有了B的条目,它才会拒绝进一步的附加。因此,在您的场景中的某个时候,C必须接收到该条目才能最终接受来自A的较新的条目。

因此,C是B和C之间最新的(它将拒绝B.)的领导投票。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71801967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档