给既有共识系统加上一轮往返快路径

原题:Jetpack: Consensus Made Generally Fast

一句话总结:Jetpack 不替换原共识协议,而是在旁边加一条利用命令可交换性的 1-RTT 快路径;真正的贡献不只是“同时发送两份请求”,而是给出跨换主仍然安全的条件、恢复流程和六个系统的适配证据。

问题与动机

Raft、MultiPaxos 一类领导者协议通常要让客户端付出 2 个网络往返:请求先到领导者,领导者再复制到多数副本。EPaxos、SwiftPaxos 等原生快协议能把常见情况降到 1 RTT,但快路径和协议内部状态紧密绑定,成熟数据库很难整体替换共识层。

把一个 Fast Paxos 式“网关”简单放在前面也不够。所有请求若必须先经过网关,原系统的批处理、慢副本容忍等能力就会被绕开。若快路径和原路径完全并行,又会出现更隐蔽的问题:旧领导者对快路径作出的排序承诺,可能在换主后丢失,新领导者于是把冲突命令放到已经回复客户端的命令之前。论文把它称为换主隐患(view-change hazard)。

关键观察 / 隐含假设

  • 观察 1:快路径只需约束冲突命令。 可交换命令交换执行顺序不会改变结果,因此客户端可以先按快路径返回;冲突命令仍交给原协议排序。
  • 观察 2:真正的复用边界是原协议的“提议顺序”。 Jetpack 要求同一提议者按收到顺序提议命令(PR2),且同一提议者的提议顺序最终成为日志或执行顺序(PR1)。论文调查了 OSDI/SOSP 2000 年以来的 16 个共识系统:去掉已有快路径的 6 个后,剩余 10 个中 9 个满足 PR1,EPaxos 是例外;所调查系统均满足 PR2。
  • 观察 3:稳定期安全不代表换主安全。 快提交命令必须在新 view 中可恢复(R1),而且恢复必须先于任何与它冲突的新 view 命令(R2)。这两个条件解释了 CURP 的 Raft 草案、Xline 和 Carousel 式适配为何容易遗漏边界。
  • 假设 1:应用能给出正确的冲突判定。 Jetpack 把 Conflict(A, B) 交给应用定义。漏报冲突会直接破坏执行一致性,而不仅是降低性能。
  • 假设 2:故障模型是崩溃故障。 论文不处理拜占庭故障,也不支持命令之间需要交互的事务;每个命令被视为独立操作。

核心方法

正常运行时,客户端把同一命令同时发往 Jetpack 快路径和原路径,先收到哪条路径的成功回复就采用哪条。快路径在副本上先检查命令池中是否有冲突;若没有,它还必须拿到原路径所有提议者的排序承诺。对可容忍 f 个故障的配置,快提交需要 f + ceil(f/2) + 1 个副本确认。任何冲突、拒绝或故障都不会阻塞请求,原路径继续完成普通共识(§3,图 2–4)。

这个设计依赖两条跨 view 原则。第一,快路径维护独立 view,并且一次快提交使用的全部确认必须来自同一 view。第二,新 view 在接收新命令前,必须恢复上一正常 view 的快命令,并通过原路径提交至少一条记录作为稳定标记。完整恢复分三步:冻结旧快路径;用 Paxos 在多数副本间确定恢复集合;把集合重新提交到原路径,若集合为空则提交 no-op,完成后才恢复服务。朴素流程要 3 RTT;附录 B 通过只传元数据、按需取命令并合并独立 RPC,将换主前置通信压到 2 RTT。

Jetpack 作为与副本同机的 shim:维护未回收命令池、向所有原路径提议者转发命令、观察原路径回复后回收状态。Copilot、Mencius 这类多序列协议可能把同一命令放进多个序列,因此执行时只保留第一次出现的位置。客户端还根据最近 100 个请求的快慢路径延迟和 CPU 使用率调整尝试率;首次 5 个请求走快路径,之后至少保留 5% 探测,在接近饱和时主动退回原路径(§5、附录 C)。

