服务端八大架构的演进

单机架构

单机架构是最简单的服务端架构,所有的应用程序代码、数据库以及静态资源都部署在同一台服务器上。

  • 出现原因:出现在互联网早期,访问量比较小,单机足以满足需求。
  • 优点:部署和维护简单,适合小型应用只需要一台服务器,硬件成本低。
  • 缺点:存在严重的性能瓶颈;数据库和应用互相竞争资源。

以电商平台为例,用户在浏览器中输入 www.shop.com,首先经过 DNS 服务将域名解析成 IP 地址,如 10.102.41.1,随后浏览器访问该 IP 对应的应用服务。

相关软件
  • Web 服务器软件:TomcatNettyNginxApache
  • 数据库软件:MySQLOraclePostgreSQLSQL Server

应用数据分离架构

将应用程序和数据库分别部署在不同的服务器上,应用程序通过网络访问数据库。
  • 出现原因:单机存在严重的资源竞争,导致站点变慢。
  • 优点:性能相比单机有提升数据库单独隔离,不会因为应用把数据库搞坏,有一定的容灾能力。
  • 缺点:硬件成本变高;性能有瓶颈,无法应对海量并发。

和之前架构的主要区别在于将数据库服务独立部署在同一个数据中心的其他服务器上,应用服务通过网络访问数据。

应用服务集群架构

采用多台应用服务器分担流量,通过负载均衡器(如Nginx)将请求分配到不同的应用服务器上。

实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中。同时流量调度算法也有很多种,这里简单介绍几种较为常见的:
  • Round-Robin 轮询算法。即非常公平地将请求依次分给不同的应用服务器。
  • Weight-Round-Robin 轮询算法。为不同的服务器(比如性能不同)赋予不同的权重(weight),能者多劳。
  • 一致哈希散列算法。通过计算用户的特征值(比如 IP 地址)得到哈希值,根据哈希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。也就是我们平时遇到的专项客户经理服务。
对于 应用服务集群架构
  • 出现原因:单个应用不足以支持海量的并发请求,高并发的时候站点响应变慢。
  • 优点:实现应用服务的高可用,不会一个服务出问题整个站点挂掉应用服务具备一定高性能,如果不访问数据库,应用相关处理通过扩展可以支持海量请求快速响应。
  • 缺点:数据库成为性能瓶颈,无法应对数据库的海量查询;数据库是单点,没有高可用;运维工作增多,扩展后部署运维工作增多,需要开发对应的工具应对快速部署;硬件成本较高。

相关软件
负载均衡软件: Nginx HAProxy LVS F5

读写分离 / 主从分离架构

应用服务集群架构中,我们把用户的请求通过负载均衡分发到不同的应用服务器之后,可以并行处理了,并且可以随着业务的增长,可以动态扩张服务器的数量来缓解压力。但是现在的架构里,无论扩展多少台服务器,这些请求最终都会从数据库读写数据,到一定程度之后,数据的压力称为系统承载能力的瓶颈点。我们可以像扩展应用服务器一样扩展数据库服务器么?
答案是否定的,因为数据库服务有其特殊性:如果将数据分散到各台服务器之后,数据的一致性将无法得到保障。所谓数据的一致性,此处是指:针对同一个系统,无论何时何地,我们都应该看到一个始终维持统一的数据。想象一下,银行管理的账户金额,如果收到一笔转账之后,一份数据库的数据修改了,但另外的数据库没有修改,则用户得到的存款金额将是错误的。
我们采用的解决办法是这样的,保留一个主要的数据库作为写入数据库,其他的数据库作为从属数据库。从库的所有数据全部来自主库的数据,经过同步后,从库可以维护着与主库一致的数据。然后为了分担数据库的压力,我们可以将写数据请求全部交给主库处理,但读请求分散到各个从库中。由于大部分的系统中,读写请求都是不成比例的,例如 100 次读 1 次写,所以只要将读请求由各个从库分担之后,数据库的压力就没有那么大了。当然这个过程不是无代价的,主库到从库的数据同步其实是由时间成本的,但这个问题我们暂时不做进一步探讨。

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

  • 出现原因:数据库成为瓶颈,而互联网应用一般读多写少,数据库承载压力大,主要是由这些读的请求造成的,那么我们可以把读操作和写操作分开。
  • 优点:数据库的读取性能提升数据库有从库,数据库的可用性提高了。
  • 缺点:热点数据的频繁读取导致数据库负载很高;当同步挂掉,或者同步延迟比较大时,写库和读库的数据不一致;服务器成本需要进一步增加。

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

引入缓存 —— 冷热分离架构

随着访问量继续增加,发现业务中一些数据的读取频率远大于其他数据的读取频率。我们把这部分数据称为热点数据,与之相对应的是冷数据。针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的 html 页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用 memcached 作为本地缓存,使用 Redis 作为分布式缓存,还会涉及缓存一致性、缓存穿透 / 击穿、缓存雪崩、热点数据集中失效等问题。

引入缓存,实行冷热分离,将热点数据放到缓存中快速响应。

  • 出现原因:海量的请求导致数据库负载过高,站点响应再度变慢。
  • 优点:大幅降低对数据库的访问请求,性能提升非常明显。
  • 缺点:带来了缓存一致性,缓存击穿,缓存失效,缓存雪崩等问题;业务体量支持变大后,数据不断增加,数据库单库太大,单个表体量也太大,数据查询会很慢,导致数据库再度成为系统瓶颈;服务器成本需要进一步增加。

