本文以“电子商务”应用为例,介绍从一百个到千万级并发情况下服务端的架构演进过程。目的:帮助读者建立对架构演进的整体认知,便于深入学习后续知识
常见概念
评价指标
例如:平时我们常说的4个9即系统可以提供99.99%的可用性,5个9是99.999%的可用性,以此类推。我们平时只是用高可用(High Availability, HA)这个非量化目标简要表达我们系统的追求。
响应时长 和 吞吐 并发 都是衡量服务器性能的标准
适用场景:只有一台服务器,这个服务器负责所有的工作
如上所示就是一个单机架构,对于单价架构来说,就是只有一台服务器,这个服务器可以负责处理所有的工作
我们假设这是一个电商网站,那么这个应用服务其实就是我们写的一个服务器程序,比如说有前面写的一个 C++ 的 httplib 这样的程序,而这样的 HTTP 服务器是可以和 MySQL 数据库的服务进行结合起来的,那么对于 MySQL 来说,它本质上其实是一个客户端服务端结构的程序,本体上是一个 MySQL 的服务器,这个服务器来负责进行数据的存储和组织的部分
而在大多的项目中,其实使用的就是这种比较典型的单机架构,单机架构的特点其实就是简单,并且由于现在计算机的硬件已经发达到了一定的程度,所以哪怕只有一个主机,其实已经是可以有比较高的性能了,可以支持比较大的并发和数据的存储
但是事实上,当业务到达一定程度的时候,其实一个主机已经很难进行处理了,那么就需要用到的是主机,其实本质上是硬件资源
一个主机上的硬件资源是有限的
这句话其实很好理解,因为在一台主机上,它的硬件资源包括但不限于有 CPU ,内存,硬盘,网络等等,当服务器收到请求的时候,其实都是需要消耗这些资源的,在同一时刻,如果处理的请求比较多,那么就会造成此时的某个硬件资源就不够用
如果我们真的遇到了这样服务器不够用的场景,该怎么处理?
补充说明:
现在大部分公司都是这种单机架构,选择原因:初期需要利用精干的技术团队,快速将业务系统投入市场进行检验,并且可以迅速响应变化要求。但好在前期用户访问量很少,没有对我们的性能、安全等提出很高的要求,而且系统架构简单,无需专业的运维团队,所以选择单机架构是合适的
因此我们就引出了下面这种架构体系模式,可以把应用服务器和存储服务器分开
应用服务器:对于应用服务器来说,里面可能包含有很多的业务,这些业务都会需要进行 CPU 和内存的资源
数据库服务器:对于这种服务器来说,它就需要更大的磁盘空间,更快的数据访问速度,因此可以搭配有对应的 SSD 硬盘等
适用场景:单台应用服务器无法满足需求。–引入负载均衡
应用服务器通常来说比较吃 CPU 和内存,那么如果 CPU 和内存都被吃掉了,那此时应用服务器就无法满足要求了,那此时怎么办?
有如下几种方案选择:
负载均衡:为了解决用户流量向哪台应用服务器分发的问题,需要一个专门的系统组件做流量分发。实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中。同时流量调度算法也有很多种,这里简单介绍几种较为常见的:
负载均衡具体的设计模式如下所示:
看起来是两个应用服务器,实际上也可能是多个应用服务器,而对于应用服务器来说,用户的请求实际上会优先到达负载均衡器或者是网关服务器,之后会被分配到每一个应用服务器,所以这也就使得会诞生很多种不同的算法,来进行合适的分配。比如:假设现在有 1w 个请求,经过分配后就可以让每一个服务器去分担 5k
负载均衡相关软件:Nginx、HAProxy、LVS、F5 等
但是上面这样就可以解决问题了吗?
适用场景:数据库成为系统瓶颈
随着业务的增长,可以动态扩张服务器来进行压力的缓解,但是实际上,数据的压力会到达一个系统承载能力的上限,此时如果一味地去扩展数据库的服务器是不现实的,因为存在 数据一致性 的问题。
例如对于同样的数据,如果在不同的机器上是不同的数据,那这必然是一件非常危险的事,所以就诞生了下面的模式 ----- 主从分离架构
随着访问量继续增加,发现业务中⼀些数据的读取频率远大于其他数据的读取频率。我们把这部 分数据称为热点数据,与之相对应的是冷数据(二八原则)
如上所示,在原来的基础上新增一个缓存服务器,这个缓存服务器就会帮助数据库服务器进行负重前行,而在缓存服务器当中其实存放的只是一小部分的热点数据,也就是会频繁访问到的数据,缓存虽然快,但不是没有代价的,那就是它很小,这也就解释了不会有完美的解决方案,只是会有不同的优化场景
随着业务的数据量增大,大量数据存储在同一个库中已经显得有些力不从心了,所以可以按照业务,将数据分别存储。所以下面引入的这个模式架构体系,就是叫做 分库分表
简单来说,就是本来一个数据库服务器,这个数据库服务器上有多个数据库,现在就可以引入多个数据库服务器,让每一个数据库服务器去存储一个或者一部分数据库,甚至说,当一个表特别大的时候,也可以对于表进行拆分
例子如下:
只要实时操作的表数据量足够小,请求能够均匀地分发到多台服务器上的小表,数据库就能通过水平扩展的方式来提高性能。
但是这只是⼀个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来实现的
注意:这种架构其实是MPP (大规模并行处理)架构的⼀类实现
适用场景:数据量增大,单库难以支撑
在之前的应用服务器当中,一个服务器中可能做了很多的业务,这就会导致一个服务器的代码会变的非常的复杂,为了解决这样的问题,就可以使用一个微服务的概念,把一个复杂的服务器拆解为更多的,功能更加单一的更小的服务器
适用场景:业务复杂度增加,团队扩大。
微服务的好处
引入微服务,解决了人的问题,付出的代价?
(1)系统的性能下降 (要想保证性能不下降太多,只能引入更多的机器,更多的硬件资源 =>充钱)
(2)系统复杂程度提高,可用性收到影响
① 单机架构 (应用程序+数据库服务器)
② 数据库和应用分离:应用程序和数据库服务器分别放到不同主机上部署了
③ 引入负载均衡, 应用服务器 =>集群 通过负载均衡器,把请求比较均匀的分发给集群中的每个应用服务器当集群中的某个主机挂了,其他的主机仍然可以承担服务 提高了整个系统的可用性~~
④ 引入读写分离,数据库主从结构,一个数据库节点作为主节点,其他N个数据库节点作为从节点。
上述四点,都是为了 高效的处理更多的数据
⑤ 引入缓存,冷热数据分离
⑥ 引入分库分表,数据库能够进一步扩展存储空间
⑦ 引入微服务,从业务上进一步拆分应用服务器,从业务功能的角度,把应用服务器,拆分成更多的功能更单一、更简单、更小的服务器
上述这样的几个演化的步骤, 只是一个粗略的过程.
所谓的分布式系统, 就是想办法引入更多的硬件资源!!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有