raft算法中,5.4.2节一疑问

年更
先说结论,这个no-op是raft对paxos的phase2a的一个非常巧妙的优化,能显著降低实现复杂度,减少phase2a的通信量。当然这个优化需要和raft的其他特性结合在一起才能发挥其威力:选主条件、日志连续以及顺序commit。
下文中提到的proposal id在各种paxos变种中,名称有可能不同,multi-paxos里叫proposal id,zab里叫zxid,raft里叫term。这里为了简化讨论,我们统统叫 proposal id。
在对paxos有更多的了解后,我现在理解paxos的两阶段有各自非常明确的目标:
Phase1: 找到系统所有可能committed的条目;
Phase2:努力促成一阶段找到的条目得以最终committed。
在具体的工程实践中,paxos的各种变种协议的实现方式有所不同:
以multi-paxos为代表:成为主后,有个专门的流程用于获取这些条目,然后以新的proposal id对这些条目发起accept请求。以viewstamped(比paxos还早一年发布)为代表:在选主流程中获取这些条目,然后以新的proposal id对这些条目发起accept请求。以raft为代表:不需要获取,选出的新主,天然就有一阶段所需要的条目,然后以新的proposal id发起no-op,可能促成条目以旧的proposal id得以comitted。可以看出,前两者需要对一阶段获取的条目,以新的proposal id发起新的accept请求,影响的条目数和复制状态机的log数组长度成正比。假设log数组的长度为n,复杂度是O(n)级别。
而raft只需要一条no-op请求,因为日志连续,顺序commit的特性,no-op最多只会促成一个条目得以committed,影响的条目数和复制状态机的log数组长度无关,复杂度是O(1)级别。
从对比可以看出,raft和前两者相比,phase2a的通信量由O(n)降低成O(1),优化是十分明显的。至于前两者为什么需要以新的proposal Id对一阶段获取的条目发起新的accept请求,和no-op的额外作用是一致的,避免已经committed的条目被覆盖。
总结raft选主后的no-op操作不仅实现简单,而且对paxos的phase2a的性能提升明显,因此我认为是一个比较巧妙的设计。可是这是建立在raft选主条件,日志连续以及顺序commit以及的前提下才能达成:选主条件保证了新主一定有最全的log,不需要再额外拉取可能committed的条目;日志连续以及顺序commit保证了no-op最多只会促成一个条目得以committed,通信数量是O(1)级别。
不过任何工程都是trade off的结果,raft虽然将phase2a的通信量的复杂度减少到O(1),可是实际上却是将成本分摊到每一次写上了(;′⌒`),因此,raft的读写性能是要比支持乱序commit的paxos差的,不过好在易于理解和实现。
=========================我是分割线================================
首先回答问题。2,3,4是leader任期内接受客户端请求时的currentTerm,最上方是log index,单调递增。那么index为2的log 完全有可能来自多个客户端的不同请求。他们是无关的。
5.4.2章节主要在解释raft为什么不能直接commit old term replicate的log,即使这条log满足多数派的条件(而不是不会提交之前term的日志)。
我们来看看Figure8的解释,以old term提交日志会有什么风险,以及应该怎么避免。下图中的提交均指的是commit
In (c) S5 crashes; S1 restarts, is elected leader, andcontinues replication. At this point, the log entry from term 2has been replicated on a majority of the servers, but it is notcommitted如果在图c,S5挂掉,S1重启并重新当选leader,currentTerm是4(注意:此时有可能因为网络分区,S5并不知晓),如果允许以old term 提交日志的话,index=2,term=2的日志在满足多数派条件后,就会被提交并让用户可见。
If S1 crashes as in (d), S5 could be elected leader(with votes from S2, S3, and S4) and overwrite the entry withits own entry from term 3


推荐阅读