相关软件:
Memcached Redis 等缓存软件

垂直分库架构

随着业务的数据量增大,大量的数据存储在同一个库中已经显得有些力不从心了,所以可以按照业务,将数据分别存储。比如针对评论数据,可按照商品 ID 进行 hash ,路由到对应的表中存储;针对支付记录,可按照小时创建表,每个小时表继续拆分为小表,使用用户 ID 或记录编号来路由数据。只要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过水平扩展的方式来提高性能。其中前面提到的 Mycat 也支持在大表拆分为小表情况下的访问控制。
这种做法显著的增加了数据库运维的难度,对 DBA 的要求较高。数据库设计到这种结构时,已经可以称为分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来实现的,如分库分表的管理和请求分发,由 Mycat 实现,SQL 的解析由单机的数据库实现,读写分离可能由网关和消息队列来实现,查询结果的汇总可能由数据库接口层来实现等等,这种架构其实是 MPP (大规模并行处理)架构的一类实现。

数据库的数据被拆分,数据库数据分布式存储,分布式处理,分布式查询,也可以理解为分布式数据库架构。

  • 出现原因:单机的写库会逐渐会达到性能瓶颈,需要拆分数据库,数据表的数据量太大,处理压力太大,需要进行分表,为降低运维难度,业界逐渐研发了分布式数据库,库表天然支持分布式。
  • 优点:数据库吞吐量大幅提升,不再是瓶颈。
  • 缺点:跨库join、分布式事务等问题,这些需要对应的去进行解决,目前的mpp都有对应的解决方案;数据库和缓存结合目前能够抗住海量的请求,但是应用的代码整体耦合在一起,修改一行代码需要整体重新发布。

相关软件
Greenplum TiDB Postgresql XC HAWQ 等,商用的如南大通用的 GBase 、睿帆科技的雪球 DB 、华为的 LibrA

业务拆分 —— 微服务架构

随着人员增加,业务发展,我们将业务分给不同的开发团队去维护,每个团队独立实现自己的微服务,然后互相之间对数据的直接访问进行隔离,可以利用 Gateway 、消息总线等技术,实现相互之间的调用关联。甚至可以把一些类似用户管理等业务写成公共服务。
将应用拆分成多个独立的微服务,每个服务独立部署和运行。
  • 出现原因:扩展性差,应用程序无法轻松扩展,因为每次需要更新应用程序时,都必须重新构建整个系统;不可靠,即使系统的一个功能不起作用,可能导致整个系统无法工作;不灵活,无法使用不同的技术构建单体应用程序;代码维护难,所有功能耦合在一起,新人不知道何从下手。
  • 优点:灵活性高,服务独立测试、部署、升级、发布;独立扩展,每个服务可以各自进行扩展;提高容错性,一个服务问题并不会让整个系统瘫痪;新技术的应用容易,可以支持多种编程语言。
  • 缺点:运维复杂度高,业务不断发展,应用和服务都会不断变多,应用和服务的部署变得复杂,同一台服务器上部署多个服务还要解决运行环境冲突的问题,此外,对于如大促这类需要动态扩缩容的场景,需要水平扩展服务的性能,就需要在新增的服务上准备运行环境,部署服务等,运维将变得十分困难;资源使用变多,所有这些独立运行的微服务都需要需要占用内存和 CPU。
相关软件
Spring Cloud Dubbo

容器化引入——容器编排架构

随着业务增长,然后发现系统的资源利用率不高,很多资源用来应对短时高并发,平时又闲置,需要动态扩缩容,还没有办法直接下线服务器,而且开发、测试、生产每套环境都要隔离的环境,运维的工作量变的非常大。
容器化技术的出现给这些问题的解决带来了新的思路。目前最流行的容器化技术是 Docker ,最流行的容器管理服务是 Kubernetes(K8S) ,应用/ 服务可以打包为 Docker 镜像,通过 K8S 来动态分发和部署镜像。 Docker 镜像可理解为一个能运行你的应用/ 服务的最小的操作系统,里面放着应用 / 服务的运行代码,运行环境根据实际的需要设置好。把整个“ 操作系统 打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动 Docker 镜像就可以把服务起起来,使服务的部署和运维变得简单。服务通常会有生产和研发 k8s 集群,一般不会公用,而研发集群通过命名空间来完成应用隔离,有的公司按照研发目的划分为研发和测试集群,有的公司通过组织架构完成部门间的资源复用。
  • 出现原因:微服务拆分细,服务多部署工作量大,而且配置复杂,容易出错;微服务数量多扩缩容麻烦,而且容易出错,每次缩容后再扩容又需要重新配置服务对应的环境参数信息;微服务之间运行环境可能冲突,需要更多的资源来进行部署或者通过修改配置来解决冲突。
  • 优点:部署、运维简单快速,一条命令就可以完成几百个服务的部署或者扩缩容;隔离性好,容器与容器之间文件系统、网络等互相隔离,不会产生环境冲突;轻松支持滚动更新,版本间切换都可以通过一个命令完成升级或者回滚。
  • 缺点:技术栈变多,对研发团队要求高。

相关软件
Docker K8S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我要满血复活

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

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

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

打赏作者

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

抵扣说明:

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

余额充值