共识问题概述

分布式共识是指在分布式系统中,多个节点就某个值或决策达成一致的过程。由于网络延迟、节点故障等原因,达成共识是一个核心挑战。

📐 FLP 不可能定理
在异步网络环境中,即使只有一个节点可能失效,也无法保证在有限时间内达成确定性共识。

共识算法发展时间线

1989
Paxos
Leslie Lamport 提出
1999
PBFT
Castro & Liskov
2008
PoW
比特币区块链
2013
Raft
Ousterhout & Ong
2014
PoS
以太坊 2.0

故障类型

💥 崩溃故障

节点停止响应,不再发送消息

Crash Failure

🎭 拜占庭故障

节点可能发送错误或恶意消息

Byzantine Failure

📭 遗漏故障

消息丢失或延迟到达

Omission Failure

Paxos 算法

Paxos 是由 Leslie Lamport 在 1989 年提出的分布式共识算法,被譽为最经典的共识算法。它允许在存在节点故障的分布式系统中达成一致。

sequenceDiagram participant P as Proposer participant A as Acceptor participant L as Learner P->>A: Phase 1a: Prepare(n) A->>P: Phase 1b: Promise(n, acceptedValue) P->>A: Phase 2a: Accept(n, value) A->>P: Phase 2b: Accepted(n, value) A->>L: Learn(value) Note over P,L: 两阶段提交

阶段 1: 准备阶段

  1. Proposer 提出编号为 n 的提案
  2. 向多数派 Acceptor 发送 Prepare 请求
  3. Acceptor 回复 Promise,承诺不接受编号小于 n 的提案

阶段 2: 接受阶段

  1. Proposer 收到多数派的 Promise 后
  2. 发送 Accept 请求,包含提案值
  3. Acceptor 接受后,提案被批准
Paxos 安全性保证
1. 只有被提出的值才能被批准
2. 只有一个值能被批准
3. 一个值被批准后,Learner 才能学习到

Raft 算法

Raft 是一种易于理解的分布式共识算法,由 Stanford 大学于 2013 年提出。它将共识问题分解为三个子问题:领导者选举、日志复制和安全性。

Raft 节点状态转换

Follower
被动响应
Candidate
请求投票
Leader
管理日志

所有节点从 Follower 开始,超时后成为 Candidate,获得多数票后成为 Leader

sequenceDiagram participant L as Leader participant F1 as Follower1 participant F2 as Follower2 participant F3 as Follower3 L->>F1: AppendEntries(log, term) L->>F2: AppendEntries(log, term) L->>F3: AppendEntries(log, term) F1-->>L: Success F2-->>L: Success Note over L,F3: 多数派确认 L->>L: Commit entry L->>F1: Commit index L->>F2: Commit index L->>F3: Commit index Note over L,F3: 日志复制完成

Raft 核心机制

机制 说明 关键参数
领导者选举 超时后成为 Candidate,请求投票 选举超时:150-300ms
日志复制 Leader 向 Follower 复制日志 心跳间隔:50ms
安全性保证 Leader 包含所有已提交日志 Leader 完整性

PBFT 算法

实用拜占庭容错 (Practical Byzantine Fault Tolerance) 算法由 Castro 和 Liskov 于 1999 年提出,能够容忍最多 f 个拜占庭节点 (总节点数 n ≥ 3f + 1)。

sequenceDiagram participant C as Client participant P as Primary participant R1 as Replica1 participant R2 as Replica2 participant R3 as Replica3 C->>P: Request(m) P->>R1: Pre-Prepare(m, n, d) P->>R2: Pre-Prepare(m, n, d) P->>R3: Pre-Prepare(m, n, d) R1->>R2: Prepare(n, d, i) R1->>R3: Prepare(n, d, i) R2->>R1: Prepare(n, d, i) R2->>R3: Prepare(n, d, i) R3->>R1: Prepare(n, d, i) R3->>R2: Prepare(n, d, i) Note over R1,R3: 2f+1 个 Prepare R1->>R2: Commit(n, d, i) R1->>R3: Commit(n, d, i) R2->>R1: Commit(n, d, i) R2->>R3: Commit(n, d, i) R3->>R1: Commit(n, d, i) R3->>R2: Commit(n, d, i) Note over R1,R3: 2f+1 个 Commit R1-->>C: Reply(r) Note over C,R3: 三阶段提交

阶段 1: Pre-Prepare

  1. Client 发送请求到 Primary
  2. Primary 分配序列号 n
  3. 广播 Pre-Prepare 消息给所有 Replica

阶段 2: Prepare

  1. Replica 验证 Pre-Prepare
  2. 广播 Prepare 消息
  3. 收到 2f+1 个 Prepare 后进入下一阶段

阶段 3: Commit

  1. 广播 Commit 消息
  2. 收到 2f+1 个 Commit 后执行
  3. 返回结果给 Client

PoW 工作量证明

PoW (Proof of Work) 是比特币使用的共识机制,要求节点通过计算密集型任务来竞争记账权,防止恶意攻击。

⚠️ 优缺点分析
优点: 安全性高,抗攻击能力强
缺点: 能源消耗大,交易确认慢,存在算力集中风险
PoW 难度目标
SHA256(SHA256(block_header)) < target
难度调整:每 2016 个区块调整一次,目标出块时间 10 分钟

PoS 权益证明

PoS (Proof of Stake) 通过持有代币的数量和时间来选择验证者,相比 PoW 更节能高效。

特性 PoW PoS
选择机制 算力竞争 持币质押
能源消耗
交易速度 慢 (比特币 7 TPS) 快 (以太坊 2.0 100000+ TPS)
安全性 51% 算力攻击 51% 持币攻击
代表项目 比特币、莱特币 以太坊 2.0、Cardano

算法对比与选择

算法 故障容忍 通信复杂度 确认延迟 应用场景
Paxos 崩溃故障 O(n) Chubby, ZooKeeper
Raft 崩溃故障 O(n) etcd, Consul, TiKV
PBFT 拜占庭故障 O(n²) 联盟链,Hyperledger
PoW 拜占庭故障 O(1) 高 (10 分钟) 比特币,公有链
PoS 拜占庭故障 O(1) 中 (12 秒) 以太坊 2.0
DPoS 拜占庭故障 O(n) 低 (3 秒) EOS, TRON
算法选择指南
  • 许可链/内部系统: 选择 Raft 或 PBFT,性能好,延迟低
  • 公有链: 选择 PoW 或 PoS,抗攻击,去中心化
  • 高吞吐场景: 考虑 DPoS 或 PoS 变体
  • 强一致性要求: 选择 Paxos/Raft 系列
  • 弱一致性可接受: 考虑 Gossip 协议