网络分区故障(Network Partition)
网络分区是分布式系统的「阿喀琉斯之踵」。
CAP 定理告诉我们:当网络分区发生时,系统必须在一致性和可用性之间做出选择。但很多团队直到真正遇到网络分区时才意识到这个选择的代价——要么损失一致性,要么损失可用性,而提前没有设计好系统,代价往往是两者都受损。
网络分区的定义
网络分区:网络中的部分节点之间可以通信,但与其他节点无法通信。
分区的类型
网络分区的成因
网络分区与 CAP 定理
这是理解网络分区的核心:
CP vs AP 的权衡
真实案例:AWS S3 2019 故障
2019 年 7 月,AWS us-east-1 区域发生故障。由于 S3 使用的是 CP 架构(在分区时牺牲可用性),这次故障导致:
- S3 服务不可用
- 依赖 S3 的服务(如 EC2 的引导脚本)也受影响
- 整个 AWS 生态系统中大量服务连锁故障
教训:即使是 AWS 自己,也无法完全避免分区的影响。架构设计必须考虑「依赖的依赖」。
网络分区的检测
心跳 + 法定人数检测
PartitionDetector.java
法定人数(Quorum)机制
网络分区的应对策略
策略一:客户端本地缓存
当服务端不可用时,返回本地缓存的数据:
PartitionTolerantClient.java
策略二:最终一致性
接受分区期间的不一致,分区愈合后通过冲突解决达到一致:
策略三:隔离 + 降级
在分区发生时,主动降级部分功能,减少数据不一致的风险:
降级策略配置
网络分区的常见误区
误区一:认为分区「很少发生」
实际上,网络分区比大多数人想象的要频繁:
关键数据:AWS 公开报告显示,典型云区域每年有 2~4 次影响服务的网络事件。
误区二:分区期间不做任何处理
很多系统假设分区「很快就会恢复」,但实际上分区可能持续数分钟甚至数小时:
误区三:忽视分区的影响范围
分区不仅影响数据层,还会影响:
- 服务发现(Eureka/Consul 可能也分区了)
- 负载均衡(LB 不知道哪些节点可用)
- 配置中心(配置无法同步)
- 消息队列(消息积压)
网络分区与其他故障的关系
网络分区往往引发其他故障:
脑裂(Split-Brain) 是网络分区最危险的并发症:分区两侧都认为对方已经挂了,各自提供服务,导致数据分裂。
本章总结
核心要点:
- 网络分区是分布式系统的本质约束:CAP 定理告诉我们,分区时必须在 C 和 A 之间选择
- 分区可能持续数分钟到数小时:不要假设分区会很快恢复
- CP 系统选择一致性:分区期间停止写入
- AP 系统选择可用性:分区期间继续服务,但可能不一致
- 脑裂是分区的最大风险:需要仔细设计冲突解决机制
网络分区是 CAP 定理的现实体现。接下来我们看另一种常见的故障:超时故障。