【高并发架构】从 0 到亿,从单机部署到 K8s 编排:高并发架构的 8 级演进之路

王旭晨个人主页

🔥 个人专栏 : 《开发工具指南》《前端小站》《MySQL数据库》

🔖永远不要相信苦难是值得的,苦难就是苦难,苦难不会带来成功...... 磨炼意志是因为苦难无法躲开。 ​ -余华-

在互联网行业飞速发展的当下,企业应用从初创期的寥寥数人使用,到成长为承载亿级用户、应对峰值并发访问的平台,系统架构的"承载力"始终是业务持续发展的核心保障。一款产品能否经得住海量流量的冲击,能否在高负载下保持服务稳定可用,能否支撑业务快速迭代升级,背后都离不开架构设计的持续优化与演进。

但架构演进从无"一步到位"的神话。从支撑小规模业务的单机架构,到优化资源分配的应用数据分离架构;从突破单机性能瓶颈的应用服务集群架构,到缓解数据库压力的读写分离、冷热分离、垂直分库架构;再到应对系统复杂度的微服务架构,以及云原生时代的容器编排架构......每一类架构的诞生,都是技术团队为解决特定阶段"性能瓶颈、扩展性不足、开发运维效率低"等核心问题,探索出的阶段性最优解。

本文将沿着"从0到亿"的高并发演进路径,逐一拆解这8级架构的核心逻辑:为什么需要演进?核心解决什么问题?技术栈如何落地?带你理清架构迭代的底层逻辑,在不同业务阶段找准架构设计的核心思路。

一、单机架构:互联网初期的极简选择

1.1 概念引入:小流量场景的"一站式"解决方案

在互联网发展初期,大多数产品都处于初创阶段,用户访问量稀少,业务逻辑简单,对系统的性能、安全性和扩展性都没有过高要求。此时,追求架构的简洁性和低成本成为核心目标,单机架构应运而生。

所谓单机架构,就是将应用程序、数据库、文件存储等所有服务组件,全部部署在同一台物理服务器或虚拟机上。所有用户的请求都在这一台机器内完成全链路处理------从接收请求、业务逻辑计算,到数据库查询、数据返回,无需跨服务器通信,架构简单直观,开发和运维成本极低,甚至不需要专业的运维人员即可维护。

1.2 技术栈模型:单节点的全链路处理流程

单机架构的技术栈非常简单,核心流程仅有3步:

  1. 用户打开浏览器,输入目标域名(如www.example.com);

  2. 浏览器将域名解析请求发送给DNS服务器,DNS服务器返回对应的服务器IP地址;

  3. 浏览器通过IP地址向目标服务器发送请求,服务器内部直接调用本地部署的数据库查询数据,处理完成后将结果返回给浏览器。

这个阶段的核心技术栈通常是:Web服务器(Tomcat/Nginx)+ 应用程序(Java/PHP/Python)+ 数据库(MySQL),所有组件均部署在单台服务器上,资源共用,架构轻盈。

二、应用数据分离架构:解决单机资源竞争难题

2.1 概念引入:拆分核心组件,释放资源压力

随着产品用户量的小幅增长,单机架构的弊端逐渐显现:应用服务和数据库服务共用一台服务器的CPU、内存、磁盘和网络资源,不可避免地出现资源竞争问题。比如,当应用程序进行大量计算占用过多CPU时,数据库查询会因为资源不足而变慢;反之,数据库进行大量数据读写时,应用服务也会出现响应延迟。

为了解决这一问题,应用数据分离架构应运而生。核心思路是:将应用服务和数据库服务拆分部署在两台不同的服务器上,两者通过网络进行通信,各自占用独立的硬件资源,避免相互竞争,从而提升整体系统的稳定性和性能。

2.2 技术栈模型:跨节点的请求处理流程

应用数据分离架构的核心变化是"组件拆分",整体流程与单机架构类似,仅新增了跨服务器通信的环节:

  1. 用户通过浏览器输入域名,经DNS解析获得应用服务器的IP地址;

  2. 浏览器向应用服务器发送请求,应用服务器处理业务逻辑后,通过网络向独立部署的数据库服务器发送数据查询/写入请求;

  3. 数据库服务器处理请求后,将结果通过网络返回给应用服务器;

  4. 应用服务器将最终结果返回给浏览器。

这个阶段的技术栈在单机架构基础上,新增了"跨服务器网络通信"能力,核心组件仍为Web服务器、应用程序和数据库,只是部署在了不同节点。

