预备知识----技术架构演进之路

单机架构

  • 简介:应用服务和数据库服务共用一台服务器。

  • 出现原因:出现在互联网早期,访问量较小,单机足以满足需求。

  • 架构工作原理:通过应用(划分了多个模块)和数据库在单个服务器上写作完成业务运行。

  • 优点:部署简单,成本低。

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

  1. 通过 DNS 将域名转换为 IP。

  2. 通过 IP 找到对应的服务器。

  3. 通过绑定的端口号找到具体的应用服务。

  4. 通过查找数据库得到具体信息。

  5. 将数据库中数据返回给应用服务。

  6. 应用服务将信息返回给浏览器。

应用数据分离架构

  • 简介:应用服务和数据库服务使用不同的服务器。

  • 出现原因:单机存在严重的资源竞争,导致站点变慢。

  • 架构工作原理:应用(划分了多个模块)和数据库在各自的服务器上通过网络协作完成业务运行。

  • 优点:成本相对可控;性能比单机有提升;数据库单独隔离,不会因为应用把数据库搞坏,有一定的容灾能力。

  • 缺点:硬件成本变高;性能有瓶颈,无法应对海量并发。

  1. 浏览器通过 DNS 把域名转为应用服务器的 IP。

  2. 通过 IP 和 port 访问应用服务。

  3. 应用服务访问数据库服务器。

  4. 数据库服务器把数据返回给应用服务。

  5. 应用服务将信息返回给浏览器。

应用服务集群架构

  • 简介:引入了负载均衡,应用以集群的方式运作。

  • 出现原因:单个应用不足以支持海量的并发需求,高并发的时候站点响应变慢。

  • 架构工作原理:应用不再是一个,而是变成了多个。通过负载均衡来支持海量的并发。

  • 优点:应用服务高可用,应用满足高可用,不会一个服务出现问题,整个站点都挂掉的情况;应用服务具备一定高性能,如果不访问数据库,应用相关处理通过扩展可以支持海量请求快速响应;应用服务有一定扩展能力,支持横向扩展。

  • 缺点:数据库成为性能瓶颈,无法应对数据库的海量查询;数据库是单点,没有高可用;运维工作增多,扩展后部署运维工作增多,需要开发对应的工具应对快速部署;硬件成本较高。

  • 垂直扩展/纵向扩展 Scale Up:通过购买性能更优、价格更高的应用服务器来应对更多的流量。这种方案的优势在于完全不需要对系统软件做任何调整;但劣势也很明显,硬件性能和价格的增长关系是非线性的,意味着选择性能 2 倍的硬件可能需要花费超过 4 倍的价格,其次硬件性能提升是有明显上限的。

  • 水平扩展/横向扩展 Scale Out:通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。这种方案的优势在于成本相对较低,并且提升的上线空间也很大。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验。

经过团队的学习、调研和讨论,最终选择了水平扩展的方案,来解决问题,但这需要引入一个新的组件----负载均衡:为了解决用户流量向哪台应用服务器分发的问题,需要一个专门的系统组件做流量分发。实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中。同时流量调度算法也有很多种。

常见的流量调度算法:

  • Round-Robin 轮询算法:即非常公平地将请求依次分给不同的应用服务器。

  • Weight-Round-Robin 轮询算法:为不同的服务器(比如性能不同)富裕不同的权重(weight),能者多劳。

  • 一致哈希散列算法:通过计算用户的特征值(比如 IP 地址)得到哈希值,根据哈希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。

负载均衡软件:Nginx、HAProxy、LVS、F5 等。

读写分离/主从分离架构

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

  • 出现原因:数据库成为瓶颈,而互联网应用一般读多写少,数据库承载压力大,主要是由这些读的请求造成的,所以把读写操作分开。

  • 架构工作原理:数据库服务器不再是一个,而是变成了多个。数据库主机负责写操作,从机负责读操作,数据库主机通过复制将数据同步到从机。

  • 优点:数据库的读取性能提升;读取被其他服务器分担,写的性能间接提升;数据库有从库,数据库的可用性提高了。

  • 缺点:热点数据的频繁读取导致数据库负载很高;当同步挂掉,或者同步延迟比较大时,写库和读库的数据不一致;服务器成本需要进一步增加。

