【万字长文·图解】
从"单机"到"分布式"到"集群"------一次讲透两者的区别、联系、落地场景与常见架构
一、先放一张脑图
markdown
单机(one box)────┬──> 集群(Cluster):多台机器干**同一件事**(横向复制)
└──> 分布式(Distributed):多台机器干**不同的事**(横向拆分)
关键词
- 集群 = 人多力量大(量)
- 分布式 = 专人干专事(分工)
- 现实中往往"分布式 + 集群"混合出现(既拆分又复制)
二、集群(Cluster)详解
1. 定义
多台物理/虚拟节点组成一个逻辑整体 ,对外提供同一种服务 ,通过复制提高并发量 与可用性。
2. 核心目标
- Scale-Out(横向扩展)
- High-Availability(故障转移)
- Load-Sharing(负载均衡)
3. 分类速记
| 类型 | 说明 | 产品案例 |
|---|---|---|
| 高可用集群 HA | 主备切换,A 挂了 B 立刻顶 | MySQL MGR、Redis Sentinel、Keepalived |
| 负载均衡集群 LB | 多台同时在线,流量分摊 | Nginx、LVS、HAProxy、AWS ELB |
| 计算集群 HPC | 并行计算,CPU 加一起算 | Slurm、Kubernetes Job |
| 存储集群 | 多磁盘拼成统一存储 | Ceph、GlusterFS、HDFS |
4. 经典架构图(以 Web 层为例)
markdown
┌───> 节点 1(Nginx)
LB──┤ ├───> 节点 2(Nginx) 对外 VIP 统一入口
└───> 节点 3(Nginx)
- 所有节点跑同一套代码;
- 会话同步(粘性会话或 Redis);
- 健康检查失败即剔除。
5. 优缺点
✅ 简单:代码零改造
✅ 线性扩容:加机器就提升 QPS
❌ 单点数据仍在单机(例如 MySQL 主库),集群 ≠ 数据分布式
三、分布式(Distributed)详解
1. 定义
把原本单机内不同功能 或同一功能的不同数据 拆到多台节点,节点之间通过网络协作 ,对外表现为一个系统。
2. 核心目标
- 拆分(数据/功能/计算)
- 自治(局部故障不影响全局)
- 最终一致性(CAP 权衡)
3. 拆分维度
| 维度 | 案例 | 产品 |
|---|---|---|
| 业务功能 | 订单服务、用户服务、库存服务独立进程 | 微服务 |
| 数据 | 按用户 ID 取模拆成 32 库 1024 表 | 分库分表、ShardingSphere |
| 计算 | Map 节点 + Reduce 节点各干各的 | Hadoop MapReduce |
| 时空 | 同一任务流水线 Stage1→Stage2 | Flink 流处理 |
4. 经典架构图(微服务 + 分库分表)
markdown
API 网关 ─┬─> 订单服务 ──> 订单库(分片 0-31)
├─> 用户服务 ──> 用户库
└─> 库存服务 ──> 库存库(分片 0-15)
- 每个服务代码不同 、数据不同;
- 节点失败只影响局部;
- 需要分布式事务/消息最终一致性。
5. 优缺点
✅ 突破单机容量上限(数据、计算)
✅ 独立发布、弹性伸缩
❌ 复杂:远程调用、幂等、分布式事务、脑裂、网络分区
❌ 延迟比本地高 1~2 个数量级
四、集群 vs 分布式------一句话对比
| 维度 | 集群 | 分布式 |
|---|---|---|
| 单元关系 | 同构节点(镜像) | 异构节点(分工) |
| 透明性 | 对客户端几乎透明 | 需要服务发现、网关 |
| 扩展目标 | 提升吞吐量 &可用性 | 提升容量 &可维护性 |
| 故障范围 | 节点级冗余,数据仍可能单点 | 局部故障,数据/计算已拆分 |
| 代码改造 | 零/少量 | 必须(接口、数据路由、容错) |
| CAP 侧重 | 侧重 AP(高可用) | 必须面对 CP/AP 选择 |
五、为什么总把两者混用?
"分布式"里每个子服务本身又可以是"集群"------既分工又复制。
电商订单架构示例
订单服务(集群 3 副本)──> 订单表(分片 0-15,每片 2 副本)
- 分布式 :订单表按用户 ID 拆成 16 个分片 → 数据分布式
- 集群 :每个分片有 2 副本 → 高可用集群
六、演进路线(老板最爱问的"三步走")
- 单机 → 集群(先解决并发&可用,不动代码)
- 集群 → 分布式(数据量/研发规模变大,开始拆分)
- 分布式 → 混合云/多活(地域容灾、弹性、成本)
七、常见产品对照表
| 场景 | 集群产品 | 分布式产品 |
|---|---|---|
| 数据存储 | MySQL MGR、Redis Sentinel | MySQL Sharding、TiDB、CockroachDB |
| 计算 | Kubernetes ReplicaSet | Hadoop MapReduce、Spark、Flink |
| 消息 | ------ | Kafka、Pulsar(分区+副本) |
| 协调 | ------ | ZooKeeper、etcd、Consul |
八、一张图总结(保存即可)
markdown
单机
│
┌───────┴───────┐
│ │
集群(复制) 分布式(拆分)
│ │
└───────┬───────┘
▼
现代互联网架构
(微服务 + 分片 + 副本)
九、一句话背下来
集群 让同一台服务 变好多台 ;
分布式 让一台机器的任务 拆成好多台机器的任务 ;真正的大型系统 = 分布式 + 集群 ------既分工又人多。