Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

对这段话有一些疑问,不是 term 更高就行么?如果没有 PreVote,网络恢复后 S2 会 became_leader 吧 #1

Open
isaacwong96 opened this issue Dec 18, 2024 · 6 comments

Comments

@isaacwong96
Copy link

isaacwong96 commented Dec 18, 2024

从上面可以看到,当节点 S2 重新回归到集群时,由于其 term 比 Leader 大,致使 Leader 降为 Follower,从而触发重新选主。而 S2 大概率不会赢得选举,最终的 Leader 可能还是 S1,因为在节点 S2 被隔离的这段时间,S1,S3 有新的日志写入,导致 S1,S3 的日志都要比 S2 新,所以这么看,这是一次没有必要的选举。
thxthx,打扰

@Wine93
Copy link
Owner

Wine93 commented Dec 19, 2024

从上面可以看到,当节点 S2 重新回归到集群时,由于其 term 比 Leader 大,致使 Leader 降为 Follower,从而触发重新选主。而 S2 大概率不会赢得选举,最终的 Leader 可能还是 S1,因为在节点 S2 被隔离的这段时间,S1,S3 有新的日志写入,导致 S1,S3 的日志都要比 S2 新,所以这么看,这是一次没有必要的选举。 thxthx,打扰

节点投赞成票需要同时满足以下 3 个条件:

  • term:候选人的 term 要大于等于自己的 term
  • lastLog:候选人的最后一条日志要和自己的一样新或者新于自己
  • votedFor:自己的 votedFor 为空或者等于候选人的 ID

关于第 2 个条件日志新旧比较:

日志由 term 和 index 组成,对于 2 条日志 a 和 b 来说:

  • 若其 term 和 index 都一样,则 2 条日志一样新
  • 若 (a.term > b.term) || (a.term == b.term && a.index > b.index),则日志 a 新于日志 b

当网络恢复后,S2 开始进行选举,但是各节点收到投票请求时,发现其只满足上述 3 个条件中的 2 个条件(即 1、3)。条件 2 之所以不满足,是因为在大多数实际场景中,网络分区产生的这段时间内,上层业务会不断写入数据,导致其他各个节点的日志都要比 S2 新。
当然,如果在这段网络分区的时间内,上层没有任何写入,那么 S2 是会成为 Leader 的。

参见<投票规则>。

@isaacwong96
Copy link
Author

之前我的理解有误,感谢楼主解惑

@Wine93
Copy link
Owner

Wine93 commented Dec 19, 2024

之前我的理解有误,感谢楼主解惑

不客气 :)

@isaacwong96
Copy link
Author

之前我的理解有误,感谢楼主解惑

不客气 :)

大佬对于流程的理解相当深刻,对我帮助很大,请教下是怎么学习的?是利用了 example?还是工作时深度使用了一段时间?或者硬看代码?

@Wine93
Copy link
Owner

Wine93 commented Dec 19, 2024

大佬对于流程的理解相当深刻,对我帮助很大,请教下是怎么学习的?是利用了 example?还是工作时深度使用了一段时间?或者硬看代码?

  • 学习应该是多方面的。工作应用、论文、源码都有吧,结合起来相互验证可能会好一些
  • 带着问题看源码也有帮助
  • 把学习的东西输出也会加深你的理解,得自己捋顺了才能输出(这个帮助比较大)

纯属个人见解哈,仅供参考。

@isaacwong96
Copy link
Author

大佬对于流程的理解相当深刻,对我帮助很大,请教下是怎么学习的?是利用了 example?还是工作时深度使用了一段时间?或者硬看代码?

  • 学习应该是多方面的。工作应用、论文、源码都有吧,结合起来相互验证可能会好一些
  • 带着问题看源码也有帮助
  • 把学习的东西输出也会加深你的理解,得自己捋顺了才能输出(这个帮助比较大)

纯属个人见解哈,仅供参考。

高手高手,大佬的方法论总结得很好

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants