Raft 中日志的一致性检查貌似会导致日志复制的串行化,这个在实际工程实践中有什么优化方案?

2022-11-29 15:03:11 浏览数 (2)

这个问题也太好了,涉及到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。

0 人点赞