Skip to content

状态机复制

State machine replication · SMR

让多个副本按同一确定顺序执行命令,从而实现容错服务。

条目类型
应用

形式陈述

将服务建模为确定性状态机

δ:S×CmdS×Out,

并固定初始状态 s0。状态机复制要求所有正确副本从相同初态出发,以相同顺序取得命令 c1,c2,,并逐项应用 δ。于是对每个索引 i,应用到该位置的副本具有相同状态 si 和输出 oi复制日志提供 committed 命令序列的接口;状态机复制的语义中心是确定性重放怎样把共同前缀变成共同状态,而不是再次定义日志的本地追加、提交和应用规则。

完整服务语义还要固定客户请求标识、重试去重、命令何时视为提交、何时可对客户响应,以及快照恢复和成员重配置如何与日志连接。若要对外提供线性一致的读,还需额外的读取协议;“日志相同”本身不是完整的端到端规格。

直觉

与其不断同步整个状态,状态机复制让排序层先提供共同命令前缀,再由各副本在本地重放同一计算。它由此把“多台副本如何保持一致”分成两层:共识或原子广播负责决定顺序,执行层让确定性状态机从相同初态按该顺序运行。仅仅复制数据或周期同步快照不够;若命令顺序不同,即使每条命令本身合法,也可能得到不同状态。反过来,同一日志也无法消除执行过程中未被记录为输入的非确定性。

状态机复制:共同日志确定共同状态
例子与边界

初始余额为 10,命令 withdraw(12)deposit(5) 若按不同顺序并带余额检查,会产生不同结果:先取款则取款失败、最终余额为 15;先存款则取款成功、最终余额为 3。共识日志固定顺序后,各副本便一致执行。客户端重试若没有请求 ID 去重,同一命令可能因网络超时被提交两次,日志一致仍会得到错误的端到端语义。

执行还必须保持确定性:读取系统时间、随机数或外部服务会引入非确定性,必须转化为已排序输入或通过协议协调。“多数副本存有某条日志”也不自动意味着客户端已看到线性一致结果;还需领导者提交规则、读取协议和会话处理。成员重配置必须纳入日志,并通过相交配置让安全证据跨成员视图延续,避免新旧配置各自决定冲突命令。

推论与应用

在最多 f 个副本可能任意作恶、认证通信且副本数满足典型的 n3f+1 条件时,实用拜占庭容错通过 pre-prepare、prepare 与 commit 法定人数实现确定状态机的共同命令序列。它面向拜占庭故障和部分同步进展条件,不能把其副本数、消息成本或视图切换保证直接当作崩溃故障 Raft/Paxos 的同义实现。

状态机提供确定性转移语义,复制日志提供共同命令前缀;PaxosRaftViewstamped Replication是日志层的具体协议。状态机复制由此支撑高可用键值存储、配置服务、数据库元数据和区块链执行模型。

形式化验证可以把实现状态映射到“共同 committed 前缀 + 确定状态”的抽象机,并用精化关系说明选主、重试和快照等内部步骤不改变外部历史。模型检查适合在有限副本和有界状态下搜索不变式反例,协议特有的 ballot、term 或选举机制仍留在各协议页,本页只规定排序层到确定性执行层的接口。

对外实现线性一致性还依赖正确的请求应答边界、读路径与去重;快照和日志压缩则在不改变已执行命令历史含义的前提下降低恢复成本。

参考资料
  • Fred B. Schneider, “Implementing Fault-Tolerant Services Using the State Machine Approach,” 1990.
  • Leslie Lamport, “The Part-Time Parliament,” 1998.
关系图谱8 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系