在应用服务集群架构中,把用户的请求通过负载均衡分发到不同的应用服务器之后,可以并行处理了,并且随着业务的增长,可以动态扩张服务器的数量来缓解压力。

但是无论扩张多少台服务器,这些请求最终都会从数据库读写数据,到一定程度之后,数据库的压力就成了系统承载能力的新瓶颈。

能否像扩展应用服务器一样扩展数据库服务器?否。

因为数据库服务有其特殊性:如果将数据分散到各台服务器之后,数据的一致性无法得到保障。

所谓数据的一致性:针对同一个系统,无论何时何地,都应该看到一个始终维持统一的数据。

解决办法:保留一个主要的数据库作为写入数据库,其他的数据库作为从属数据库。从库的所有数据全部来自主库的数据,经过同步后,从库可以维护着和主库一致的数据。

为了分担数据库的压力,可以将写数据请求全部交给主库处理,但读请求分散到各个从库中。当然这个过程也是有代价的,主库到从库的数据同步其实是有时间成本的。

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

冷热分离架构

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

  • 出现原因:海量的请求导致数据库负载过高,站点响应再度变慢。

  • 架构工作原理:对于热点数据全部放在缓存中,不常用的数据再去查询数据库。

  • 优点:大幅降低对数据库的访问请求,性能提升非常明显。

  • 缺点:带来了缓存一致性,缓存击穿、缓存失败、缓存雪崩等问题;服务器成本进一步增加;业务体量支持变大后,数据不断增加,数据库单库太大,单个表体量也太大,数据查询会很慢,导致数据库再度成为系统瓶颈。

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

针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存,缓存热门信息的 html 页面等。通过缓存能把绝大多数请求在读写数据库前拦截,大大降低数据库压力。

其中涉及的技术包括:使用 memcached 作为本地缓存,使用 Redis 作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。

垂直分库架构

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

  • 出现原因:单机的写库会逐渐达到性能瓶颈,需要拆分数据库;数据库的数据量太大,处理压力太大,需要进行分表;为降低运维难度,业界逐渐研发了分布式数据库,库表天然支持分布式。

  • 架构工作原理:数据库由多个主从库或者存储集群构成,支持分布式大规模并行处理。

  • 优点:数据库吞吐量大幅提升,不再是瓶颈。

  • 缺点:跨库 join、分布式事务等问题,这些需要对应的解决,目前的 mpp 都有对应的解决方案;数据库和缓存结合目前能够抗住海量的请求,但应用的代码整体耦合在一起,修改一行代码需要整体重新分布。

随着业务的数据量增大,大量的数据存储在同一个库中显得有些力不从心。所以可以按照业务,将数据分别存储。只要实时操作的表数据量足够小,请求能够足够均匀地分发到多态服务器上的小表,数据库就能通过水平扩展的方式来提高性能。

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

微服务架构

  • 简介:微服务是一种架构风格,按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代。

  • 出现原因:扩展性差,应用程序无法轻松扩展,因为每次需要更新应用程序时,都必须重新构建整个系统;持续开发困难,一个很小的代码改动,也需要重新部署整个应用,无法频繁并轻松地发布版本;不可靠,即使系统的一个功能不起作用,可能导致整个系统无法工作;不灵活,无法使用不同的技术构建单体应用程序;代码维护难,所有功能耦合在一起,新人不知道从何下手。

  • 架构工作原理:一个应用拆分成多个微服务,相互之间协作支持整个应用。

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

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

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

容器编排架构

  • 简介:借助容器技术(如 docker)将应用/服务打包成镜像,通过容器编排工具(如 k8s)来动态分发和部署镜像,服务以容器化方式运行。

  • 出现原因:微服务拆分细,服务多部署工作量大,而且配置复杂,容易出错;微服务数量多扩缩容麻烦,而且容易出错,每次缩容后再扩容有需要重新配置服务对应的环境参数信息;微服务之间运行环境可能冲突,需要更多的资源来进行部署或者通过修改配置来解决冲突。

  • 架构工作原理:一个应用拆分成多个微服务,每个微服务打包到容器中,相互协作来完成系统功能,通过容器编排工具完成部署运维。

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

  • 缺点:技术栈变多,对研发团队要求高;机器还是需要公司自身管理,在大多非高并发场景下,还是需要闲置大量的机器资源来应发突然的高并发,机器自身成本和运维成本都很高,资源利用率低,可以通过购买云厂商服务器解决。

