分布式系统知识速查表
CAP 定理
┌─────────────────────────────────────┐
│ CAP 定理 │
├─────────────────────────────────────┤
│ Consistency (一致性) │
│ Availability (可用性) │
│ Partition Tolerance (分区容错) │
│ │
│ P(分区发生时) → C(一致性) 或 A(可用性) │
└─────────────────────────────────────┘
| 组合 | 系统类型 | 典型例子 |
|---|---|---|
| CP | ZooKeeper, Etcd | 强一致性场景 |
| AP | Cassandra, DynamoDB | 高可用场景 |
| CA | 不存在(分区不可避免) | - |
BASE 理论
BASE = Basically Available + Soft State + Eventually Consistent
| 术语 | 含义 |
|---|---|
| Basically Available | 基本可用,允许降级 |
| Soft State | 软状态,允许中间状态 |
| Eventually Consistent | 最终一致性 |
分布式事务对比
| 方案 | 一致性 | 性能 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| 2PC | 强 | 低 | 中 | 金融 |
| TCC | 最终 | 高 | 高 | 业务可控 |
| Saga | 最终 | 高 | 低 | 长流程 |
| 消息 | 最终 | 中 | 低 | 跨服务 |
共识算法对比
| 算法 | 作者 | 特点 | 典型系统 |
|---|---|---|---|
| Paxos | Lamport | 理论基准 | Chubby |
| Raft | Ongaro | 易实现 | Etcd, Consul |
| ZAB | - | Zookeeper专用 | ZooKeeper |
分区策略
1. 哈希分区
shard = hash(key) % numShards
- 优点:数据均匀
- 缺点:无法范围查询
2. 范围分区
shard = findShardByRange(key)
- 优点:支持范围查询
- 缺点:可能数据倾斜
3. 一致性哈希
shard = hashRing.getNode(key)
- 优点:减少数据迁移
- 缺点:实现复杂
复制模式
同步复制: 客户端 → 主节点 → 所有从节点 → 返回
异步复制: 客户端 → 主节点 → 返回 → 从节点
半同步: 客户端 → 主节点 → N个从节点 → 返回
| 模式 | 延迟 | 数据安全 | 吞吐量 |
|---|---|---|---|
| 同步 | 高 | 不丢 | 低 |
| 异步 | 低 | 可能丢 | 高 |
| 半同步 | 中 | 多数派 | 中 |
分布式ID生成
雪花算法
64位 = 1位(符号) + 41位(时间戳) + 10位(机器ID) + 12位(序列号)
// 雪花ID结构
long id = ((timestamp - 1609459200000L) << 22) |
(workerId << 12) |
sequence;
分布式锁
Redis 实现
// 获取锁
SET key value NX PX 30000
// 释放锁(Lua脚本)
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
else
return 0
end
Zookeeper 实现
常用端口
| 组件 | 默认端口 |
|---|---|
| ZooKeeper | 2181 |
| Etcd | 2379 |
| Redis | 6379 |
| Kafka | 9092 |
| Consul | 8500 |
常用命令
Redis
# 分布式锁
SET lock_key unique_value NX PX 30000
DEL lock_key
ZooKeeper
# 创建节点
create /lock/task-00001
# 获取子节点
ls /lock
# 删除节点
delete /lock/task-00001
Etcd
# 锁
etcdctl lock /resource
# 事务
etcdctl txn --compare
常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 数据不一致 | 网络延迟/分区 | 检查网络,增加重试 |
| 分布式事务超时 | 网络问题/节点负载 | 增加超时时间 |
| 死锁 | 锁获取顺序不一致 | 统一加锁顺序 |
| 脑裂 | 网络分区 | 多数派投票机制 |
学习资源
书籍
- 《分布式系统设计》- 经典教材
- 《Designing Data-Intensive Applications》- Martin Kleppmann
- 《分布式系统概念与设计》
论文
- CAP Theorem - Brewer
- Paxos Made Simple - Lamport
- The Raft Consensus Algorithm
开源项目
- Etcd - Go实现的Raft
- Consul - 分布式服务发现
- Seata - 分布式事务框架