技术架构的演进之路

目录

一、常见概念

二、架构演进

2.1 单机架构

2.2 应用数据分离架构

2.3 应用服务集群架构

2.4 读写分离/主从分离架构

2.5 冷热分离架构

2.6 垂直分库架构

2.7 微服务架构

2.8 容器编排架构

三、互联网应用的架构


一、常见概念

模块(Module)/ 组件(Component)

当应用较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于理解。如:军队中为了进行某据点的攻克,将人员分为突击小组、爆破小组、掩护小组、通信小组等

分布式(Distributed)

系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与数据库分别工作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上

生活例子:为了更好的满足现实需要,一个在同一个办公场地的工作小组被分散到多个城市的不同工作场地中进行远程配合工作完成目标。跨主机之间的模块之间的通信基本要借助网络支撑完成

集群(Cluster)

被部署于多台服务器上的、为了实现特定目标的一组特定的组件,整个整体被称为集群。比如多个 MySQL 工作在不同服务器上,共同提供数据库服务目标,可以被称为一组数据库集群

生活例子:为了解决军队攻克防守坚固的大城市的作战目标,指挥部将大批炮兵部队集中起来形成一个炮兵打击集群

分布式 vs 集群。通常不用太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即工作在不同服务器上并且通过网络通信配合完成任务;而集群更在意逻辑形态,即是否为了完成特定服务目标

主(Master) / 从(Slave)

集群中,通常有一个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。比如 MySQL 集群中,只有其中一台服务器上数据库允许进行数据的写入(增/删/改),其他数据库的数据修改全部要从这台数据库同步而来,则把那台数据库称为主库,其他数据库称为从库

中间件(Middleware)

一类提供不同应用程序用于相互通信的软件,即处于不同技术、工具和数据库之间的桥梁

生活例子:一家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变大,成立一个采购部,由采购部专职于采买业务,称为厨房和菜市场之间的桥梁

容器(Docker)

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上,也可以实现虚拟化。可以理解为一个集装箱,集装箱里面是每个用户的货物,整体打包

容器编排(K8S)

kubernetes,简称 K8s,是用 8 代替名字中间的 8 个字符“ubernete”而成的缩写
是一个开源的,用于管理云平台中多个主机上的容器化的应用, Kubernetes 的目标是让部署容器化的应用简单并且高效。可以理解为一个货船,按照集装箱的大小、货物情况合理的来组织集装箱完成整体货物的搬运

可用性(Availability)

考察单位时间段内,系统可以正常提供服务的概率/期望

年化系统可用性 = 系统正常提供服务时长 / 一年总时长

这里暗含着一个指标,即如何评价系统提供无法是否正常,就不深入了。平时常说的 4个9 即系统可以提供 99.99% 的可用性, 5 个 9 是 99.999% 的可用性, 以此类推。平时只是用高可用(High
Availability HA)这个非量化目标简要表达我们对系统的追求

响应时长(Response Time RT)

指用户完成输入到系统给出用户反应的时长

如:点外卖业务的响应时长 = 拿到外卖的时刻 - 完成点单的时刻

通常需要衡量的是最长响应时长、平均响应时长和中位数响应时长。这个指标原则上是越小越好,但很多情况下由于实现的限制,需要根据实际情况具体判断

吞吐(Throughput) vs 并发(Concurrent)

吞吐考察单位时间段内,系统可以成功处理的请求的数量

并发指系统同一时刻支持的请求最高量

实践中,并发量往往无法直接获取,很多时候都是用极短的时间段(比如 1 秒)的吞吐量做代替。平时用高并发(Hight Concurrnet)这个非量化目标简要表达对系统的追求

二、架构演进

2.1 单机架构

单机架构即应用服务与数据库服务共用一台服务器,主要出现在互联网早期以及如今的学生作品,访问量较小,单机足以满足需求

单机架构优缺点

优点:部署简单且成本较低

缺点:应用服务与数据库服务相互竞争资源,存在严重的性能瓶颈

2.2 应用数据分离架构