三、应用服务集群架构:突破单机性能上限

3.1 概念引入:水平扩展,应对访问量激增

当产品逐渐流行,用户访问量迎来爆发式增长时,单台应用服务器的性能上限成为新的瓶颈------即使已经实现应用数据分离,单台应用服务器的CPU、内存和网络带宽也无法承载海量并发请求,会出现响应超时、服务不可用等问题。

最直接有效的解决方案就是"水平扩展":增加应用服务器的数量,让多台应用服务器组成集群,共同处理用户请求,这就是应用服务集群架构。但新的问题随之而来:每台应用服务器都有独立的IP地址,用户的请求应该发送给哪一台服务器?

为了解决这个问题,"负载均衡"组件应运而生。负载均衡服务器作为请求入口,接收所有用户请求,然后按照预设的策略(如轮询、加权轮询、最少连接数等)将请求分发到集群中的不同应用服务器,实现请求的均匀分配,避免单台服务器过载。

但随着访问量持续增长,单台负载均衡服务器也会成为新的瓶颈。此时需要构建"多层负载均衡体系":在前端部署多台负载均衡服务器,再通过更高级别的负载均衡组件或技术对其进行负载分发。常见的负载均衡方案按性能层级可分为三类:

  • Nginx:工作在应用层,可处理1~10万级并发,适合中小规模场景;

  • LVS:工作在网络层,性能优于Nginx,可处理10~100万级并发,适合中大规模场景;

  • F5:硬件负载均衡设备,性能最强,可处理100~1000万级并发,适合超大规模场景。

如果最高级别的F5也无法承载峰值流量,还可以借助DNS实现"终极负载均衡":DNS服务器可以配置多个目标IP(对应不同的负载均衡集群),当用户请求域名解析时,DNS根据用户地理位置、网络运营商等信息,返回不同的IP地址,将请求分发到不同的集群节点,实现跨地域、跨集群的负载均衡。

3.2 技术栈模型:多层分发的集群处理流程

应用服务集群架构的核心流程的是"请求多层分发+响应反向传递":

  1. 用户通过浏览器输入域名,向DNS服务器发送解析请求;

  2. DNS服务器返回负载均衡服务器的IP地址(多层负载均衡场景下,可能先返回上层负载均衡IP);

  3. 浏览器将请求发送到负载均衡服务器,负载均衡服务器根据分发策略,将请求转发到集群中状态正常的应用服务器;

  4. 应用服务器处理请求后,向数据库服务器查询/写入数据,获取结果后返回给负载均衡服务器;

  5. 负载均衡服务器将结果反向传递给浏览器,完成一次请求。

这个阶段的核心技术栈新增了负载均衡组件(Nginx/LVS/F5),应用服务器则通过水平扩展形成集群,数据库服务器仍为单节点(后续架构会解决数据库瓶颈)。

四、读写分离/主从分离架构:缓解数据库压力

4.1 概念引入:读写拆分,提升数据库并发能力

应用服务集群架构解决了应用层的性能瓶颈,但新的问题很快出现:所有应用服务器都需要向数据库发送读写请求,随着并发量的增长,单台数据库服务器的CPU、内存和磁盘IO压力急剧增大,成为系统新的性能瓶颈。

直接增加数据库服务器数量可行吗?答案是"可以,但需要解决数据一致性问题"------如果多台数据库各自独立存储数据,会导致不同用户读取到的数据不一致。因此,"读写分离/主从分离"架构应运而生,核心思路是:

  • 设置1台主数据库服务器,专门负责处理所有写请求(插入、更新、删除);

  • 设置多台从数据库服务器,专门负责处理所有读请求(查询);

  • 主数据库完成写操作后,通过"主从复制"机制将数据同步到所有从数据库,保证主从数据一致。

这种架构的优势在于:将读请求和写请求拆分到不同的数据库节点,读请求可以通过多台从数据库进行水平扩展,大幅提升数据库的并发处理能力;同时,主数据库仅专注于写操作,避免了读写请求的相互干扰,提升了写操作的稳定性。

为了实现读请求在多台从数据库之间的负载均衡,需要引入数据库中间件(如Mycat、TDDL),由中间件负责将读请求分发到不同的从数据库,同时将写请求路由到主数据库,对应用层透明,无需修改应用代码。

4.2 技术栈模型:读写差异化的数据库处理流程

读写分离架构的核心流程是"读写请求路由+主从数据同步":

  1. 用户请求经DNS解析、负载均衡分发后,到达应用服务集群;

  2. 应用服务器将请求发送给数据库中间件,由中间件判断请求类型(读/写);

  3. 如果是写请求:中间件将请求路由到主数据库,主数据库完成写操作后,通过主从复制机制将数据同步到所有从数据库;

  4. 如果是读请求:中间件将请求分发到任意一台从数据库,从数据库查询数据后返回给应用服务器;

  5. 应用服务器将结果经负载均衡、DNS反向传递给浏览器。

这个阶段的核心技术栈新增了数据库中间件(Mycat/TDDL)和主从复制机制,数据库层实现了读写拆分和水平扩展,进一步提升了系统的并发承载能力。

五、冷热分离架构:利用缓存提升读取效率

5.1 概念引入:缓存热数据,降低磁盘IO压力

实现读写分离后,数据库的并发能力得到了提升,但新的问题依然存在:无论是主数据库还是从数据库,数据都存储在磁盘上,磁盘IO的读写速度相对较慢,而高频读请求(如热点商品查询、用户信息查询)反复访问磁盘,会导致读取延迟,影响用户体验。

为了解决这个问题,"冷热分离"架构应运而生,核心思路是:引入缓存组件,将高频访问的"热数据"(如最近1小时内被访问1000次以上的数据)存储在缓存中,将访问频率极低的"冷数据"(如3个月内未被访问的数据)仍存储在数据库磁盘中。用户请求读取数据时,优先从缓存中查询,缓存命中则直接返回数据;缓存未命中时,再从数据库中查询,并将查询结果写入缓存,供后续请求使用。

缓存组件的选择上,Redis是目前最主流的方案------Redis是一款高性能的内存数据库,读写速度极快(每秒可处理数十万次请求),支持多种数据结构(字符串、哈希、列表等),能够满足大多数热数据缓存场景的需求。

5.2 技术栈模型:缓存优先的读取流程

冷热分离架构的核心流程是"缓存优先查询+缓存更新":

  1. 用户请求经负载均衡分发到应用服务器;

  2. 应用服务器首先向Redis缓存发送查询请求,查询目标数据是否存在;

  3. 如果缓存命中(数据存在):Redis直接将热数据返回给应用服务器,应用服务器无需访问数据库,快速响应请求;

  4. 如果缓存未命中(数据不存在):应用服务器向数据库中间件发送读请求,由中间件将请求分发到从数据库;

  5. 从数据库查询到冷数据后,返回给应用服务器,同时应用服务器将该数据写入Redis缓存(设置合理的过期时间,避免缓存过期);

  6. 应用服务器将数据返回给用户,完成请求。

这个阶段的核心技术栈新增了缓存组件Redis,通过"内存缓存+磁盘数据库"的冷热分离模式,大幅降低了数据库的磁盘IO压力,提升了高频读请求的响应速度,优化了用户体验。

六、垂直分库架构:拆分海量数据,提升存储与查询效率

6.1 概念引入:按业务拆分,解决单库数据膨胀问题

随着业务的持续发展,数据量呈指数级增长,即使实现了读写分离和冷热分离,单台数据库服务器的存储压力依然越来越大------海量数据存储在同一数据库中,会导致数据库文件过大,不仅占用大量磁盘空间,还会降低查询效率(索引查询时间变长),同时备份、恢复数据的难度也会增加。

为了解决单库数据膨胀问题,"垂直分库"架构应运而生。核心思路是:按照业务模块对数据库进行拆分,将不同业务类型的数据存储在不同的数据库服务器上。例如,一个电商平台可以拆分为4个独立的数据库:

  • 用户数据库:存储用户信息、登录凭证、收货地址等数据;

  • 商品数据库:存储商品信息、分类、库存等数据;

  • 订单数据库:存储订单信息、支付记录等数据;

  • 日志数据库:存储用户操作日志、系统日志等数据。

垂直分库的优势在于:每个数据库仅存储某一业务模块的数据,数据量大幅减少,提升了查询效率和数据操作的稳定性;同时,不同业务的数据库可以独立扩展,避免了某一业务数据膨胀对其他业务的影响。

垂直分库的实现依然依赖于数据库中间件(如Mycat),由中间件根据请求的业务类型,将请求路由到对应的数据库服务器。此外,为了保证各业务数据库的高可用性,还可以为每个分库部署主从集群;对于缓存层,也可以采用Redis Cluster(Redis官方分布式集群方案)实现缓存的分布式部署;对于关系型数据库的分布式管理,还可以引入TiDB等分布式关系型数据库。

