跳到正文
Elaine Blog
返回

Paxos、Raft 与复制状态机

分布式系统、协调与消息

共识不是“大家网络通了就投票”,而是在节点崩溃、消息重复和延迟下,正确节点仍不能对同一位置决定不同值。Paxos 给出核心安全思想,Raft 用 Leader、任期和日志把工程过程拆得更清楚。

Table of contents

Open Table of contents

从一个日志槽位开始

Paxos 中,提议者提交带编号的值,接受者承诺不再接受更小编号的提案。两个法定人数必然相交,交点携带之前可能被选定的值,因此后续轮次不能随意覆盖它。Multi-Paxos 在稳定 Leader 下复用准备阶段,连续决定日志槽位。

Raft 把时间划分为任期(term)。Follower 超时后成为 Candidate,请求选票;获得多数票后成为 Leader。Leader 复制日志,某条当前任期日志被多数派保存后才推进提交位置。每个节点按提交顺序把命令应用到同一个确定性状态机。

客户端命令 → Leader 日志 → 多数派复制 → commitIndex 前进 → 状态机应用 → 响应

相同输入必须得到相同状态

状态机代码不能直接读取随机数或本地当前时间,否则副本会分叉。需要随机值时,由 Leader 把选定值写进日志;外部副作用则用幂等键隔离重放。

成员变更也不能直接把 3 节点配置替换为另一组 3 节点。安全协议会使用联合配置或等价机制,确保新旧法定人数在过渡期存在约束。快照用于压缩已提交日志,但快照安装也必须带上最后日志位置与任期。

共识没有解决什么

共识不自动解决客户端重复请求、跨系统事务、磁盘永久损坏、拜占庭恶意节点或错误业务命令。多数派测试只展示集合交叉,不是 Raft 实现:

mvn -Dtest=DistributedMechanismsTest#snowflakeIdsIncreaseAndQuorumRequiresMajority test

阅读 Raft 论文与可视化资料时,按选举安全、日志匹配、Leader 完整性和状态机安全四个性质核对实现。

下一步

继续阅读08-08 ShardingSphere-JDBC 分片实战,把一致性知识用于数据库水平拆分。


分享这篇文章:

上一篇
Leader 选举与 ZAB 协议
下一篇
ShardingSphere-JDBC 分片实战