raft 协议中, 新主存在未提交日志会怎么处理?
因为这个时候客户端已经认为成功了, 但是实际上可能没有成功, 这样不就不一致了么?
比如如下场景, 有client, leader, follower1, follower2几个角色, 日志同步到follower1的时候, leader会认为日志已经同步成功了, 然后告知client, 但是这个时候leader挂了, follower1成为了新主, 它发现了日志还没有提交, 之后, 它不能直接认为是提交了吧, 如果是的话, follower2还没有同步日志. 如果不是的话, client端拿到的信息就有问题了.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
最大的问题还是客户端如果宕机,没来得及重试,可能导致数据提交成功,但是客户端不感知,这就要想办法在客户端持久化序列号id,保证宕机重启后仍能提交。
raft提供Leader Completeness保证,即leader包含所有已经commit的log。在follower1成为新leader的情况下,follower1包含所有commit的log,此外raft还有一个隐含的保证——leader不会commit老term的log。follower1成为新leader,那么其term一定大于原来的leader,所以follower1不会去commit之前的log。又因为Log Matching保证,只要client有新的log发送给followe1,那么follower1在commit这个新的log的同时会commit之前的所有log(也就包括了最开始的leader的log)。详情可以阅读《In Search of an Understandable Consensus Algorithm (Extended Version)》 fig 3, fig 8和5.4 Safety。
类似2PC,只是同步还没有提交断了,那么就回滚。
客户端能得到几种保证,比如一个节点存储成功就返回,或者绝大多数节点存储成功。
你这里三个节点都是未提交的,断了一般是抛出异常,让客户端重试。。。