状态机复制

wen IT资讯 19

本文目录导读:

状态机复制

  1. 核心原理
  2. 逻辑架构图
  3. 类比:银行账户
  4. 为什么需要共识算法?
  5. 经典应用

状态机复制是分布式系统中实现容错一致性的核心思想,它由 Leslie Lamport 等人在 20 世纪 70 年代末提出,是 Paxos、Raft 等共识算法的理论基础。

它的核心思想可以概括为:

如果多个副本(节点)从相同的初始状态出发,并且以相同的顺序执行相同的一系列操作(指令),那么它们最终一定会达到相同的最终状态。

核心原理

状态机复制将分布式系统抽象为两个部分:

  1. 确定性状态机:这是一个逻辑模型,给定一个状态 S 和一个输入操作 Op,其输出 Out 和下一个状态 S‘ 是唯一确定的。S' = execute(S, Op)
    • 关键确定性 是前提,如果同一个操作在不同节点上产生不同结果(依赖于本地时间、随机数或未同步的全局变量),那么状态机模型就会被破坏。
  2. 复制日志:这是一个所有节点都需要达成一致的、有序的操作序列。[Op1, Op2, Op3, ...]

工作流程

  1. 客户端发送请求:客户端向集群发送一个操作(“将 X 的值加 1”)。
  2. 共识模块:集群中的一个节点(通常是领导者)负责将客户端的操作 追加到自己的日志中,它通过一个共识算法(如 Paxos 或 Raft)将这个日志条目广播给其他节点。
  3. 日志复制:只有当集群中的大多数(法定人数,quorum)节点都确认收到了该日志条目并将其安全地存储后,该条目才被视为已提交
  4. 执行:一旦日志条目被提交,每个节点都会 按照日志顺序(从日志头部开始)将该操作应用到自己的本地状态机上。
  5. 返回结果:执行完成后,节点将执行结果返回给客户端。

逻辑架构图

graph TD
    subgraph 客户端
        C[客户端]
    end
    subgraph 复制状态机集群
        subgraph 节点A
            A_Log[ replicated log<br>1. 写 x=3<br>2. 写 y=5<br>3. 读 z]
            A_State[ State Machine<br>X:3, Y:5]
        end
        subgraph 节点B
            B_Log[ replicated log<br>1. 写 x=3<br>2. 写 y=5<br>3. 读 z]
            B_State[ State Machine<br>X:3, Y:5]
        end
        subgraph 节点C
            C_Log[ replicated log<br>1. 写 x=3<br>2. 写 y=5<br>3. 读 z]
            C_State[ State Machine<br>X:3, Y:6]
        end
    end
    C -->|“写 x = 3”| 共识模块
    共识模块 -->|1. 追加日志| A_Log
    共识模块 -->|2. 复制日志| B_Log
    共识模块 -->|3. 复制日志| C_Log
    A_Log -->|按序执行| A_State
    B_Log -->|按序执行| B_State
    C_Log -.->|状态不一致| C_State

图中问题:假设节点C因为某种原因(如网络延迟、错误执行)导致其状态机对第3个操作(读z)产生了不同的结果(X:3, Y:6),这就违反了状态机复制的核心原则,在正确实现中,当节点C发现自己的状态与领导者的不一致时(通过日志对比),它会删除自己的不一致日志,从领导者处同步正确的日志并重新执行。

类比:银行账户

假设有三个银行分行(节点),要共同维护客户的存款余额。

  • 状态:客户张三的余额(100元)。
  • 操作:存款 +50、取款 -20、转账 -30。
  • 日志:一份所有分行都认同的交易流水。

正确流程(状态机复制)

  1. 张三在分行A(领导者)存款50元,分行A在流水单上写下:“[第101条] 存款:+50”。
  2. 共识算法(比如通过微信群里喊话)确保分行B和分行C也记录下:“[第101条] 存款:+50”。
  3. 所有分行(A、B、C)读取流水单,从第1条开始执行,执行完第101条后,所有分行的电脑屏幕上都显示:张三余额 = 150元。

错误流程(未遵守状态机复制)

  • 如果分行C因为故障,漏掉了第101条流水,直接从第102条开始执行,那么当第102条是“取款100”时:
    • 分行A和B(基础余额150元):余额变为50元。
    • 分行C(基础余额100元):余额变为0元。
    • 系统不一致,出现严重错误。

为什么需要共识算法?

状态机复制本身是一个概念模型,它没有解决一个核心工程问题:如何保证所有节点以完全相同的顺序(日志顺序)看到完全相同的操作?

在分布式系统中,节点可能宕机、网络可能延迟或分区,共识算法(如 Paxos 和 Raft)正是专门用来解决这个难题的组件:

  1. 领导者选举:确保在一个任期内只有一个节点被授权追加日志条目,避免日志分叉。
  2. 日志复制:保证日志条目可靠地复制到多数节点。
  3. 安全性:保证已经提交的日志条目在任何节点上都不会被修改或丢失;保证日志的顺序是全局一致的。

关系总结

  • 状态机复制是“做什么”(最终状态一致)。
  • 共识算法是“怎么做”(日志排序与同步)。

经典应用

几乎所有的强一致性分布式系统都基于这个模型:

  1. ZooKeeper / etcd / Consul:用于分布式协调、服务发现、配置管理。
    • 状态:关键值(key-value)数据。
    • 操作:Create、Set、Delete。
    • 共识:Zab(ZooKeeper)/ Raft(etcd、Consul)。
  2. Chubby:Google 的分布式锁服务,基于 Paxos。
  3. Google Spanner / CockroachDB / TiDB:全球分布式数据库。
    • 状态:关系型数据表。
    • 操作:SQL 读写。
    • 共识:Paxos 或 Raft。
  4. Kafka(高版本):使用 KRaft(基于 Raft)替代 ZooKeeper 进行元数据管理。

状态机复制是构建高可用、强一致性、线性一致性(线性izability) 分布式系统的核心工程模式,它将复杂的容错问题转化为一个更简单的日志复制与排序问题,从而将一个不可靠的分布式系统抽象为单个可靠的、确定性的逻辑单元。

关键点回顾

  • 确定性是基石。
  • 日志顺序决定一切。
  • 共识算法是实现工具。
  • 多数派(法定人数,quorum) 是容错的关键。

抱歉,评论功能暂时关闭!