随着系统的访问量逐步上升,逐渐逼近了硬件资源的极限,此时选择将应用和数据分离的做法,可以最小代价的提升系统的承载能力

此时应用和数据库在各自的服务器上通过网络协作完成业务运行

应用数据分离架构的优缺点

优点:

  1. 成本相对可控(仅增加一台服务器)
  2. 性能相对单机架构而言,出现提升
  3. 数据库单独隔离,不易因应用服务破坏数据库,有一定容灾能力

缺点:

  1. 硬件成本变高
  2. 依然存在性能瓶颈,无法应对海量并发

2.3 应用服务集群架构

系统访问量逐步上升,单个应用不足以支持海量的并发请求,高并发的时候站点响应变慢。单机应用服务器首先遇到了瓶颈,摆在技术团队面前的有两种方案

  • 垂直扩展 / 纵向扩展 Scale Up。通过购买性能更优的应用服务器来应对更多的流量。这种方案的优势在于不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增长关系是非线性的,选择性能 2 倍的硬件可能需要花费超过 4 倍的价格,其次硬件性能提升是有明显上限的
  • 水平扩展 / 横向扩展 Scale Out。通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。这种方案的优势在于成本相对较低,并且提升的上限空间也很大。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验

明显,进行水平扩展更加合适,但这需要引入一个新的组件:负载均衡,为了解决用户流量向哪台应用服务器分发的问题,需要一个专门的系统组件做流量分发。实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中

应用服务集群架构的优缺点

优点:

  1. 应用服务高可用,不会某个服务出现问题导致整个站点挂掉
  2. 应用服务具备一定高性能,若不访问数据库,应用服务通过扩展可以支持海量请求快速响应
  3. 应用服务有一定扩展能力,支持横向扩展

缺点:

  1. 数据库成为性能瓶颈,无法应对数据库的海量查询
  2. 数据库是单点的,不存在高可用
  3. 应用扩展后,运维工作增多
  4. 硬件成本较高

2.4 读写分离/主从分离架构

数据库成为瓶颈,而互联网应用一般读多写少,数据库承载压力大,主要是由这些读的请求造成的,那么可以把读操作和写操作分开

将数据库读写操作分散到不同的节点上,数据库服务器搭建主从集群,一主一从、一主多从都可以,数据库主机负责写操作,从机只负责读操作

大部分的系统中,读写请求都是不成比例的。如100次读1次写,所以只要将读请求由各个从库分担之后,数据库的压力就没有那么大了。这个过程不是无代价的,主库到从库的数据同步其实是有时间成本的,但这个问题暂时不做进一步探讨

应用中需要对读写请求做分离处理,所以可以利用一些数据库中间件,将请求分离的职责托管出去。如:MyCat、 TDDL、 Amoeba、 Cobar 等类似数据库中间件等

主从分离架构的优缺点

优点:

  1. 数据库的读取性能提高
  2. 由于读取被其他服务器分担,写的性能也间接提高
  3. 由于出现了从库,数据库的可用性提高,不会因为某个从库出现问题导致整个站点数据丢失

缺点:

  1. 热点数据的频繁读取导致数据库的负载很高
  2. 当同步挂掉或者同步延迟较大时,主库和从库的数据可能不一致
  3. 服务器成本进一步增加

2.5 冷热分离架构

随着访问量继续增加,发现业务中一些数据的读取频率远大于其他数据的读取频率。将这部分数据称为热点数据,与之相对应的是冷数据

针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的 html 页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用 memcached 作为本地缓存,使用Redis 作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题

冷热分离架构的优缺点

优点:

  • 大幅降低了对数据库的访问请求,性能提升显著

缺点:

  1. 带来了缓存一致性,缓存击穿,缓存失效,缓存雪崩等问题
  2. 服务器成本进一步增加
  3. 业务体量持续变大,数据不断增加。数据库单库太大,单个表的体量也过大,数据查询慢,导致数据库再次成为瓶颈

2.6 垂直分库架构

