分布式理论
CAP 定理
┌─────────────────────────────────────┐
│ CAP Theorem │
└─────────────────────────────────────┘
│
┌───────────────────┼───────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│Consistency│ │Availability│ │Partition │
│ 一致性 │ │ 可用性 │ │ tolerance│
└──────────┘ └──────────┘ │ 分区容错 │
└──────────┘
不能同时满足三个,最多满足两个| 组合 | 说明 | 代表 |
|---|---|---|
| CA | 一致性 + 可用性 | 单机数据库 |
| CP | 一致性 + 分区容错 | MongoDB、HBase、Redis 集群 |
| AP | 可用性 + 分区容错 | Cassandra、Eureka |
BASE 理论
- Basically Available:基本可用
- Soft state:软状态
- Eventually consistent:最终一致性
分布式一致性协议
2PC (两阶段提交)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 协调者 │────▶│ 参与者1 │ │ 参与者2 │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
│ 阶段一:投票 │
├──────────────────────────────────────┤
│ request_prepare │
│──────────────────────────────────────│
│ │
│◀─────────────────────────────────────│
│ response_vote │
│ │
│ 阶段二:提交 │
├──────────────────────────────────────┤
│ request_commit │
│──────────────────────────────────────│
│ │
│◀─────────────────────────────────────│
│ response_commit │问题:同步阻塞、单点故障、数据不一致
3PC (三阶段提交)
阶段一:CanCommit → 询问是否能提交
阶段二:PreCommit → 预提交
阶段三:DoCommit → 真正提交Paxos 算法
用于实现分布式系统中的一致性共识。
角色:
- Proposer(提议者)
- Acceptor(接受者)
- Learner(学习者)
流程:
- Prepare 阶段:提议者提出提案
- Promise 阶段:接受者承诺不再接受旧提案
- Accept 阶段:提议者发送 Accept 请求
- Accepted 阶段:接受者接受提案
Raft 算法
Raft 是 Paxos 的简化实现,角色包括:
- Leader(领导者)
- Follower(跟随者)
- Candidate(候选人)
领导选举:
┌─────────┐
│ 选举 │
│超时后 │
└────┬────┘
│
▼
┌─────────┐ 成为候选人 ┌───────────┐
│ Follower│──────────────▶│ Candidate │
└─────────┘ └─────┬─────┘
│◀─────── heartbeat ───────┤
│ │
│ ┌───────────────┼───────────────┐
│ │ │ │
│ 获得多数票 收到新Leader 选举超时
│ │ │ │
│ ▼ ▼ ▼
│ ┌─────────┐ ┌───────────┐ ┌───────────┐
│ │ Leader │ │ Follower │ │ Candidate │
│ └─────────┘ └───────────┘ └───────────┘一致性哈希
java
// 一致性哈希环
public class ConsistentHash {
private final SortedMap<Long, String> circle = new TreeMap<>();
// 添加节点
public void addNode(String node) {
for (int i = 0; i < VIRTUAL_NODES; i++) {
long hash = hash(node + "#" + i);
circle.put(hash, node);
}
}
// 获取节点
public String getNode(String key) {
if (circle.isEmpty()) return null;
long hash = hash(key);
SortedMap<Long, String> tail = circle.tailMap(hash);
return tail.isEmpty() ? circle.firstEntry().getValue()
: tail.firstEntry().getValue();
}
}总结
- CAP 定理:一致性、可用性、分区容错不可兼得
- BASE 理论:最终一致性方案
- 一致性协议:2PC、3PC、Paxos、Raft
- 一致性哈希:解决节点增减问题