实验与结果

  • 范围与设置:作者把 Jetpack 接到 Raft、Copilot、Mencius、MongoDB、etcd 和 ZooKeeper,并为六种适配编写 TLA+ 模型检查换主安全。实验覆盖 10 个 AWS 数据中心,5 个放副本、10 个放客户端;每台实例为 8 vCPU、16 GB。默认是 60 个开环客户端、100 万个 Zipf key、50% 读和 50% 写,并扫倾斜度与 key 范围(§6.1–§6.2)。
  • 端到端延迟:自适应 Jetpack 把 Raft、Copilot、MongoDB、etcd、ZooKeeper 的平均提交延迟分别降低 53.39%、63.90%、39.06%、42.36%、52.59%(图 7、图 16)。摘要把最大收益概括为 60%,而具体 Copilot 实验给出 63.90%。Mencius 的收益较小:10 个客户端区域中有 5 个已与提议者同地,且任一副本故障都会让其快路径不可用(§6.3–§6.6、附录 E)。
  • 吞吐与原生快协议:低负载下,Jetpack-Raft、CURP、SwiftPaxos、EPaxos 的延迟都在 165–210 ms,Raft 约为 355 ms。吞吐峰值则不同:Raft、Jetpack-Raft、CURP 约 12k ops/s,SwiftPaxos 约 19k,EPaxos 约 25k。插件化带来接近原生快路径的低载延迟,但没有后两者深度改写复制路径后的吞吐优势(§6.3.1,图 10)。
  • 冲突、饱和与组合性:冲突增加时快提交成功率下降,但四个主案例的平均和 P99 延迟仍优于原系统。50/50 读写且 Zipf theta=1 时,真正受益请求占比为 Raft 65.91%、Copilot 64.53%、Mencius 18.87%、MongoDB 34.66%。自适应策略在饱和处收回快路径,使吞吐曲线回到原系统;Akkio 风格 73/8/9/7/3% 地域访问实验还表明它可与领导者就近和读 lease 叠加(图 7–8、图 11、附录 F)。
  • 故障与适配成本:领导者故障后,Raft+Jetpack 在选主完成后多用约 1 秒恢复快命令,MongoDB 多用约 1.5 秒(图 9)。MongoDB、etcd、ZooKeeper 的原协议服务器侧改动分别为 60、68、52 行;但这不包含 Jetpack shim、本地冲突逻辑和为每种协议验证恢复语义的成本(§6.1)。
  • 资源边界:在自适应 50/50 工作负载下,额外内存为 5.61–38.86 MB;除 Mencius 外,额外 CPU 为 3.03–9.57 个百分点。Mencius 的额外 CPU 达 36.83 个百分点。附录 G 证明:若要保持客户端 1 RTT、顺序一致且不侵入原协议,共享日志的 M 领导者方案必须让每条命令进入所有领导者序列,处理成本至少为 Omega(M)(图 13、定理 4)。

论断—证据表

论断直接证据证据边界置信度
既有领导者协议可增加 1-RTT 快路径六个系统的实现与 TLA+ 模型;Raft/Copilot/MongoDB/etcd/ZooKeeper 均有明确延迟下降只覆盖满足 PR1/PR2 的崩溃容错协议
跨换主承诺可以保持安全§4 的两条原则,附录 B 对 durability、execution consistency、linearizability 的证明证明把正确 Conflict、原协议 A1–A4 和适配正确性作为前提
不使用快路径时不损伤原路径图 7、图 16 中 0% 尝试率与原系统曲线接近;饱和时自适应模式回退这是所测工作负载下的性能结论,不等于零代码或零故障恢复开销中强
插件化延迟可接近原生快协议图 10 的低载延迟均为 165–210 ms峰值吞吐仍明显低于 SwiftPaxos、EPaxos
方法适用于主流实践16 个研究系统的结构调查、六种实现和 DB-Engines 多分片领导者模式讨论调查范围有限,EPaxos、BFT、交互式事务不适用

批判性分析

论证链条

论文最扎实的地方是把“插件快路径”拆成可检查的安全义务:正常期承诺、换主时 R1/R2、同 view 确认、恢复后稳定标记,再把证明落到线性一致性。实验也分别回答了“能否接入”“能否降低延迟”“不用时是否退化”。不过,从模型检查到生产实现之间仍隔着一层:每个宿主协议的日志截断、成员变更、弱一致读和恢复钩子都需要单独解释,少量改动行数不能替代适配证明。

假设压力测试

最应压力测试的是冲突判定和 PR1/PR2。若应用把两个实际冲突的操作当作可交换,客户端可能看到无法由最终日志重现的结果。若协议允许后收到的命令先进入可执行顺序,Jetpack 的承诺也不成立。其次,成员频繁变化或长时间反复换主会让 2-RTT 恢复和稳定标记成为可用性瓶颈;论文只给出单次故障曲线。

实验可信度

六种协议、统一 AWS 地理分布测试、原生快路径对照、冲突和失败实验让主结论有较强支撑,且具体数字能定位到图表。限制是大部分实现运行在研究代码或受控 EC2 环境中;MongoDB、etcd、ZooKeeper 虽是生产系统代码库,论文没有给出真实线上流量、长期故障率或成员变更数据。TLA+ 说明所建模型中没有反例,不等于 C++/数据库实现已经被形式化验证。

系统性缺陷

Jetpack 用额外广播和重复处理换延迟,本质上没有消除工作,只是把工作并行化。单领导者时成本尚小,多领导者时 Omega(M) 是结构限制;高冲突、高 CPU 或本地领导者场景下,快路径价值迅速下降。换主期间必须冻结并恢复快命令,也延长故障停顿。更根本的是,框架把语义正确性的一部分交给应用的冲突函数,这使“通用”只能理解为协议结构通用,而不是无需领域知识的即插即用。

局限与后续工作

  • 支持 BFT、交互式事务、动态成员变更,并明确它们对 quorum 和恢复顺序的影响。
  • 让冲突函数可验证或由事务读写集自动生成,避免应用语义错误破坏安全性。
  • 在长期生产流量中测量换主频率、冗余网络流量、功耗和尾延迟,而不只看平均提交延迟。
  • 为多领导者系统探索允许原协议感知快路径的联合设计;它会牺牲“非侵入”,但可能突破 Omega(M) 的重复处理成本。

相关