集群与分布式
随着业务增长,单机系统迟早会遇到性能瓶颈。无论 CPU、内存还是数据库能力,都存在上限。因此,高并发系统最终一定会走向:
“多机器共同工作”。
而实现这一目标,通常会经历两个阶段:
- 集群(Cluster)
- 分布式(Distributed System)
一、什么是集群
集群最核心的特点是:
多台机器运行“同一种服务”,共同对外提供能力。
例如:
- 多台 Web 服务器
- 多台 Nginx
- 多台 Redis
- 多台 MySQL 从库
用户请求会被负载均衡分发到不同机器。
其目标主要有两个:
1. 提升并发能力
单机扛不住流量时:
- 增加机器
- 分摊请求压力
这叫横向扩展(Scale Out)。
2. 提升可用性
如果一台机器挂掉:
- 其他机器继续提供服务
避免单点故障。
二、集群的核心特点
集群中的节点通常:
- 功能相同
- 地位平等
- 部署同一套代码
比如:
5 台 Web Server:
- 都能处理登录
- 都能处理下单
- 都能处理查询
因此:
集群解决的是“同一种能力不够”的问题。
三、什么是分布式
当系统继续发展,仅靠“复制机器”已经不够。
因为系统会出现:
- 代码越来越大
- 模块越来越多
- 团队协作困难
- 数据量暴涨
- 单库单表瓶颈
这时系统开始拆分。
于是进入:
分布式系统阶段。
四、分布式的核心思想
分布式的核心不是“多台机器”。
而是:
“不同机器负责不同功能”。
例如:
- 用户服务
- 订单服务
- 支付服务
- 库存服务
- 推荐服务
每个服务:
- 独立部署
- 独立扩容
- 独立数据库
- 独立开发
因此:
分布式解决的是“系统复杂度过高”的问题。
五、集群和分布式的本质区别
最核心区别:
| 集群 | 分布式 |
|---|---|
| 多机器做同一件事 | 多机器做不同的事 |
| 解决性能和高可用 | 解决系统复杂度 |
| 节点功能相同 | 节点功能不同 |
| 强调“复制” | 强调“拆分” |
六、系统为什么必须分布式
文章强调:
大型系统最终一定会分布式化。
原因主要有四个。
1. 单体系统维护困难
系统越来越大后:
- 代码耦合严重
- 修改风险极高
- 编译部署变慢
一个小改动可能影响整个系统。
2. 团队协作困难
几十人甚至上百人开发同一系统时:
- 冲突严重
- 发布困难
- 职责不清晰
因此必须拆分。
3. 单机资源存在上限
数据库:
- 单机 IO 有极限
- 单表数据量有极限
服务:
- CPU 有上限
- 内存有上限
因此必须分布式扩展。
4. 不同业务增长速度不同
例如:
订单服务压力很大, 但用户服务压力不高。
如果是单体: 只能整体扩容。
如果分布式: 只扩容订单服务即可。
这叫:
按需扩容。
七、分布式系统带来的新问题
文章强调:
分布式不是银弹。
它解决了单体问题,但引入了更多复杂性。
1. 网络通信问题
单体系统:
- 方法调用
分布式系统:
- RPC
- HTTP
- 网络传输
于是会出现:
- 超时
- 丢包
- 网络抖动
2. 分布式事务问题
单体系统:
- 一个数据库事务即可
分布式系统:
- 多服务
- 多数据库
传统事务无法保证一致性。
因此必须:
- 最终一致性
- 消息补偿
- Saga
- TCC
3. 分布式锁问题
多个节点同时操作资源时:
需要协调并发。
因此会引入:
- Redis 锁
- ZooKeeper 锁
4. 数据一致性问题
多副本、多缓存情况下:
数据同步变复杂。
系统往往只能做到:
- 最终一致性 而非:
- 强一致性。
5. 运维复杂度提升
单体:
- 一台机器
分布式:
- 上百服务
- 上千机器
因此需要:
- 自动部署
- 服务治理
- 监控告警
- 链路追踪
八、分布式系统的核心原则
文章里实际上强调了几个非常重要的工程思想。
1. 优先拆业务,而不是拆技术
正确拆分方式:
按业务边界拆:
- 用户
- 订单
- 支付
而不是:
- Controller
- Service
- DAO
2. 高内聚、低耦合
服务内部:
- 功能集中
服务之间:
- 尽量少依赖
否则会形成: “分布式单体”。
3. 不要过度分布式
小系统:
- 单体反而更简单
只有复杂度真正上升后: 才需要分布式。
九、系统演进路径
第一阶段:单机系统
简单、开发快。
第二阶段:集群化
解决性能和高可用问题。
第三阶段:服务拆分
系统开始分布式。
第四阶段:微服务化
服务治理体系成熟:
- 注册中心
- 配置中心
- 网关
- 链路追踪
十、总结
集群解决的是“单机性能和可用性不足”的问题,而分布式解决的是“系统规模和复杂度过高”的问题。系统架构的演进,本质上是随着业务增长,不断通过“复制”和“拆分”来突破单机能力边界。