6.2 技术栈模型:业务导向的数据路由流程

垂直分库架构的核心流程是"业务类型识别+分库路由":

  1. 用户请求经负载均衡分发到应用服务器,应用服务器解析请求对应的业务模块(如"查询商品详情"对应商品业务);

  2. 应用服务器将请求发送给数据库中间件,中间件根据业务模块识别目标分库;

  3. 中间件将请求路由到对应的分库(如需读请求,路由到该分库的从集群;如需写请求,路由到该分库的主库);

  4. 分库处理请求后,将结果返回给应用服务器,应用服务器再将结果返回给用户。

这个阶段的核心技术栈进一步完善了分布式组件,包括数据库中间件、Redis Cluster分布式缓存、TiDB分布式数据库等,通过业务拆分解决了单库数据膨胀问题,提升了系统的可扩展性和稳定性。

七、微服务架构:拆分复杂系统,提升开发运维效率

7.1 概念引入:服务化拆分,应对系统复杂度提升

随着业务的不断迭代,系统功能越来越复杂,应用服务集群架构的弊端逐渐显现:所有业务逻辑都耦合在一个应用程序中,导致"巨石应用"问题------代码量庞大,团队协作开发效率低(多人修改同一代码库,冲突频繁);不同业务的迭代节奏相互影响(一个小业务的修改需要全量部署整个应用);资源利用率低(高频业务和低频业务共享同一应用服务器资源,低频业务占用资源导致高频业务性能受影响)。

为了解决这些问题,"微服务架构"应运而生。核心思路是:将复杂的业务系统拆分为多个独立的"微服务",每个微服务专注于处理一个特定的业务模块,具备独立部署、独立扩展、独立维护的能力。例如,电商平台可以拆分为:用户服务、商品服务、订单服务、支付服务、日志服务等。

微服务架构的优势在于:

  • 解耦:每个微服务独立开发、测试、部署,团队协作效率高,迭代速度快;

  • 资源按需分配:高频业务的微服务可以单独水平扩展,低频业务的微服务可以减少资源分配,提升整体资源利用率;

  • 容错性强:单个微服务故障不会影响整个系统的运行,仅影响对应业务模块;

  • 技术栈灵活:不同微服务可以根据业务需求选择合适的技术栈(如用户服务用Java,日志服务用Go)。

在Java生态中,主流的微服务框架有两个:Spring Cloud和Dubbo。两者均用于解决分布式系统中服务间的通信、治理、协调等问题,但设计理念和侧重点不同:Spring Cloud提供了完整的微服务生态(服务注册发现、配置中心、熔断降级、网关等),开箱即用;Dubbo则更专注于服务间的远程调用,性能优异,需要配合其他组件构建完整的微服务架构。

7.2 技术栈模型:服务化的请求处理流程

微服务架构的核心流程是"服务注册发现+请求路由+服务调用":

  1. 用户请求经DNS解析、负载均衡分发到API网关(微服务架构的入口,负责请求路由、认证授权等);

  2. API网关根据请求路径识别对应的微服务(如"/api/order"对应订单服务),并通过服务注册发现组件(如Eureka、Nacos)查询该微服务的可用节点;

  3. API网关将请求路由到目标微服务的某个节点;

  4. 如果该微服务需要调用其他微服务(如订单服务需要调用商品服务查询库存),则通过远程调用框架(如Feign、Dubbo)调用对应服务;

  5. 微服务处理完成后,将结果经API网关、负载均衡返回给用户。

这个阶段的核心技术栈包括:API网关(Spring Cloud Gateway、Zuul)、服务注册发现(Eureka、Nacos)、远程调用框架(Feign、Dubbo)、配置中心(Spring Cloud Config、Nacos)等,通过服务化拆分解决了巨石应用的复杂度问题,提升了开发运维效率和系统的可扩展性。

八、容器编排架构:云原生时代的高效运维解决方案

8.1 概念引入:容器化+编排,解决运维复杂性问题

微服务架构虽然解决了开发和扩展的问题,但随着微服务数量的增加和服务器规模的扩大,运维工作的复杂性呈指数级增长。核心痛点包括:

  • 环境一致性问题:开发、测试、生产环境的配置差异,导致"开发环境正常,生产环境故障"的问题频繁出现;

  • 动态扩缩容效率低:面对短时高并发(如双11、元旦),需要运维人员手动新增数百台服务器并部署微服务;高并发结束后,再手动下线服务,重复工作量大,效率低;

  • 资源利用率低:为了应对峰值流量,服务器资源通常按峰值配置,平时大量资源闲置;

  • 服务部署和管理复杂:大量微服务分散在数百台服务器上,部署、升级、故障排查的难度极大。