随着业务增长,发现系统的资源利用率不高,很多资源用来应对短时高并发,平时又闲置,需要动态扩缩容,没有办法直接下线服务器,而且开发、测试、生产每套环境都要隔离的环境,运维工作量很大。

容器化技术的出现给这些问题带来了新的解决思路。目前最流行的容器化技术是 Docker,最流行的容器管理服务式 Kubermetes(K8S),应用/服务可以打包为 Docker 镜像,通过 K8S 来动态分发和部署镜像。Docker 镜像可理解为一个能运行应用/服务的最小的操作系统,里面放着应用/服务的运行代码,运行环境根据实际的需要设置好。把整个“操作系统”打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动 Docker 镜像就可以把服务起来,使服务的部署和运维变得简单。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/694070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进阶篇01——存储引擎

MySQL体系结构 存储引擎 引擎有多种类型,MySQL支持多种存储引擎,默认的存储引擎为innodb。不同的存储引擎有不同的特点,适用不同的场景。 innodb存储引擎 简介 innodb的逻辑存储结构 MYISAM存储引擎 memory存储引擎 三种引擎特点对比&…

《python程序语言设计》2018版第5章第48题以0,0为圆心 绘制10个左右的同心圆

在0,0点处绘制10个圆。 其实这个题先要记住python不会0,0为原点进行绘画。 它是按半径来画,所以我们要先把turtle这个小画笔送到它应该去的起点。(我经常有这样的错觉,每次都是这样想办法把自己拉回来) 我…

【目标跟踪网络训练 Market-1501 数据集】DeepSort 训练自己的跟踪网络模型

前言 Deepsort之所以可以大量避免IDSwitch,是因为Deepsort算法中特征提取网络可以将目标检测框中的特征提取出来并保存,在目标被遮挡后又从新出现后,利用前后的特征对比可以将遮挡的后又出现的目标和遮挡之前的追踪的目标重新找到&#xff0…

STM32 proteus + STM32Cubemx仿真教程(第二课按键教程)

文章目录 前言一、STM32按键的原理二、STM32Cubemx创建工程三、proteus仿真电路图四、程序代码编写4.1函数介绍4.2使用按键点亮LED灯 总结 前言 本篇文章开始带大家学习如何使用proteus和STM32Cubemx来完成STM32的学习,第二节课我们先来学习按键的用法。 proteus使…

景区ar互动大屏游戏化体验提升营销力度

从20世纪60年代的初步构想,到如今全球范围内无数企业的竞相投入,AR增强现实技术已成为引领科技潮流的重要力量。而在这一浪潮中,中国的AR公司正以其独特的魅力和创新力,崭露头角。 中国的AR市场正在迎来前所未有的发展机遇。如今&…

qmt量化交易策略小白学习笔记第16期【qmt编程之获取北向南向资金(沪港通,深港通和港股通)】

qmt编程之获取北向南向资金 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 北向南向资金(沪港通,深港通和港股通) #北向南向资金交易日历 获取交易日列表…

UltraEditUEStudio软件最新版下载及详细安装教程

UEStudio简介: UEStudio建立在上文本编辑器UltraEdit的功能基础上,并为团队和开发人员提供了其他功能,例如深度Git集成。您可以直接在UEStudio中克隆,签出,更新,提交,推入/拉入等操作&#xff…

SpringBoot整合钉钉实现消息推送

前言 钉钉作为一款企业级通讯工具,具有广泛的应用场景,包括但不限于团队协作、任务提醒、工作汇报等。 通过Spring Boot应用程序整合钉钉实现消息推送,我们可以实现以下功能: 实时向指定用户或群组发送消息通知。自定义消息内容…

知识图谱的应用---智慧交通

