服务端高并发分布式结构演进之路

核心思想 :分布式不是"高大上"的代名词,而是迫不得已的无奈之举 ------当一台机器扛不住时,只能引入多台机器协作。业务永远比技术更重要,技术只是给业务提供支持。


一、先搞懂几个基本概念

概念 一句话解释 生活类比
应用/系统 为完成服务的一整套程序 一个团队完成一项任务
模块/组件 系统中职责清晰、内聚性强的部分 军队中的突击组、爆破组、掩护组
分布式 多个模块部署在不同服务器,通过网络配合 团队分散到多个城市远程协作办公
集群 多台服务器为同一个目标服务 大批炮兵集中形成炮兵打击集群
主(Master)/从(Slave) 主承担核心写职责,从同步主的数据 班主任 vs 普通任课老师
中间件 不同应用之间的通信桥梁 饭店的采购部(连接厨房和菜市场)

关键指标:

  • 可用性:系统正常服务时长/总时长(如4个9 = 99.99%)

  • 响应时长(RT):用户输入到系统响应的时间(越小越好)

  • 吞吐量:单位时间成功处理的请求数

  • 并发量:同一时刻支持的最高请求量


二、架构演进七步走(以一个电商网站为例)

阶段1:单机架构

这台服务器上既运行着Web程序(处理用户请求),又安装了MySQL(存储数据)。

为什么可以这样?

  • 用户量很少,一天可能就几十个人访问

  • 开发速度快,团队小,改个东西很方便

  • 成本低,租一台云服务器就够了

千万别瞧不起单机架构------绝大多数创业公司的产品,甚至很多成熟的小型系统,至今仍然跑在这种架构上。够用就好,没必要过度设计。

瓶颈在哪?

当用户量慢慢增长(比如从100人涨到1万人),问题就来了:

  • CPU不够用了:每次请求都要计算,请求多了CPU就100%

  • 内存不够用了:每个请求都要占用内存,内存满了开始卡顿

  • 磁盘不够用了:数据越来越多,读写变慢

  • 带宽不够用了:网络传输成为瓶颈

任何一个硬件资源被撑爆,系统就会变慢甚至崩溃。

怎么办?两个选择

方案 做法 优点 缺点
垂直扩展 买更好的服务器(更强的CPU、更大的内存) 不用改代码 贵!性能翻倍可能花4倍的钱,而且有上限
水平扩展 增加多台普通服务器,分担工作 成本低,扩展空间大 需要改架构,技术变复杂

阶段2:应用与数据分离

把应用服务器和数据库服务器拆开到两台不同的机器上:

为什么这样做?

  • 应用服务器需要强劲的CPU和内存(跑业务逻辑)

  • 数据库服务器需要大容量的高速磁盘(存数据、做查询)

分开之后,可以针对各自的需求配置硬件:应用服务器配高配CPU,数据库服务器配SSD固态硬盘。

效果如何?

成本没增加太多,但承载能力提升了一大截。不过这只是一个过渡方案,真正的挑战还在后面。

阶段3:应用服务集群 + 负载均衡

问题:

用户越来越多,单台应用服务器又扛不住了。

这就像一家饭店生意火爆,一个厨师炒菜炒到手抽筋也跟不上点单的速度。

常见的分配算法

  • 轮询:1号、2号、3号、1号、2号......公平分配

  • 加权轮询:性能好的服务器多分一些任务

  • 一致性哈希:同一个用户的请求始终分配给同一台服务器(比如VIP客户有专属客服)

相关软件

  • 软件方案:Nginx、HAProxy、LVS

  • 硬件方案:F5(很贵,但很强)

新问题

应用服务器的问题解决了,但所有的请求最终都要去数据库读写数据------数据库成了新的瓶颈。

负载均衡器就像公司领导 :负责接收所有请求,然后分发给下属(应用服务器)执行。它本身抗压能力远超应用服务器,但如果请求量连LB都扛不住了,就引入多个LB(多机房部署)。

💡 集群的好处:某台主机挂了,其他主机仍能服务,提高了可用性。

阶段4:读写分离 / 主从分离(数据库扛不住了)

痛点 :应用服务器可以无限扩展,但数据库不行------数据分散后一致性无法保障(想象一下转账后一个库改了金额,另一个没改)!

解决方案:

  • 一主多从:主库负责写,从库同步主库数据后负责读

  • 实际场景中 读频率远高于写(100次读 vs 1次写),所以分散读压力效果显著

  • 代价:主从同步需要时间,存在短暂的数据不一致窗口

相关软件:MyCat、TDDL、Amoeba、Cobar(数据库中间件自动分离读写请求)

