← 返回首页
一、CAP 与 BASE
- CAP 定理:一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),三者最多满足两个
- 网络分区必然存在:实际系统在 CP(强一致,如 ZooKeeper)和 AP(高可用,如 Eureka)之间选择
- BASE 理论:基本可用(Basically Available)+ 软状态(Soft State)+ 最终一致性(Eventually Consistent)
- 最终一致性:允许短暂不一致,通过异步复制/补偿最终达到一致,适合大多数互联网场景
二、一致性协议
- Paxos:经典共识算法,Proposer/Acceptor/Learner 三角色,两阶段(Prepare + Accept),理论基础但实现复杂
- Raft:Paxos 的工程化简化版,Leader 选举 + 日志复制 + 安全性,etcd/Consul 底层算法
- Raft 选举:任期(Term)机制,Follower 超时 → Candidate → 获得多数票 → Leader,心跳维持
- Raft 日志复制:Leader 接收写请求 → 追加日志 → 复制到多数节点 → 提交 → 应用状态机
- ZAB 协议:ZooKeeper 使用,类似 Raft,崩溃恢复 + 消息广播两种模式
- Gossip 协议:去中心化,节点间随机交换信息,最终一致,Redis Cluster 节点通信使用
三、分布式事务
- 2PC 两阶段提交:协调者 Prepare → 参与者投票 → 协调者 Commit/Rollback,同步阻塞、单点故障
- 3PC 三阶段提交:增加 CanCommit 阶段 + 超时机制,减少阻塞但仍有一致性问题
- TCC:Try(预留资源)→ Confirm(确认)→ Cancel(回滚),业务侵入大但灵活,适合高并发
- Saga:长事务拆分为多个本地事务 + 补偿操作,编排式(中心协调)/ 编舞式(事件驱动)
- 本地消息表:业务操作 + 消息写入同一本地事务,定时扫描发送消息,保证最终一致
- RocketMQ 事务消息:半消息 → 执行本地事务 → Commit/Rollback,自动回查机制
- Seata:阿里开源分布式事务框架,支持 AT/TCC/Saga/XA 四种模式
四、分布式锁
- Redis 分布式锁:
SET key value NX EX 30,value 用唯一标识防止误删,Lua 脚本保证原子释放
- Redisson:看门狗自动续期(默认 30s,每 10s 续期),可重入锁、公平锁、红锁
- RedLock:多 Redis 实例(N≥5),获取多数锁(N/2+1)才算成功,争议较大
- ZooKeeper 分布式锁:临时顺序节点,监听前一个节点删除事件,避免惊群效应
- MySQL 分布式锁:唯一索引 INSERT /
SELECT ... FOR UPDATE,性能差但简单
- 对比:Redis 性能最好但可靠性稍低;ZK 可靠性高但性能一般;MySQL 最简单但不推荐高并发
五、分布式 ID
- UUID:无序、128 位,不适合做数据库主键(索引效率低)
- 雪花算法(Snowflake):64 位 = 1 符号位 + 41 时间戳 + 10 机器 ID + 12 序列号,有序、高性能
- 号段模式:从数据库批量获取 ID 段缓存在内存,美团 Leaf / 百度 UidGenerator
- Redis INCR:原子自增,简单高效,但需考虑持久化和集群一致性
六、负载均衡与服务治理
- 负载均衡算法:轮询 / 加权轮询 / 随机 / 最少连接 / 一致性哈希
- 一致性哈希:哈希环 + 虚拟节点,节点增减只影响相邻数据,Redis Cluster / 分库分表常用
- 服务注册发现:Nacos(AP/CP 可切换)/ Eureka(AP)/ ZooKeeper(CP)/ Consul(CP)
- 熔断降级:Sentinel / Hystrix,熔断器三态(关闭→打开→半开),防止级联故障
- 限流:令牌桶(平滑限流)/ 漏桶(恒定速率)/ 滑动窗口计数器
- 链路追踪:SkyWalking / Zipkin / Jaeger,TraceID 贯穿全链路,定位性能瓶颈
七、数据分片与一致性
- 分库分表:水平拆分(按行)/ 垂直拆分(按列),ShardingSphere / MyCat
- 分片策略:范围分片(有序但热点)/ 哈希分片(均匀但范围查询难)/ 一致性哈希
- 主从复制:异步复制(高性能但可能丢数据)/ 半同步(至少一个从库确认)/ 全同步(最安全但最慢)
- 读写分离:主库写、从库读,注意主从延迟导致的数据不一致,强制走主库解决
- 分布式缓存一致性:Cache Aside(旁路缓存)/ Read/Write Through / Write Behind,延迟双删策略