文章目录 智慧交通典型应用 智慧交通 现代城市发展过程中的一大问题是交通拥堵,为解决城市发展中的这一顽疾,有必要以现代化高科技技术为支撑,建造城市中的智慧交通系统,从源头入手缓解城市拥挤问题。当前,“智慧交通”…

如何获取当前dll或exe模块所在路径?

有时我们需要在当前运行的dll或exe模块中去动态加载当前模块同路径中的另一个库,或者启动当前模块同路径中的另一个exe程序,一般需要获取当前模块的路径,然后去构造同路径下目标模块的绝对路径,然后通过该绝对路径去加载或启动该目…

java自学阶段二:JavaWeb开发50(Spring和Springboot学习)

Spring、Springboot基础知识学习 目录 学习目标Spring基础概念IOC控制反转DI依赖注入事务管理AOP面向切面编程Spring案例说明(Postman使用、Restful开发规范、lombok、Restful、nginx了解) 一:学习目标: 1)了解Sprin…

海洋日特别活动—深海来客——可燃冰

深海中有一种神奇的物质,似冰又不是冰。 别看它其貌不扬,但本领不小,遇火即燃,能量巨大,可谓是能源家族的新宠。它就是被国务院正式批准列为我国第173个矿种的“可燃冰”! 可燃冰到底是个啥?它…

C++ | Leetcode C++题解之第133题克隆图

题目&#xff1a; 题解&#xff1a; class Solution { public:Node* cloneGraph(Node* node) {if (node nullptr) {return node;}unordered_map<Node*, Node*> visited;// 将题目给定的节点添加到队列queue<Node*> Q;Q.push(node);// 克隆第一个节点并存储到哈希…

Java Web学习笔记31——Maven介绍

Maven&#xff1a;Java项目的构建工具。 Maven&#xff1a; Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建Java项目的工具。 Apache软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受欢迎的开源软件基金会&#xff0c;也是一个专…

手把手带你做一个自己的网络调试助手(2) - TCP服务器完善

服务器指定客户端发送 自定义控件comboBox - 刷新客户端列表 目的&#xff1a; 自定义控件&#xff0c;当鼠标点击这个comboBox控件的时候去刷新客户端列表 mycombobox.h #ifndef MYCOMBOBOX_H #define MYCOMBOBOX_H#include <QComboBox> #include <QWidget>cl…

服务部署:.NET项目使用Docker构建镜像与部署

前提条件 安装Docker&#xff1a;确保你的Linux系统上已经安装了Docker。如果没有&#xff0c;请参考官方文档进行安装。 步骤一&#xff1a;准备项目文件 将你的.NET项目从Windows系统复制到Linux系统。你可以使用Git、SCP等工具来完成这个操作。如何是使用virtualbox虚拟电…

SpringCloud Gateway中Filters详细说明

前面 https://blog.csdn.net/J080624/article/details/139494909 我们研究了GateWay中各种路由断言的使用。SpringCloud GateWay 还提供了各种过滤器用来对请求和响应进行处理。 官网地址&#xff1a;SpringCloud Gateway Filter 【1】GatewayFilter Factories 路由过滤器允…

20240609如何查询淘宝的历史价格

20240609如何查询淘宝的历史价格 2024/6/9 18:39 百度&#xff1a;淘宝历史价格 淘宝历史价格查询网站 https://zhuanlan.zhihu.com/p/670972171 30秒学会淘宝商品历史价格查询&#xff01; https://item.taobao.com/item.htm?id693104421622&pidmm_29415502_2422500430_1…

排序-读取数据流并实时返回中位数

目录 一、问题描述 二、解题思路 1.顺序表排序法 2.使用大根堆、小根堆 三、代码实现 1.顺序表排序法实现 2.大根堆、小根堆法实现 四、刷题链接 一、问题描述 二、解题思路 1.顺序表排序法 &#xff08;1&#xff09;每次读取一个数就对列表排一次序&#xff0c;对排…

python-微分方程计算

首先导入数据 import numpy as np from scipy.integrate import odeint from scipy.optimize import minimize import matplotlib.pyplot as pltdata np.array([[30, 4],[47.2, 6.1],[70.2, 9.8],[77.4, 35.2],[36.3, 59.4],[20.6, 41.7],[18.1, 19],[21.4, 13],[22, 8.3],[2…