这个问题也太好了,涉及到Paxos和Raft的原理以及优化。
先肯定题主的理解,是正确的。
- Raft的一致性检查,是Follower接受某个日志项的条件,也确实是控制Raft串行协商的关键之处。
- Paxos是争取某个key的写入权限(prepare阶段),也确实支持并发写。
既然这里是为了证明Paxos的并行协商不一定优于Raft的串行协商,所以这里不讨论采用串行协商带来的坏处,和并行协商的好处,另外这些也不难总结。
Raft的串行协商好处
但是以上两点并不代表Paxos的并行协商效率优于Raft串行协商效率。Raft的串行协商,带来了很多好处,例如:
- 将协商优化为“一阶段”提交,“提交阶段”通过心跳或者下一次来完整。
- 这一目的,必须要串行协商才能实现,因为“提交阶段”通过心跳来完成,必须要保证日志的连续性,而连续性必须是串行协商;
- 另外保证连续性,还需要引入Leader,需要一个权威的成员来统一处理写请求,才能保证日志的连续性。
- 检查差异性,检查两个成员之间的一段日志是否一致,不必通过checksum等机制来完成,只需要比较最大的日志项的term是否一致即可。
- 读请求优化,保证线性一致性读,通常需要read log来完成。但是Raft是串行协商的,并且引入了Leader,可以有很多优化方案,例如:Leader Read,Follower Read,Lease Read。
这里不讨论采用串行协商带来的坏处,但是可以简单提一提:引入Leader,降低了可用性;Leader成为性能瓶颈;浪费大量的计算资源(单个协商,一定是吃不满所有的资源的)....
Paxos的并行协商坏处
并行协商确实给Paxos带来很多好处,例如,灵活性,优于Raft的可用性。但是单从协商效率来说,Paxos真不一定比得过Raft,有以下几个原因:
- 活锁,是指多个Proposer同时争夺某个key的写权限,陷入循环之中。
- 协商阶段较多,Paxos协商就需要两个阶段(prepare accept),另外需要一个提交阶段(confirm),当然可以优化prepare阶段。但是优化prepare阶段的条件,依旧是执行prepare阶段。
- 数据对齐,新成员上线或者要明确两个成员之间数据是否一致,需要对所有的key都执行一次paxos协商。
- 读请求,暂时只知道通过read log来实现。Leader Read,Follower Read,Lease Read是否能应用于Paxos,暂时还没有思考,可能能应用的条件也是需要引入一个中央权威成员吧。
Raft的串行协商是否能够优化?
题主其实无需苦恼串行协商,Raft本身就是一个优化后的算法,协商效率很高了,如果担心资源浪费,可以部署多个Raft组,让他们服务不同业务,使得达到并行协商的目的。
另外如果执着于并行协商,当然也有一些优化方案,例如:Parallel Raft。