分布式架构
Distributed Systems
多台机器协同工作,在不可靠的网络上构建可靠的系统。
分布式系统是一组独立计算机通过网络协作,对外呈现为单一连贯系统。核心挑战来自三大不确定性:节点可能故障(crash、Byzantine)、网络可能延迟或分区、时钟可能不同步。核心概念包括:CAP 定理(一致性 Consistency、可用性 Availability、分区容忍 Partition tolerance 三者最多满足其二)、共识算法(Paxos、Raft,在故障节点间达成一致)、复制策略(同步复制保证一致性,异步复制保证可用性)、分布式事务(2PC、3PC、Saga)、向量时钟(检测并发写入冲突)、一致性哈希(数据分片和负载均衡)。典型系统:ZooKeeper/etcd(协调服务)、Kafka(分布式消息)、Cassandra/DynamoDB(宽列存储)。
单机有容量和可用性上限。当数据量或请求量超过单机能力,或需要跨地域部署以降低延迟,必须使用分布式架构。分布式系统通过冗余实现容错(一个节点故障不影响整体服务),通过分区实现水平扩展(增加节点提升容量)。但分布式引入了新问题:网络不可靠导致消息可能丢失或延迟;时钟不同步导致无法确定事件顺序;部分故障导致系统处于不一致状态。CAP 定理指出:在网络分区发生时,必须在一致性和可用性之间做出选择。
程序员通过分布式系统框架和中间件使用这些抽象。RPC 框架(gRPC、Dubbo)使远程调用像本地调用一样;服务发现(Consul、Nacos)帮助服务找到彼此;负载均衡(Nginx、Envoy)分散请求;熔断器(Hystrix、Sentinel)防止级联故障。理解分布式有助于理解:为什么微服务需要服务注册和发现(服务实例动态变化);为什么分布式锁如此复杂(网络分区时可能失效);为什么'精确一次'语义几乎不可能实现(至少一次 + 幂等是更务实的选择)。
Bottom-up:由下层如何构建
本层建立在以下层级之上:
Top-down:向上暴露什么接口
Programmer View:程序员视角
我能操作吗?
通过 RPC 框架(gRPC/Dubbo)、消息队列(Kafka/RabbitMQ)、分布式协调服务(ZooKeeper/etcd)间接操作。云服务商提供托管的分布式服务(AWS DynamoDB、Google Spanner)。
成本模型
| 指标 | 量级 | 备注 |
|---|---|---|
| 同数据中心 RPC | ~0.5-2 ms | 千兆/万兆网络 |
| 跨数据中心 RPC | ~50-200 ms | 受光速约束 |
| Raft 共识延迟 | ~10-50 ms | 取决于节点数和网络延迟 |
| 分布式锁获取 | ~5-20 ms | Redis/ZooKeeper 实现 |
| 数据同步复制 | 取最慢节点延迟 | 强一致的代价 |
常见陷阱
- !网络分区处理:当网络分区发生时,系统必须在一致性和可用性间做出选择。盲目追求强一致会导致服务不可用
- !时钟依赖:分布式系统中不能假设时钟同步。使用逻辑时钟(Lamport 时钟、向量时钟)替代物理时钟进行因果排序
- !级联故障:一个服务的故障可能导致依赖它的服务也故障,最终雪崩。应使用熔断器、限流、降级策略防止级联故障