为了解决这些运维痛点,"容器编排架构"应运而生,核心思路是:借助容器化技术(如Docker)将微服务及其运行环境打包为标准化的镜像,再通过容器编排工具(如Kubernetes,简称K8s)对容器进行动态调度、部署、扩缩容和管理,实现服务的自动化运维。

8.2 技术栈模型:容器化的部署与运维流程

容器编排架构的核心是"镜像打包+动态编排",核心流程分为两个阶段:

阶段1:镜像打包

将每个微服务及其依赖的运行环境(如JDK、Nginx、配置文件)打包为Docker镜像。Docker镜像可以理解为一个"最小化的操作系统",包含了服务运行所需的所有组件,确保在任何支持Docker的服务器上都能以相同的方式运行,从根本上解决了环境一致性问题。

阶段2:容器编排与管理

  1. 运维人员通过K8s的配置文件,定义微服务的运行规则(如需要多少个副本、资源配额、扩缩容策略等);

  2. K8s根据配置文件,将Docker镜像分发到集群中的服务器节点,并启动容器;

  3. 当流量增长时,K8s根据预设的扩缩容策略(如CPU利用率超过70%时自动增加副本),自动新增容器实例,实现动态扩容;当流量下降时,自动减少容器实例,释放资源;

  4. K8s实时监控容器的运行状态,当某个容器故障时,自动在其他节点重启容器;当某个服务器故障时,自动将该节点上的容器迁移到其他健康节点,确保服务高可用;

  5. 服务升级时,K8s支持滚动更新,逐步替换旧版本容器,避免服务中断。

这个阶段的核心技术栈是Docker(容器化技术)和K8s(容器编排工具),通过自动化运维大幅降低了运维工作量,提升了资源利用率和服务的高可用性,是云原生时代高并发架构的终极形态之一。

总结:架构演进的核心逻辑

从单机架构到容器编排架构,高并发架构的8级演进之路,本质上是"问题驱动"的持续优化过程------每一次演进都源于当前架构无法解决的核心痛点,每一次优化都围绕"提升性能、增强可扩展性、提高开发运维效率、保障高可用"这四大核心目标。

回顾整个演进过程,我们可以总结出两个核心逻辑:

  • 从"垂直拆分"到"水平扩展":初期通过拆分应用与数据、拆分读写请求、拆分业务模块(垂直拆分)解决资源竞争和数据膨胀问题;后期通过增加服务器节点、容器实例(水平扩展)突破单机性能上限,应对海量并发;

  • 从"人工操作"到"自动化":初期架构简单,开发运维依赖人工;随着系统复杂度提升,逐渐引入负载均衡、缓存、中间件、容器编排等技术,实现请求分发、数据同步、服务部署、扩缩容的自动化,降低人工成本,提升系统稳定性。

最后需要强调的是:架构没有"最优解",只有"最适合"。企业在进行架构设计时,无需盲目追求"亿级并发架构",而应根据自身的业务规模、用户量、团队能力和成本预算,选择合适的架构方案,并随着业务的发展逐步演进。毕竟,架构服务于业务,而不是业务服从于架构。

🌸🌸🌸 完结撒花 🌸🌸🌸

相关推荐
L1624761 小时前
Prometheus 监控 K8s 集群全指南(适配 K8s 特性 + 实操部署)
docker·容器·kubernetes
小二·2 小时前
Python Web 开发进阶实战:微前端架构初探 —— 基于 Webpack Module Federation 的 Vue 微应用体系
前端·python·架构
阿方索2 小时前
Kubernetes 1.28 高可用集群安装指南(Docker 运行时)
docker·容器·kubernetes
Python_Study20252 小时前
制造业企业如何构建高效数据采集系统:从挑战到实践
大数据·网络·数据结构·人工智能·架构
小陈phd3 小时前
langGraph从入门到精通(三)——基于LangGraph的智能问答系统开发:Python单代理架构实战
开发语言·python·架构
Mintopia3 小时前
🤖 未来软件表现形式的猜想:帮你直接做你想做的,给你直接要你想要的
人工智能·架构·aigc
独自归家的兔3 小时前
解决k8s UI界面进不去
云原生·容器·kubernetes
last demo3 小时前
docker基础
运维·docker·容器·eureka
孤岛悬城3 小时前
59 k8s集群调度
云原生·kubernetes