前言
集群,分布式,微服务,分库分表等等概念很容易混起来,今天我系统性地介绍一下他们到底是怎么分类怎么划分的。
1. 集群
集群是指多个节点组成一个整体,共同对外提供某一种能力。
集群中的节点可以:
-
运行完全相同的服务,例如多个 Web 服务器实例共同处理用户请求
-
存在不同的角色,例如 MySQL 主节点负责写入,从节点负责读取
典型结构:
负载均衡
↓
┌───────────┼───────────┐
↓ ↓ ↓
服务实例A 服务实例B 服务实例C
集群主要解决以下问题:
-
提高并发能力:多个节点共同处理请求,减轻单机压力
-
提高可用性:某个节点出现故障时,其他节点仍然可以继续提供服务
-
便于横向扩容:性能不足时,可以增加新的机器或服务实例
因此,不能简单地把集群理解成"多台机器运行完全相同的代码"。有些集群中的节点也可能具有不同职责。
2. 分布式
分布式是指将一个系统中的业务、任务、计算或数据分散到多个节点上,由多个节点通过网络通信和协作,共同完成整个系统的工作。
分布式系统可以按照不同方式进行拆分:
-
按业务拆分:用户服务、商品服务、订单服务分别部署在不同节点
-
按数据拆分:不同数据存储在不同数据库节点
-
按计算任务拆分:将大型计算任务拆成多个子任务并行执行
-
按地域拆分:在不同地区部署节点,就近为用户提供服务
-
按职责拆分:例如主数据库负责写入,从数据库负责读取
例如:
用户请求
↓
用户服务 → 商品服务 → 订单服务 → 支付服务
机器A 机器B 机器C 机器D
分布式主要解决:
-
单机计算、存储和性能有限的问题
-
大型系统难以维护和扩展的问题
-
不同业务需要独立部署和扩容的问题
-
跨地区访问和容灾问题
但分布式系统也会带来网络延迟、服务调用失败、数据一致性和分布式事务等新问题。
3. 微服务
微服务是一种按照业务能力拆分系统的分布式软件架构。
一个大型系统可以拆分为多个独立服务,例如:
电商系统
├── 用户微服务
├── 商品微服务
├── 订单微服务
├── 支付微服务
└── 物流微服务
每个微服务通常可以:
-
独立开发
-
独立部署
-
独立运行
-
独立扩容
-
由不同团队维护
-
根据需要使用不同的技术或数据库
因此:
微服务通常属于分布式系统,但分布式系统不一定采用微服务架构。
例如 Hadoop 分布式计算、Redis 分布式存储和数据库分库分表都属于分布式技术,但它们并不是微服务架构。
4. 集群、分布式与微服务的关系
集群和分布式不是互斥的概念,它们在实际系统中经常同时存在。
例如一个电商系统:
电商分布式系统
用户服务集群 商品服务集群 订单服务集群
├── 机器A ├── 机器D ├── 机器G
├── 机器B ├── 机器E ├── 机器H
└── 机器C └── 机器F └── 机器I
从整个系统看:
- 用户、商品、订单被拆成不同服务,因此属于分布式或微服务架构
从某一个服务内部看:
- 多台机器共同提供用户服务或订单服务,因此形成了服务集群
三者的关注点不同:
| 概念 | 核心关注点 |
|---|---|
| 集群 | 多个节点如何组成一个整体,共同提供一种能力 |
| 分布式 | 系统中的任务、业务、计算或数据如何分散并协作 |
| 微服务 | 如何按照业务能力将系统拆成独立服务 |
可以简单记忆为:
微服务负责拆业务
集群负责扩服务
分布式负责让多个节点协作
5. 分布式的其他实现形式
微服务只是分布式系统的一种常见架构形式,除此之外还有以下实现形式。
5.1 分布式计算
将一个大型计算任务拆成多个子任务,交给多台机器并行执行,最后汇总计算结果。
典型技术:
-
Hadoop MapReduce
-
Spark
-
Flink
例如:
大型数据处理任务
├── 节点A处理数据分片1
├── 节点B处理数据分片2
└── 节点C处理数据分片3
5.2 分布式存储
将数据分散存储在多个节点上,通过多个节点共同提供存储能力。
典型技术:
-
HDFS
-
Ceph
-
Elasticsearch
-
Redis Cluster
-
MongoDB Sharding
分布式存储主要解决数据量过大、单机磁盘不足、访问压力过高和数据高可用等问题。
5.3 分布式数据库
数据库中的数据、查询和事务由多个数据库节点共同处理。
常见形式包括:
-
主从复制
-
读写分离
-
分库分表
-
数据分片
-
分布式数据库
例如:
写请求 → 主数据库
读请求 → 从数据库A、从数据库B
这种结构既可以称为数据库集群,也体现了分布式职责划分。
5.4 消息驱动架构
不同服务通过消息队列进行异步通信,而不是全部采用同步调用。
例如:
订单服务
↓ 发布"订单已创建"消息
消息队列
├── 库存服务扣减库存
├── 积分服务增加积分
└── 通知服务发送消息
常见消息队列包括:
-
Kafka
-
RocketMQ
-
RabbitMQ
消息驱动架构能够降低服务之间的耦合,但需要处理消息重复、消息丢失和最终一致性等问题。
5.5 SOA 架构
SOA,即面向服务架构,也会将大型系统拆分为多个服务。
与微服务相比,SOA 的服务粒度通常更大,常用于传统大型企业系统,并可能通过 ESB 企业服务总线统一进行服务通信和管理。
6. 分库分表与这些概念的关系
分库分表是一种数据库层面的数据拆分方案,主要用于解决单库或单表数据量过大、访问压力过高的问题。
分表
将一张大表拆成多张结构相同的小表:
原订单表 order
↓
order_0
order_1
order_2
order_3
例如根据用户 ID 取模决定数据存储在哪张表:
tableIndex = userId % 4
分库
将数据拆分到多个数据库实例中:
db_0
db_1
db_2
db_3
分库分表
同时将数据拆分到多个数据库和多张表中:
db_0
├── order_0
└── order_1
db_1
├── order_0
└── order_1
分库分表属于分布式数据存储的一种实现方式。当多个数据库节点共同提供数据库能力时,也可以称为数据库集群。
它们可以从不同层次理解:
| 层次 | 常见方案 |
|---|---|
| 系统架构层 | 分布式架构、微服务架构 |
| 服务部署层 | 服务集群、负载均衡 |
| 数据存储层 | 主从复制、读写分离、分库分表、分布式数据库 |
| 服务通信层 | RPC、消息队列、服务注册与发现 |
一个完整系统可以同时使用这些方案:
系统按照业务拆成微服务
↓
每个微服务部署多个实例形成集群
↓
服务之间通过网络或消息队列通信
↓
数据库通过主从复制或分库分表扩展
最终可以概括为:
集群强调多个节点组成整体,分布式强调任务或数据分散协作,微服务强调按业务能力拆分服务,分库分表强调在数据库层面拆分数据。