阶段5:引入缓存 ------ 冷热分离架构

为什么快?

  • 缓存(如Redis)是内存存储,访问速度是微秒级

  • 数据库是磁盘存储,访问速度是毫秒级

  • 差了几十倍甚至上百倍

为什么需要缓存?

数据库天然响应慢!把热点数据(20%的数据满足80%的访问)放到缓存里,访问速度提升数量级。

Redis的定位 :

Redis 是在分布式系统 中才能发挥威力的!**单机程序直接用变量存数据更快,**但进程间是隔离的,无法共享。Redis基于网络,可以把内存中的变量给其他进程、甚至其他主机使用。

缓存带来的问题 :

  • 缓存一致性:数据库改了,缓存怎么同步更新?

  • 缓存穿透/击穿/雪崩:大量请求直接打到数据库

  • 热点数据集中失效:缓存同时过期,请求洪峰涌向数据库

⚠️ 引入缓存后系统复杂度大大提升,且涉及Redis和MySQL之间的数据同步问题。

阶段6:垂直分库(数据库也做业务拆分)

按业务拆分数据库 :用户数据、商品数据、交易数据分别存到不同的数据库集群
如果单表太大 :还可以继续分库分表(如按商品ID哈希、按小时建表)

💡 业务决定技术! 具体怎么分,必须结合实际业务场景。

阶段7:业务拆分 ------ 微服务架构

为什么拆微服务?

本质上是在解决**"人"的问题** !当应用服务器代码越来越复杂,需要更多人维护。人多了就要分组管理,按功能拆成微服务 = 按业务划分组织结构。

微服务的代价 :

  1. 性能下降:服务间通过网络通信(虽然万兆网卡已经比硬盘快了,但还是要花钱)

  2. 复杂度提高 :服务器更多,出问题的概率更大,需要更完善的监控和运维

  3. 可用性挑战:需要一系列手段保证系统整体可用

微服务的优势 :

  • 解决了人的问题(团队分工明确)

  • 功能复用更方便

  • 不同服务可以独立部署、独立扩展


三、Redis 深度认识

3.1 Redis 到底是什么?

"The open source, in-memory data store used by millions of developers as a database , cache , streaming engine , and message broker."

角色 说明
数据库 内存存储,速度极快(但存储空间有限)
缓存 最常用的场景,拦截热点读请求
消息中间件 初心就是做消息队列(生产者-消费者模型),但现在很少直接用,因为有更专业的MQ
流引擎 处理实时数据流

3.2 Redis vs MySQL

对比项 Redis MySQL
存储位置 内存 磁盘
速度 极快(纳秒级) 较慢(毫秒级)
容量 有限(受内存限制) 很大(TB级)
持久化 可配置,但本质内存型 天然持久化
适用场景 热点数据、缓存、临时数据 全量数据、事务性数据

又大又快的方案 :Redis + MySQL 结合使用 ------ MySQL存全量数据,Redis缓存热点数据。

⚠️ 单机程序中,直接用变量比Redis快!Redis的价值在于分布式环境下的跨进程/跨主机数据共享。

所谓的分布式系统,就是想办法引入更多的硬件资源!

但请记住:业务是更重要的,技术只是给业务提供支持的。 不要为了分布式而分布式。

相关推荐
老陈说编程14 小时前
1. 鸿蒙 (HarmonyOS) 2012 至 2026 年的发展历程
分布式·华为·个人开发·harmonyos·鸿蒙·鸿蒙系统·程序员创富
ly76892 天前
Redis 分布式锁的边界条件:Redlock 争议、锁续期与客户端崩溃后的互斥失效
数据库·redis·分布式·分布式锁·watchdog·redlock
灯澜忆梦3 天前
【minio】#5 | MinIO 分布式部署 + HTTPS 部署
分布式·网络协议·https·对象存储·minio
谢亮_vipxieliang3 天前
Spring Cloud 服务治理入门:注册发现、配置中心、网关限流、熔断降级与分布式一致性方案
分布式·spring·spring cloud
樱花落木兰3 天前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
ShineWinsu3 天前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
Flynt4 天前
Redis Cluster主节点挂了,为什么"高可用"还全员掉线?我把三次kill的记录翻出来了
数据库·redis·分布式
JosieBook4 天前
【数据库】MySQL 实战精通系列 · 第10篇:分库分表与分布式事务实战
数据库·分布式·mysql
梦帮科技4 天前
vLLM / TensorRT-LLM 极限推理:PagedAttention 细粒度物理页表管理与连续批处理(Continuous Batching)实战
数据结构·人工智能·分布式·python·深度学习·算法·vllm