跳到主要内容

分布式系统知识速查表

CAP 定理

    ┌─────────────────────────────────────┐
│ CAP 定理 │
├─────────────────────────────────────┤
│ Consistency (一致性) │
│ Availability (可用性) │
│ Partition Tolerance (分区容错) │
│ │
│ P(分区发生时) → C(一致性) 或 A(可用性) │
└─────────────────────────────────────┘
组合系统类型典型例子
CPZooKeeper, Etcd强一致性场景
APCassandra, DynamoDB高可用场景
CA不存在(分区不可避免)-

BASE 理论

BASE = Basically Available + Soft State + Eventually Consistent
术语含义
Basically Available基本可用,允许降级
Soft State软状态,允许中间状态
Eventually Consistent最终一致性

分布式事务对比

方案一致性性能复杂度适用场景
2PC金融
TCC最终业务可控
Saga最终长流程
消息最终跨服务

共识算法对比

算法作者特点典型系统
PaxosLamport理论基准Chubby
RaftOngaro易实现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 实现

常用端口

组件默认端口
ZooKeeper2181
Etcd2379
Redis6379
Kafka9092
Consul8500

常用命令

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 - 分布式事务框架