【学习篇】什么是分布式系统
分布式系统是由 多个独立计算机(节点) 通过 网络通信 协同工作的系统,这些节点对外呈现为一个 统一的整体,用户无需感知内部的分布式架构。简单来说,就是“用多个计算机一起干一件事”,节点之间通过消息传递(如 RPC、HTTP、消息队列)协作完成任务。
一、分布式系统的核心目标
为什么需要分布式系统?本质是为了解决 单机系统的局限性:
- 性能瓶颈:单机 CPU、内存、磁盘、网络的处理能力有限(如单机能处理 1000 QPS,分布式可通过 10 台机器扩展到 10000 QPS)。
- 存储上限:单机硬盘容量有限,无法存储海量数据(如电商的商品库、用户数据)。
- 可用性需求:单机故障会导致服务不可用,分布式系统通过多节点冗余(如主从备份)实现高可用。
- 地理分布式:用户分布在不同地区(如中国、美国),需在各地部署节点以降低延迟(CDN、分布式数据库)。
二、分布式系统的关键特征
- 多节点协同
- 节点是独立的计算机(物理机、虚拟机或容器),可能分布在不同机架、机房甚至地区。
- 节点通过 网络通信 协作(网络存在延迟、丢包、分区等不可靠性)。
- 资源共享
- 节点共享系统的硬件(如存储、计算资源)和软件(如数据、服务),对外提供统一接口(用户无需关心数据存储在哪个节点)。
- 无全局时钟
- 各节点有自己的本地时钟,无法精确同步(如节点 A 记录时间
t1
,节点 B 记录t2
,但无法确定t1
和t2
的绝对先后顺序)。
- 故障独立性
- 节点可能独立发生故障(如宕机、网络断开),系统需具备 容错能力(如自动检测并替换故障节点)。
三、分布式系统的典型架构
根据业务场景,分布式系统有多种架构模式,以下是常见类型:
1. 客户端-服务器模式(C/S)
- 客户端:发起请求(如用户手机 APP、浏览器)。
- 服务器集群:接收并处理请求(如 Web 服务器集群、数据库集群)。
- 示例:电商网站(用户通过 APP 访问多个后端服务器,数据存储在分布式数据库)。
2. 微服务架构
- 将单体应用拆分为 独立的小型服务(如用户服务、订单服务、支付服务),每个服务独立部署、扩展和维护。
- 服务间通过 RPC(如 gRPC) 或 消息队列(如 Kafka) 通信。
- 示例:Netflix、阿里巴巴的业务系统(由数百个微服务组成)。
3. 分布式存储
- 将数据分散存储在多个节点,通过副本机制保证可靠性和可用性。
- 示例:
- GFS(Google 文件系统)、HDFS(Hadoop 分布式文件系统):存储海量文件。
- 分布式数据库(如 Cassandra、TiDB、MongoDB 分片集群):存储结构化/半结构化数据。
4. 分布式计算
- 将复杂任务拆分为子任务,分配给多个节点并行计算,最后汇总结果。
- 示例:
- MapReduce(大数据计算框架,如 Hadoop MapReduce)。
- Spark(内存分布式计算引擎)。
四、分布式系统的核心挑战(“坑”)
分布式系统的复杂度主要来自 网络不可靠 和 节点独立性,需解决以下关键问题:
1. 网络问题:延迟、分区、丢包
- 延迟:节点间通信存在网络延迟(如跨机房延迟 100ms+),导致同步困难。
- 网络分区(脑裂):网络故障导致节点间无法通信,系统分裂为多个独立子集群(如 Redis 主从分区后,主库和从库可能同时接受写请求,导致数据不一致)。
- 解决方案:
- 超时机制(如 RPC 调用设置超时时间)。
- 一致性协议(如 Paxos、Raft,解决网络分区时的数据一致性)。
2. 数据一致性
- 问题:多节点存储数据时,如何保证数据副本的一致性(如主从数据库同步延迟,导致读写分离时读取到旧数据)。
- 一致性模型:
- 强一致性:所有节点同时看到最新数据(如分布式锁、银行转账),实现成本高(需同步等待)。
- 最终一致性:短期可能不一致,但经过一定时间后自动恢复一致(如分布式缓存、DNS 系统),可用性更高。
- 解决方案:
- 共识算法(如 Raft,用于分布式数据库的 Leader 选举和数据同步)。
- 分布式事务(如 2PC、TCC,保证跨服务操作的原子性)。
3. 节点故障
- 问题:节点可能宕机、重启或“脑死亡”(进程存活但无法通信),需自动检测并恢复服务。
- 解决方案:
- 心跳检测(节点定期发送心跳,超时未收到则判定为故障)。
- 主从切换(如 Redis 哨兵、Kubernetes 的节点自愈)。
- 副本机制(如每块数据存储 3 个副本,允许最多 2 个节点故障)。
4. 负载均衡
- 问题:如何将请求均匀分配到各节点,避免部分节点过载(“热点问题”)。
- 解决方案:
- 负载均衡器(如 Nginx、LVS,分发流量到后端服务器)。
- 一致性哈希(如分布式缓存 Redis Cluster,避免节点变化导致大量数据迁移)。
五、分布式系统的典型技术栈
功能领域 | 典型技术/工具 |
---|---|
服务通信 | gRPC(RPC 框架)、HTTP/REST、Kafka(消息队列) |
服务治理 | Spring Cloud(微服务框架)、Kubernetes(容器编排) |
分布式存储 | HDFS、Ceph、TiDB、MongoDB 分片集群 |
分布式计算 | Hadoop MapReduce、Spark、Flink |
一致性协议 | Raft(etcd、TiDB)、Paxos |
分布式锁 | Redis 分布式锁、ZooKeeper 分布式锁 |
监控与追踪 | Prometheus(监控)、Jaeger(链路追踪) |
六、如何判断一个系统是否是分布式系统?
满足以下任一特征即可视为分布式系统:
- 多节点协作:任务由多个独立计算机共同完成(如用户请求被负载均衡到不同 Web 服务器)。
- 数据分布存储:数据分散在多个节点(如数据库分库分表,不同表存储在不同节点)。
- 服务独立部署:系统由多个独立部署的服务组成(如微服务架构中的用户服务、订单服务)。
七、总结
分布式系统的本质是 “用多个计算机协同解决单机无法处理的问题”,通过网络将节点连接,对外呈现为统一整体。其核心挑战来自网络不可靠和节点故障,需通过一致性协议、容错机制、负载均衡等技术保证系统的可用性、性能和数据一致性。
一句话概括:分布式系统 = 多节点 + 网络通信 + 协同工作,目标是突破单机局限,支撑高并发、海量数据和高可用服务。