一致性算法

1. Paxos 算法

1.1 Paxos 核心概念

  • 角色划分

    • Proposer(提议者):提出提案

    • Acceptor(接受者):投票决定是否接受提案

    • Learner(学习者):学习被选定的提案

  • 提案结构

    • 提案编号(Proposal ID):全局唯一且递增

    • 提案值(Value):实际要达成一致的值

1.2 Basic Paxos 流程

阶段一:Prepare 阶段

  • Proposer 选择提案编号 n,向多数派 Acceptor 发送 Prepare(n)

  • Acceptor 收到 Prepare(n):

    • 如果 n 大于已承诺的编号,则承诺不再接受编号小于 n 的提案

    • 返回已接受的最大编号提案(如果有)

阶段二:Accept 阶段

  • Proposer 收到多数派响应后,发送 Accept(n, v)

    • v 为收到的最大编号提案的值,若无则为自己的值

  • Acceptor 收到 Accept(n, v):

    • 如果 n 不小于已承诺的编号,则接受该提案

1.3 Paxos 详细案例分析

案例1:正常情况

案例2:提案冲突

案例3:旧提案的值被继承

1.4 Multi-Paxos

  • Basic Paxos 每次决策需要两轮通信

  • Multi-Paxos 优化:

    • 选举一个 Leader

    • Leader 可以跳过 Prepare 阶段

    • 减少通信轮次,提高效率

1.5 Paxos 变种

变种
特点
应用

Basic Paxos

单值共识,两阶段

理论基础

Multi-Paxos

Leader优化,连续共识

Chubby

Fast Paxos

减少延迟,乐观路径

低延迟场景

Flexible Paxos

灵活的 Quorum

优化读性能

EPaxos

无Leader,乱序执行

地理分布

2. Raft 算法 ⭐⭐⭐⭐⭐

2.1 Raft 核心概念

  • 角色

    • Leader(领导者):处理所有客户端请求

    • Follower(跟随者):被动接收请求

    • Candidate(候选人):用于选举 Leader

  • 任期(Term)

    • 逻辑时钟,单调递增

    • 每个任期最多一个 Leader

    • 选举超时触发新任期

2.2 Leader 选举详细流程

选举超时机制

投票规则

选举过程示例

2.3 日志复制详细流程

日志结构

复制流程详解

日志一致性检查

日志修复过程

2.4 安全性保证

  • 选举安全性:每个任期最多一个 Leader

  • Leader 只追加日志:Leader 不会覆盖或删除日志

  • 日志匹配性:相同索引和任期的日志项一定相同

  • Leader 完整性:已提交的日志一定在未来的 Leader 中

  • 状态机安全性:节点应用相同日志到状态机后状态一致

2.5 成员变更

单节点变更

联合共识(Joint Consensus)

2.6 Raft vs Paxos

特性
Raft
Paxos

可理解性

易于理解

复杂难懂

Leader

强 Leader

无 Leader / 弱 Leader

日志

日志必须连续

日志可以有空洞

工程实现

容易

困难

成员变更

联合共识或单节点变更

复杂

3. ZooKeeper ZAB 协议

3.1 ZAB 协议概述

  • ZooKeeper Atomic Broadcast

  • 专为 ZooKeeper 设计的一致性协议

  • 基于 Paxos 改进,但有本质区别

3.2 ZAB vs Paxos/Raft

特性
ZAB
Paxos
Raft

设计目标

主备复制

通用共识

日志复制

Leader

必须有

可选

必须有

日志顺序

严格 FIFO

可乱序

严格顺序

崩溃恢复

原生支持

需额外设计

原生支持

3.3 ZAB 核心机制

ZXID 设计

消息广播流程

3.4 崩溃恢复详解

Leader 选举

数据同步阶段

已提交事务的保证

3.5 ZAB 四种状态

3.6 ZooKeeper 节点类型

  • Leading:领导者状态,处理写请求

  • Following:跟随者状态,参与投票

  • Observing:观察者状态,不参与投票,只同步数据

4. Raft 状态机伪代码

5. 面试要点总结

5.1 算法对比

特性
Paxos
Raft
ZAB

复杂度

Leader

可选

必须

必须

日志顺序

可空洞

连续

连续FIFO

主要应用

Chubby

etcd, Consul

ZooKeeper

成员变更

复杂

联合共识

动态配置

5.2 关键记忆点

6. 常见面试题

6.1 Paxos 相关

Q1:Basic Paxos 为什么需要两阶段?

Q2:Paxos 可能出现活锁吗?如何解决?

6.2 Raft 相关

Q3:Raft 如何保证已提交的日志不会丢失?

Q4:为什么 Raft 只提交当前任期的日志?

Q5:Raft 选举过程中如何避免选票分裂?

6.3 ZAB 相关

Q6:ZAB 的 ZXID 设计有什么好处?

Q7:ZAB 崩溃恢复时如何处理未提交的事务?

6.4 综合比较

Q8:什么场景选择 Raft?什么场景选择 ZAB?

Q9:这些算法的性能瓶颈在哪里?

Last updated