TIPS Raft Committing entries from previous terms

本文是我对与Raft论文3.6.2节的理解。写这篇文章的原因是因为理解这段内容确实花了一些功夫。

面向对象:懂得Raft,同时也对3.6.2节有疑问,并且看了“参考”这里面几个之后还不是很清晰的同学。

NOTE: 3.6.2节是《CONSENSUS: BRIDGING THEORY AND PRACTICE》这篇论文的,对应《In Search of an Understandable Consensus Algorithm(Extended Version)》是5.4.2节。

看这篇文章之前先看一下Raft 5.4.2 Committing entries from previous terms的理解,如果看的懂得话,就不用再看这个了,否则再看看我的理解,是否能有帮助。

3.6.2这一节的正文和描述的问题就不再说一遍了,贴个图帮助查看吧。

Committing entries from previous terms
首先,这个图中描述的D1和D2都是可能存在的,它们都是“合法”存在的场景。
其次,这节内容的目的是想说明,Leader不能直接“提交”之前term(previous terms)的日志,不能按照“大多数”应答的逻辑去提交之前term的日志。只有当前term的日志,复制后收到了大多数节点的应答,才可以提交这个日志。但是之前term的,是不能“提交”的。那么,之前term的日志怎么提交呢?文中的说法是,follower节点的数据要保持跟leader节点一致。那么当follower满足接受当前最新日志的条件,并且接受了最新的日志,它的旧日志也要保持跟leader一致。如果最新的日志提交了,那么最新的日志之前的日志也就提交了。
最后,这里还描述了一个现象,就是大多数节点都有的日志,也不一定就是“提交”状态的日志,只有当前leader term发起的,大多数节点都有的,才可能是“提交”状态的日志。这里说的就是“黄色”index=2的日志。

另外,我翻阅了braft的代码,发现并没有对这种场景做特殊处理,更加印证了我的理解。

总结一下,很简单,就是leader不会直接“提交”之前term的日志,只会通过复制,提交当前term的日志。之前term的日志,都是通过Raft协议中描述的,新日志提交了,旧日志也一定提交了,这个顺序要求。

这种机制会带来一个问题,导致raft复制变慢。就是假设由于网络原因,集群的term增长了,但是原来的leader后来又选为leader了,那么这个leader是不能提交之前term的日志,只能等新的term的日志一起提交。

参考

  1. Raft 5.4.2 Committing entries from previous terms的理解

  2. raft算法中,5.4.2节一疑问

  3. Does this cause a real problem when I adopt the Raft’s “never commits log entries from previous terms by counting replicas” rule in this situation?

  4. How does raft handle committing entries from previous one?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值