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

0ecd94da4f7e938a3bc94ae88f34169e.png

这个问题也太好了,涉及到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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值