随着业务的数据量增大,大量的数据存储在同一个库中已经显得有些力不从心了,所以可以按照业务,将数据分别存储

如针对评论数据,可按照 商品ID 进行 hash,路由到对应的表中存储;针对支付记录,可按照小时创建表,每个小时表继续拆分为小表,使用 用户ID 或记录编号来路由数据。只要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过水平扩展的方式来提高性能

Mycat 也支持在大表拆分为小表情况下的访问控制。这种做法显著的增加了数据库运维的难度,对 DBA 的要求较高。数据库设计到这种结构时,已经可以称为分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来实现的,如分库分表的管理和请求分发,由 Mycat 实现,SQL 的解析由单机的数据库实现,读写分离可能由网关和消息队列来实现,查询结果的汇总可能由数据库接口层来实现等等,这种架构其实是 MPP(大规模并行处理)架构的一类实现

分库分表:

 分布式数据库:

垂直分库架构的优缺点

优点:

  • 数据库吞吐量大幅度提升,不再是瓶颈

缺点:

  1. 跨库join、分布式事务等问题,这些需要对应的去进行解决,目前的mpp都有对应的解决方案
  2. 应用的代码整体耦合在一起,修改一行代码需要整体重新发布

2.7 微服务架构

随着人员增加,业务发展,我们将业务分给不同的开发团队去维护,每个团队独立实现自己的微服务,然后互相之间对数据的直接访问进行隔离,可以利用 Gateway、消息总线等技术,实现相互之间的调用关联。甚至可以把一些类似用户管理等业务提成公共服务

微服务架构的优缺点

优点:

  1. 灵活性高:应用服务独立测试、部署、升级、发布
  2. 独立扩展:每个应用服务可以各自进行扩展
  3. 提高容错性:一个服务问题并不会让整个系统瘫痪
  4. 新技术的应用容易:支持多种编程语言

缺点:

  1. 运维复杂度高:业务不断发展,应用服务不断变多,部署变得复杂,同一台服务器上部署多个服务还要解决运行环境冲突的问题。如大促这类需要动态扩缩容的场景,需水平扩展服务的性能,就需要在新增的服务上准备运行环境,部署服务等,运维将变得十分困难
  2. 资源使用变多:所有这些独立运行的微服务都需要需要占用内存和 CPU 
  3. 处理故障困难:一个请求跨多个服务调用,需要查看不同服务的日志完成问题定位

2.8 容器编排架构

随着业务增长,然后发现系统的资源利用率不高,很多资源用来应对短时高并发,平时又闲置,需要动态扩缩容,还没有办法直接下线服务器,而且开发、测试、生产每套环境都要隔离的环境,运维的工作量变的非常大。容器化技术的出现给这些问题的解决带来了新的思路

前最流行的容器化技术是 Docker,最流行的容器管理服务是 Kubernetes(K8S),应用服务可以打包为 Docker 镜像,通过 K8S 来动态分发和部署镜像。 Docker 镜像可理解为一个能运行你的应用服务的最小的操作系统,里面放着运行代码,运行环境根据实际的需要设置好。把整个"操作系统"打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动 Docker 镜像就可以把服务起起来,使服务的部署和运维变得简单

服务通常会有生产和研发 k8s 集群,一般不会公用,而研发集群通过命名空间来完成应用隔离,有的公司按照研发目的划分为研发和测试集群,有的公司通过组织架构完成部门间的资源复用

容器编排架构的优缺点

优点:

  1. 部署、运维简单快速:一条命令就可以完成几百个服务的部署或者扩缩容
  2. 隔离性好:容器与容器之间文件系统、网络等互相隔离,不会产生环境冲突
  3. 轻松支持滚动更新:版本间切换都可以通过一个命令完成升级或者回滚

缺点:

  1. 技术栈变多,对研发团队要求高
  2. 机器还是需要公司自身来管理,在非大促的时候,还是需要闲置着大量的机器资源来应对大促,机器自身成本和运维成本都极高,资源利用率低,可以通过购买云厂商服务器解决

三、互联网应用的架构

  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG_Bond20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值