服务器的单体和集群

文章目录

    • [1. 单体服务器](#1. 单体服务器)
    • [2. 服务器集群](#2. 服务器集群)
    • [3. 简单对比](#3. 简单对比)
    • [4. 举个例子](#4. 举个例子)
  • [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、内部协议
相关推荐
liuhuizuikeai1 小时前
可视化门禁---Linux/Qt+SqLite篇
linux·运维·qt
charlie1145141914 小时前
嵌入式Linux驱动开发——新 API 字符设备驱动完整教程 - 从设备结构体到应用测试
linux·运维·驱动开发
飞Link5 小时前
2000 亿砸向算力:字节跳动 AI 基建跨越,后端与运维的“万亿 Token”生死战
运维·人工智能
SWAGGY..5 小时前
Linux系统编程:(二)基础指令详解
linux·运维·服务器
张文君6 小时前
上古世纪服务端编译安装AAEmu docker编译安装
运维·docker·容器
蜡笔婧萱6 小时前
Linux--远程登录服务ssh
linux·服务器·ssh
雾岛心情6 小时前
小铭邮件管理工具箱的界面(公司版)
运维·服务器·工具·o365·小铭邮件工具箱(公司版)
一只鹿鹿鹿6 小时前
数据库运维与管理规范(WORD)
运维·数据库
伏加特遇上西柚7 小时前
Loki+Alloy+Grafana日志采集部署
java·linux·服务器·spring boot·grafana·prometheus