3. 架构设计
分布式系统的“架构”不是一幅静态图纸,而是一组在故障、延迟、容量之间做 trade-off 的组织原则。本章把这些原则抽象成几个常见模式:分层、Leader-Follower、复制拓扑、分片与故障域。
3.1 分层架构
一个典型的分布式系统可以拆成四层:
| 层级 | 职责 | AI Infra 例子 |
|---|---|---|
| 客户端 | 发起任务、读写数据 | kubectl apply、训练脚本 torchrun |
| 协调层 | 发现、调度、一致性、锁 | Kubernetes apiserver/etcd、Ray GCS |
| 计算层 | 实际执行计算 | GPU worker、推理副本 |
| 存储层 | 数据持久化与共享 | 对象存储、并行文件系统、KV 元数据 |
分层的好处是:每层可以独立扩展、独立容错、独立选型。例如存储层可以用最终一致的对象存储,而协调层必须用强一致的 etcd。
3.2 Leader-Follower
**Leader-Follower(主从复制)**是最常见的复制模式:
- 所有写请求发给 Leader;
- Leader 把操作复制到 Follower;
- 读请求可以走 Leader(强一致)或 Follower(可能读到旧数据)。
优点:简单、一致性强。 缺点:Leader 是单点写入瓶颈,故障时需要选举新 Leader。
工程优化:几乎所有生产系统(etcd、TiKV、CockroachDB)都在 Leader-Follower 之上叠加了租约读(lease read)——leader 只要按时收到多数派心跳,就能直接在本地服务只读请求,绕过一轮共识,把读延迟从两个 RTT 降到接近零。代价是读可能短暂过期,etcd 3.6/3.7 多次修复的正是这类过期读边界情况(见源码分析章)。
代表系统:MySQL 主从、Redis Sentinel、Kafka partition leader、Raft 集群。
3.3 Multi-Leader
**Multi-Leader(多主复制)**允许存在多个写入节点,常用于:
- 多区域部署,降低写入延迟;
- 离线设备同步;
- 需要高可用的写入口。
代价是必须处理写冲突(conflict resolution),常用方法:
- 最后写入者胜(LWW);
- 向量时钟 / 版本向量;
- CRDT(无冲突复制数据类型)——2024 年后生产案例明显增多:Figma 的多人协同、Linear 的同步引擎、Bluesky 的 AT Protocol 都采用 CRDT 或其变体解决多端并发编辑。
代表系统:Couchbase、TIDB 部分场景、PostgreSQL logical replication。
3.4 Leaderless
**Leaderless(无主复制)**中,任何节点都可以接受写请求,客户端直接向多个副本读写,通过 quorum 判断最新值。
典型代表是 Dynamo:
- 写:客户端并发写 N 个副本中的 W 个;
- 读:客户端并发读 R 个副本,合并版本;
- 如果 R + W > N,保证读到至少一个最新副本。
优点:高可用、无单点。 缺点:读修复(read repair)、冲突合并逻辑复杂。
3.5 State Machine Replication
**状态机复制(State Machine Replication, SMR)**是复制系统最核心的抽象:
- 所有副本从相同初始状态开始;
- 所有副本按相同顺序执行相同操作;
- 因此所有副本最终状态一致。
Client ──▶ Leader ──▶ Log: [op1, op2, op3] ──▶ Apply ──▶ State Machine
│
▼
Followers apply same log共识算法(Raft/Paxos)解决的是“如何让所有副本对日志顺序达成一致”。
代表系统:etcd、ZooKeeper、Raft-based KV 存储。
3.6 分片与一致性哈希
3.6.1 分片(Sharding)
当数据量超过单节点容量时,需要把数据切分到多个节点。分片策略包括:
- 范围分片:按 key 范围切分,适合范围查询;
- 哈希分片:按 key 哈希切分,负载均衡但不支持范围查询;
- 复合分片:先按时间/租户分片,再按 key 哈希。
3.6.2 一致性哈希
一致性哈希把节点和数据都映射到一个环上:
- 数据 key 顺时针找到第一个节点;
- 增加或删除节点时,只影响相邻的一小段数据,不需要全量迁移。
代表系统:Cassandra、Dynamo、Memcached 客户端分片。
3.7 复制拓扑
| 拓扑 | 结构 | 适用场景 |
|---|---|---|
| 链式复制 | Leader → Follower1 → Follower2 | 高吞吐写入,读取延迟可接受 |
| 星型复制 | Leader 直接复制到所有 Follower | 最常见,读写均衡 |
| 全互联 | 每个节点互相复制 | 多主、P2P |
| 树形复制 | 分层聚合复制 | 跨数据中心、日志聚合 |
AI Infra 例子:
- 模型训练中的梯度聚合:环状 all-reduce(类似链式复制思想);
- 对象存储跨区域复制:主从或树形复制。
3.8 故障域与爆炸半径
**故障域(Fault Domain)**指一起失效的一组资源。常见层级:
进程 → 节点 → 机架 → 机柜 → 可用区(AZ) → 区域(Region) → 云服务商设计系统时,要让关键组件分散在不同故障域:
- etcd 的 3/5/7 节点应跨机架、跨可用区部署;
- 分布式训练的重要副本不要放在同一个机柜;
- 对象存储的多副本应跨 AZ。
**爆炸半径(Blast Radius)**指一个故障影响的范围。好的设计会把爆炸半径控制在局部:
- 按租户/命名空间隔离;
- 分片独立故障;
- 降级开关(circuit breaker)防止级联失败。
3.9 云原生新形态:Actor、Serverless 与 Durable Execution
2024-2026 年,分布式架构出现一组“把状态收敛到单写者单元”的新形态,绕开了共享状态 + 分布式锁的经典路线:
- Actor / 虚拟对象:Cloudflare Durable Objects 把每个实体(房间、文档、会话)映射到一个全局唯一、单线程执行的 worker,状态由 SQLite 单写者持久化(SQLite-backed 存储于 2025 年 GA),Azure Orleans 的 Virtual Actor 思想与之同源。由于任意时刻只有一个执行者,冲突在结构上不可能发生,一致性问题是“不存在”而不是“被解决”。
- Durable Execution:Temporal 等工作流引擎把长时间运行的业务逻辑本身变成持久化状态,进程崩溃后从上一次完成的活动恢复,把崩溃恢复从应用代码下沉到框架。
- Serverless GPU:Modal、RunPod Serverless、Replicate 等平台把推理副本的弹性伸缩、排队、路由、冷启动全部下沉到平台层,用户面对的几乎是一个“单机的幻觉”。
对 AI Infra 的启示:推理会话、Agent 记忆、多轮对话上下文都可以建模为 Durable Object / Actor,从而避开多副本 KV Cache 共享一致性的泥潭——这是“故障域”与“爆炸半径”思想在应用架构层面的延续。
3.10 架构选型速查表
| 需求 | 推荐架构 | 代表系统 |
|---|---|---|
| 强一致、小数据量 | Leader-Follower + 共识 | etcd、ZooKeeper |
| 高可用、大数据量 | 分片 + Leader-Follower | TiDB、CockroachDB |
| 低延迟写、可容忍冲突 | Leaderless / Multi-Leader | Dynamo、Cassandra |
| 全局低延迟读 | 副本 + 就近路由 | CDN、S3 跨区域复制 |
| 线性扩展计算 | 分片 + 无状态 worker | Ray、FSDP |
| 会话/Agent 状态 | 单写者 Actor | Durable Objects、Temporal Workflow |
3.11 一句话总结
分布式系统架构的本质,是把“状态、计算、协调”拆成可独立复制、分片和容错的单元,并通过 Leader-Follower、分片、quorum、共识等模式,在一致性、可用性和性能之间取得平衡。