文章目录
- [1. 服务器之间靠什么连接?](#1. 服务器之间靠什么连接?)
-
- [1.1 最底层:网卡、网线、交换机](#1.1 最底层:网卡、网线、交换机)
- [2. 数据靠什么相互传输?](#2. 数据靠什么相互传输?)
- [3. 常见的服务器间通信方式](#3. 常见的服务器间通信方式)
-
- [3.1 HTTP / HTTPS 通信](#3.1 HTTP / HTTPS 通信)
- [3.2 RPC 通信](#3.2 RPC 通信)
- [3.3 数据库连接](#3.3 数据库连接)
- [3.4 数据库主从复制](#3.4 数据库主从复制)
- [3.5 Redis 集群同步](#3.5 Redis 集群同步)
- [3.6 消息队列传输](#3.6 消息队列传输)
- [3.7 共享存储 / 对象存储](#3.7 共享存储 / 对象存储)
- [4. 负载均衡器在中间做什么?](#4. 负载均衡器在中间做什么?)
- [5. 集群内部传输的数据有哪些?](#5. 集群内部传输的数据有哪些?)
服务器的 单体 和 集群 ,可以理解为两种不同的部署方式。
1. 单体服务器
单体服务器通常指一个系统主要部署在一台服务器上,或者核心服务都集中在一台机器上运行。
例如一个网站可能包含:
用户请求
↓
一台服务器
├─ Web 服务
├─ 后端接口
├─ 数据库
└─ 文件存储
也就是说,前端页面、后端程序、数据库、缓存、文件等都可能在同一台服务器上。
优点
部署简单,成本低,适合个人项目、小型网站、测试环境。
维护也比较直观,例如你只需要登录一台服务器,就能看到大部分服务状态。
缺点
单点故障明显。
如果这台服务器宕机,整个系统可能都不可用。
另外,扩展能力有限。当访问量变大时,单台服务器的 CPU、内存、磁盘、带宽都会成为瓶颈。
2. 服务器集群
服务器集群是指多台服务器共同提供服务。它们可以分工协作,也可以互为备份。
常见结构如下:
用户请求
↓
负载均衡器
↓
多台应用服务器
├─ Server A
├─ Server B
└─ Server C
↓
数据库 / 缓存 / 文件存储
用户访问系统时,请求先到负载均衡器,比如 Nginx、LVS、云厂商 SLB,然后被分发到不同服务器上。
优点
高可用:某一台服务器挂了,其他服务器还能继续工作。
高并发:多台服务器一起处理请求,能承载更多用户访问。
可扩展:流量变大时,可以增加服务器数量,也就是水平扩容。
缺点
架构更复杂。
你需要考虑很多额外问题,例如:
负载均衡
服务健康检查
数据库主从或分片
缓存一致性
文件共享
日志收集
服务监控
故障恢复
所以集群适合访问量较大、对稳定性要求较高的系统。
3. 简单对比
| 对比项 | 单体服务器 | 服务器集群 |
|---|---|---|
| 服务器数量 | 通常一台 | 多台 |
| 部署复杂度 | 低 | 高 |
| 成本 | 低 | 较高 |
| 可用性 | 较低,有单点故障 | 较高,可容灾 |
| 扩展能力 | 主要靠升级机器配置 | 可以增加机器数量 |
| 适用场景 | 小项目、个人站点、测试环境 | 中大型系统、高并发业务 |
4. 举个例子
假设你做了一个博客系统。
刚开始访问量很小,可以这样部署:
一台服务器:
- Nginx
- Java / Node / Python 后端
- MySQL
- Redis
这就是典型的单体部署。
后来访问量变大,你可能改成:
负载均衡服务器:
- Nginx
应用服务器:
- App Server 1
- App Server 2
- App Server 3
数据库服务器:
- MySQL 主库
- MySQL 从库
缓存服务器:
- Redis 集群
文件存储:
- OSS / MinIO / NAS
这就是集群化部署。
服务器集群里的不同服务器,本质上是通过网络 连接的,数据也是通过网络协议在服务器之间传输的。
可以分成三层理解:
物理连接:网线 / 光纤 / 交换机 / 路由器
网络通信:IP / TCP / UDP
应用传输:HTTP / RPC / MySQL复制 / Redis同步 / MQ消息等
1. 服务器之间靠什么连接?
1.1 最底层:网卡、网线、交换机
在机房或云服务器环境中,多台服务器通常接入同一个局域网。
Server A ─┐
Server B ─┼── 交换机 ── 路由器 / 防火墙 / 外网
Server C ─┘
每台服务器都有网卡,每台服务器都有自己的内网 IP,比如:
Server A: 10.0.0.11
Server B: 10.0.0.12
Server C: 10.0.0.13
它们之间可以通过内网 IP 互相访问。
例如在 Server A 上访问 Server B:
bash
ping 10.0.0.12
curl http://10.0.0.12:8080
如果是在云服务器上,比如阿里云、腾讯云、AWS,一般会使用:
VPC / 专有网络
内网 IP
安全组
负载均衡
云数据库
云服务器之间通常也是通过内网 IP通信,而不是走公网。
2. 数据靠什么相互传输?
数据传输本质上靠网络协议。
最常见的是:
TCP/IP
UDP
HTTP / HTTPS
RPC
数据库协议
消息队列协议
缓存同步协议
可以简单理解为:
数据 → 按协议封装 → 通过网卡发出 → 交换机转发 → 对方服务器接收 → 解包处理
3. 常见的服务器间通信方式
3.1 HTTP / HTTPS 通信
这是最常见的方式。
比如 Server A 要调用 Server B 的接口:
Server A → HTTP 请求 → Server B
示例:
bash
curl http://10.0.0.12:8080/api/user/1001
这种方式适合:
后端服务调用
微服务接口调用
管理后台调用业务服务
前端服务调用 API 服务
例如:
订单服务 → HTTP → 用户服务
订单服务 → HTTP → 支付服务
3.2 RPC 通信
RPC 全称是 Remote Procedure Call,远程过程调用。
它和 HTTP 类似,也是服务器之间互相调用,只是通常更偏后端内部服务调用。
常见 RPC 技术:
gRPC
Dubbo
Thrift
Motan
比如:
订单服务调用库存服务:
OrderService.buy()
↓ RPC
InventoryService.deduct()
RPC 的特点是调用方式更像本地方法:
java
inventoryService.deduct(productId, count);
但实际底层还是通过网络发送数据。
3.3 数据库连接
应用服务器连接数据库服务器时,走的是数据库协议。
例如:
App Server 1 ─┐
App Server 2 ─┼── MySQL Server
App Server 3 ─┘
连接方式通常是:
MySQL: 3306 端口
PostgreSQL: 5432 端口
MongoDB: 27017 端口
Redis: 6379 端口
例如 Java 连接 MySQL:
jdbc:mysql://10.0.0.20:3306/app_db
这表示应用服务器通过内网 IP 10.0.0.20 连接数据库服务器的 3306 端口。
3.4 数据库主从复制
数据库服务器之间也会传输数据。
例如 MySQL 主从复制:
MySQL 主库
↓ binlog
MySQL 从库
当主库写入数据:
sql
INSERT INTO user VALUES (...);
主库会把变更记录写入 binlog,然后从库拉取这些 binlog,再重放执行,从而保持数据同步。
结构类似:
应用服务器
↓ 写入
MySQL 主库
↓ 复制
MySQL 从库
常见用途:
读写分离
数据备份
故障切换
提高查询能力
3.5 Redis 集群同步
Redis 节点之间也会通信。
例如:
Redis Master
↓
Redis Replica
或者 Redis Cluster:
Redis Node A
Redis Node B
Redis Node C
它们之间会传输:
主从复制数据
集群槽位信息
节点状态
心跳检测
故障切换信息
所以 Redis 集群不是几台机器各自独立运行,而是节点之间会通过网络不断通信。
3.6 消息队列传输
有些数据不是服务器直接传给服务器,而是通过消息队列中转。
例如:
订单服务 → MQ → 库存服务
常见 MQ:
RabbitMQ
Kafka
RocketMQ
ActiveMQ
Pulsar
比如用户下单后:
订单服务创建订单
↓
发送消息到 MQ
↓
库存服务消费消息
↓
扣减库存
这种方式的好处是:
解耦
削峰
异步处理
失败重试
3.7 共享存储 / 对象存储
如果多台服务器都需要访问同一批文件,通常不会每台服务器各存一份,而是使用共享存储。
常见方案:
NAS
NFS
MinIO
阿里云 OSS
腾讯云 COS
AWS S3
例如:
App Server 1 ─┐
App Server 2 ─┼── 对象存储 / 文件存储
App Server 3 ─┘
用户上传图片后,应用服务器把图片上传到 OSS,其他服务器访问同一个 OSS 地址即可。
4. 负载均衡器在中间做什么?
集群里通常会有负载均衡。
用户请求
↓
负载均衡器
↓
App Server 1
App Server 2
App Server 3
负载均衡器负责把请求分发给不同服务器。
常见负载均衡器:
Nginx
HAProxy
LVS
云厂商 SLB / CLB / ELB
Kubernetes Service / Ingress
例如 Nginx 配置:
upstream app_servers {
server 10.0.0.11:8080;
server 10.0.0.12:8080;
server 10.0.0.13:8080;
}
server {
listen 80;
location / {
proxy_pass http://app_servers;
}
}
用户访问的是 Nginx,Nginx 再把请求转发给后面的应用服务器。
5. 集群内部传输的数据有哪些?
不同服务器之间传输的数据类型很多,比如:
| 数据类型 | 例子 | 常用方式 |
|---|---|---|
| 请求数据 | 用户请求、接口调用 | HTTP、RPC |
| 数据库数据 | SQL 查询、写入 | MySQL 协议、PostgreSQL 协议 |
| 同步数据 | 主从复制、状态同步 | binlog、复制协议 |
| 缓存数据 | Redis 读写、Redis 同步 | Redis 协议 |
| 消息数据 | 订单消息、支付消息 | Kafka、RabbitMQ、RocketMQ |
| 文件数据 | 图片、视频、附件 | NFS、OSS、S3、MinIO |
| 监控数据 | CPU、内存、日志、链路追踪 | Prometheus、ELK、OpenTelemetry |
| 心跳数据 | 判断节点是否存活 | TCP、UDP、内部协议 |