raft协议,leader在commit了一条日志后,立刻挂了,那其他节点如何处理这条日志?

发布于 2022-09-11 23:42:03 字数 217 浏览 16 评论 0

raft论文提到一旦日志被commit,那么大部分节点都会拥有这条日志,但问题是大部分节点只有当leader做了commit之后,才会commit到自己的状态机吧。假若leader在commit完一条日志后马上挂了,那其他节点肯定不知道这条日志已经被commit,那后续新的leader也不会把这条日志放进commited log中去。请问这样日志的一致性是怎么保证的? raft不是不能改写已经被commit的日志吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

把梦留给海 2022-09-18 23:42:03

挂了的话,等恢复就好了。自动复制的时候,就能发现自己的index不是最新的对不上,进行恢复

冬天旳寂寞 2022-09-18 23:42:03

1、首先给你一个网址:http://thesecretlivesofdata.c...,能够更加生动的看到Log Replication的过程。
2、Commit的定义是当集群中大部分的节点(一半以上)响应了Leader的Log Replication操作之后才会被Commited。否则,Leader是不会像Client发送提交成功的响应的。提交操作并未真正Commit,Leader会被阻塞在这里。
3、这种情况的发生一般来说都是因为Leader挂掉了或者网络分区了。Leader挂掉了的话在一个HeartBeat Timeout后系统会Re-select,新的Leader会更新自己的term-id,这时候Client一般是会重试的,也就是会向新的Leader提交成功。
4、当Leader恢复或者分区消失,恢复后的Leader发现集群存在更新的term-id,它会放弃leader地位并主动向新的leader进行同步,从而整个集群恢复到一致状态。

丑疤怪 2022-09-18 23:42:03
  1. 根据领导人完备性原则,已经提交的消息一定会在下一次的Leader中出现。
    图片
  2. 假若leader在commit完一条日志后马上挂了,新leader虽然不知道这条日志已经被commit,不会立即主动提交,但是它持有这条日志,当其发现这条日志复制到大多数follower上时,会进行commit
    图片
  3. 前面两条可以保证保证已提交消息不丢,接着要保证消息不重复。客户端每次提交操作的时候会对操作有一个唯一的id,然后发现leader挂了,对新的leader重试的时候也会带上同一个操作id,然后发现新leader发现id存在,不会重复操作,而是会把之前leader的消息返回。
    图片

最大的问题还是客户端如果宕机,没来得及重试,可能导致数据提交成功,但是客户端不感知,这就要想办法在客户端持久化序列号id,保证宕机重启后仍能提交。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文