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
推荐阅读
- 为啥这个算法误差的看起来这么小
- 使用算法帮助人们筛选reader的信息是否存在可能
- 请问如果想成为算法工程师的话,大学选专业是选软件工程好还是计算机科学与技术好。
- 神经网络算法是否真的属于人工智能范畴
- 以算法为例,是否存在讲解者认为“懂得自然懂了,不懂的我说再多也白搭”的心理
- 豆瓣FM的推荐算法还有哪些可以改进的地方
- 如果已确定图像中物体的位置, 常用的目标分割和提取算法有哪些
- Minecraft 开动态模糊(motion blur)时 报错OpenGL 1283(堆栈溢出)
- Minecraft中通过定义具体继承的方块类来存储方块的额外属性,咋通过编写API改进这种方法
- 请问只靠优化软件可以提高手机信号质量吗就是说不改变基带芯片和天线设计,信号质量可以靠算法优化吗
