为新手和非技术人员提供扩展Web网站提供一个升级指南

本指南总结了扩展的基本原则,从一台服务器扩展到能够服务数百万用户的Web应用程序。它面向在技术领域工作的新手和非开发人员。因此,如果您刚刚部署了您的多云平台VPN设置,那么本文并不适合您。
话不多说,那就让我们开始吧!

场景再现

你刚刚完成了你的网站、在线商店、社交网络或其他任何你想做的事情,把它放到网上,一切都很顺利:每天有数百名访问者经过你的网站,请求得到快速响应,订单立即得到处理,一切都很顺利。
但随后可怕的事情发生了:你变得成功了!
越来越多的用户蜂拥而至,数以千计,数以万计,每小时、每分、每秒……对您的企业来说,好消息对您的基础设施来说是坏消息;因为现在,它需要扩展。这意味着它需要能够:

  • 同时为更多客户提供服务
  • 始终可用,且无停机时间
  • 为全球用户提供服务

扩展的工作原理

几年前,这篇文章一开始会讨论“垂直”与“水平”缩放(也称为向上扩展与向外扩展)。简而言之,垂直扩展意味着在更强大的计算机上运行相同的东西,而水平扩展意味着并行运行多个进程。

如今,几乎没有人再进行垂直/水平扩展。原因很简单:

  • 计算机越强大,其价格就会呈指数级增长
  • 一台计算机只能达到这样的速度,这对垂直扩展的范围设置了硬性限制
  • 多核CPU意味着即使是一台计算机也可以有效地并行-所以为什么不从一开始就并行呢?

好了,就是水平扩展了!但所需的步骤是什么呢?

1. 单台服务器+数据库

Initial Setup

这可能就是您的服务器最初的样子。运行业务逻辑的单个应用程序服务器和存储长期数据的数据库。事情很简单,但这种设置满足更高要求的唯一方法是在更强大的计算机上运行-这不是很好。

2. 添加反向代理

Reverse Proxy

为更大规模的体系结构做好准备的第一步是添加“反向代理”。可以把它想象成酒店的接待处。当然,你可以直接让客人去他们的房间。但实际上,你想要的是一个中介,检查客人是否被允许进入,她的所有文件是否整齐,并正在前往一个实际存在的房间的路上。如果一个房间关门了,你希望有人用友好的声音告诉客人,而不是让他们陷入困境。这正是反向代理所做的事情。一般来说,代理只是一个接收和转发请求的进程。通常,这些请求会从我们的服务器发送到互联网。然而,这一次,请求来自互联网,需要被路由到我们的服务器,所以我们称之为“反向代理”。

这样的代理可以完成多项任务:

  • 健康检查 运行情况检查可确保我们的服务器能够持续运行
  • 路由 路由将请求转发到正确的终端
  • 身份验证 身份验证确保用户确实被允许访问服务器
  • 防火墙 确保用户只能访问他们被允许使用的网络部分
  • …还有更多

3. 引入负载均衡

Load Balancer

大多数“反向代理”还有一个诀窍:它们还可以充当负载均衡器。负载均衡器是一个简单的概念:假设在给定的一分钟内,有100名用户准备在您的在线商店付款。不幸的是,您的支付服务器一次只能处理50笔付款。解决办法?您只需同时运行两个支付服务器即可。
负载均衡器现在的工作是在这两个服务器之间拆分传入的支付请求。用户1向左,用户2向右,用户3向左,以此类推。
如果有500名用户想要一次性付款,你会怎么做?确切地说,您可以扩展到10个支付服务器,并让负载均衡器在它们之间分配传入的请求。

4. 扩展您的数据库

Multiple Database Instances

使用负载均衡器允许我们在多个服务器之间分担负载。但你能发现问题所在吗?虽然我们可以利用数十、数百甚至数千台服务器来处理我们的请求,但它们都在同一个数据库中存储和检索数据。那么,我们就不能以同样的方式扩展数据库吗?不幸的是没有。这里的问题是一致性。我们系统的所有部分都需要就他们使用的数据一致。不一致的数据导致了各种各样的问题-订单被多次执行,从一个持有100元的账户中扣除两笔90元的款项,等等问题。那么,我们如何在确保一致性的同时扩大我们的数据库?

我们能做的第一件事就是把它分成多个部分。一部分专门负责接收和存储数据,所有其他部分负责检索存储的数据。此解决方案有时称为主从分离或读写分离。我们的假设是,服务器从数据库读取数据的频率远远高于向数据库写入数据的频率。此解决方案的好处是保证了一致性,因为数据只写入单个实例,并从那里单向流动,从写到读。缺点是我们仍然只有一个数据库实例可供写入。对于中小型网络项目来说,这是可以的,但如果你运行淘宝或微博,那就不行了。

5.微服务

Microservices

到目前为止,我们只与一台服务器打交道:处理支付、订单、库存、为网站提供服务、管理用户账户等。

这不一定是一件坏事,单台服务器意味着更低的复杂性,因此对我们的开发人员来说也不会那么头疼。但随着规模的扩大,事情开始变得复杂和低效:

  • 我们的服务器的不同部分得到了不同程度的利用,对于每个用户登录,可能有几百个页面浏览量要处理,有几百个资产要提供服务,但所有这些都是由同一服务器完成的;
  • 我们的开发团队随着我们的应用程序的发展而壮大,但随着更多的开发人员在同一服务器上工作,他们更有可能相互干扰;
  • 只有一台服务器意味着每当我们想要在线使用新版本时,所有事情都必须完成并清理。每当一个团队想要快速发布更新,而另一个团队只完成了一半的工作时,这就会导致危险的相互依赖。

这些问题的解决方案是一种席卷开发世界的体系结构范例:微服务。这个想法很简单,将您的服务器拆分成多个功能单元,并将它们部署为独立的、相互连接的微型服务器。

这有很多好处:

  • 每项服务都可以单独扩展,使我们能够更好地根据需求进行调整
  • 开发团队可以独立工作,每个团队负责自己的微服务生命周期(创建、部署、更新等)
  • 每个微服务可以使用其自己的资源,例如其自己的数据库,从而进一步减少了4中所述的问题。)

6. 缓存和内容分发网络

Adding a Content Delivery Network

还有什么比高效工作更好的呢?根本不用工作!我们的Web应用程序的很大一部分是由静态资源组成的(一些永远不会改变的内容,如图像、javascript和css文件、某些产品的预渲染登录页等)。与其在每次请求时重新计算或重新服务这些资源,我们可以使用“缓存”(一个小的存储),它只记住最后的结果并将其分发给每个感兴趣的人,而不会打扰底层服务器。

缓存的大兄弟被称为“内容分发网络”或简称CDN–一个分布在世界各地的巨大的缓存阵列。这使我们能够从离用户物理位置很近的供应商向用户提供内容,而不是每次都将数据传输到全球各地。

7. 消息队列

Message Queues

你去过游乐园吗?你是不是刚走到售票处买票?可能不会——很有可能你已经在排队等候了。政府机构、邮局和游乐园入口处都是一个很好的例子,这个概念被称为“随需添加的并行性”–是的,它们是并行的:多个售票亭同时售票——但似乎从来没有足够的数量来立即为每个人提供服务,结果,开始排起了长队。
同样的概念也适用于大型网络应用程序。每分钟都有数十万张图片上传到Instagram、Facebook和Co,每一张图片都需要进行处理、调整大小、分析和标记–这是一个耗时的过程。因此,与其让用户等待他们的上传完成所有这些步骤,还不如让他们等待。
接收图像的服务器只做三件事:

  • 存储未经处理的原始图像
  • 向用户确认上传
  • 在一大堆东西中添加了一个虚拟的笔记,说明需要做什么

从这里开始,这个笔记被其他任意数量的服务器接收,每个服务器完成它的一个任务,勾选它,然后把笔记放回堆栈——直到我们的待办事项列表完成。管理这堆笔记的系统称为“消息队列”。
使用这样的队列有许多优点:

  • 它解耦了任务和处理器。有时需要处理大量的图像,有时只需处理少量的图像。有时有很多处理器可用,有时只有几个。通过简单地将任务添加到待办事项中,而不是直接处理它们,我们可以确保系统保持响应,并且不会丢失任何任务。
  • it allows us to scale on demand. Starting up more processors takes time - so by the time a lot of users tries to upload images, it’s already too late. By adding our tasks to a queue we can defer the need to provision additional capacities to process them
  • 它使我们能够按需扩展。启动更多的处理器需要时间–所以当很多用户尝试上传图片时,已经太晚了。通过将我们的任务添加到队列中,我们可以推迟提供额外的能力来处理它们

如果我们遵循上面的所有步骤,我们的系统现在已经准备好服务于相当大的流量。但如果我们想做大–真的很大–我们能做什么呢?好吧,我们还有几个选择。


8. 分片,分片再分片

Sharding Architecture

什么是分片?它是这样的:

分片是一种将应用程序的功能并行化的技术,方法是将应用程序功能划分为多个单元,每个单元负责特定的键或命名空间

那么这到底是什么意思呢?实际上很简单:需要为20亿用户提供Facebook个人资料吗?将你的体系结构分解成26个迷你Facebook,每个都为用户提供不同的字母表。亚伦·亚伯拉罕?你会被斯塔克·A·扎卡里亚斯·扎克伯格传球吗?堆栈Z它是…。

分片不一定是基于字母,但可以基于任何数量的因素,例如位置、使用频率(高级用户被引导到好的硬件)等等。根据您的需要,您可以通过这种方式共享服务器、数据库或堆栈的几乎任何方面。

9. Load-balancing 负载均衡

DNS Loadbalancing

单个负载均衡器只能做到这一点–即使您开始购买一些功能非常强大(也非常昂贵)的硬件负载均衡器,它们可以处理的请求数量也是有硬性限制的。

幸运的是,有一个全球范围的、分散的和令人难以置信的稳定的层,可以在流量达到负载均衡器之前就用于负载平衡。最棒的是什么呢?这绝对是免费的。这一层是“域名系统”–或简称为“域名系统”。将“arcenty.com”等域名映射到“143.204.47.77”等IP的全球注册表。该注册表允许我们为每个域名指定多个IP,每个IP指向不同的负载均衡器。

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

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

相关文章

基于灰狼优化(GWO)、帝国竞争算法(ICA)和粒子群优化(PSO)对梯度下降法训练的神经网络的权值进行了改进(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

存储过程的学习

1,前言 这是实习期间学习的,我可能是在学校没好好听课,(或者就是学校比较垃,没教这部分,在公司经理让我下去自己学习,太难了,因为是公司代码很多部分都是很多表的操作&#…

SQL Server 查询数据并汇总相关技巧 23.08.08

GROUPING 是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。 仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择…

基于grpc从零开始搭建一个准生产分布式应用(1) - 开始准备

开始前必读:​​基于grpc从零开始搭建一个准生产分布式应用(0) - quickStart​​ 本来笔者并不想开设这个系列,因为工作量比较大,另外此专题的技术点也偏简单。最近复盘了下最近的工作,发现一个问题就是各个互联网大厂一般都会有…

AcWing算法提高课-4.2.3一个简单的整数问题2

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 给定一个长度为 N N N 的数列 A A A&#xff0c;以及 M M M 条指令&#xff0c;每条指令可能是以下两种之一&#xff1a; C l r…

嵌入式Linux下LVGL的移植与配置

一.sdk源码下载路径 1.官方源码下载路径如下: ​​​​​​ https://github.com/lvgl/lvgl git下载方式 git clone https://github.com/lvgl/lvgl.git 2.个人移植好的源码8.2版本下载路径: 链接&#xff1a;https://pan.baidu.com/s/1jyqIennsQpv-RB4RyKvZyg?pwdc68e 提取…

Spring-Cloud-Loadblancer详细分析_2

LoadBalancerClients 终于分析到了此注解的作用&#xff0c;它是实现不同服务之间的配置隔离的关键 Configuration(proxyBeanMethods false) Retention(RetentionPolicy.RUNTIME) Target({ ElementType.TYPE }) Documented Import(LoadBalancerClientConfigurationRegistrar…

电脑开不了机如何解锁BitLocker硬盘锁

事情从这里说起&#xff0c;不想看直接跳过 早上闲着无聊&#xff0c;闲着没事干&#xff0c;将win11的用户名称改成了含有中文字符的用户名&#xff0c;然后恐怖的事情发生了&#xff0c;蓝屏了… 然后就是蓝屏收集错误信息&#xff0c;重启&#xff0c;蓝屏收集错误信息&…

基于深度学习的3D城市模型增强【Mask R-CNN】

在这篇文章中&#xff0c;我们描述了一个为阿姆斯特丹 3D 城市模型自动添加门窗的系统&#xff08;可以在这里访问&#xff09;。 计算机视觉用于从城市全景图像中提取有关门窗位置的信息。 由于这种类型的街道级图像广泛可用&#xff0c;因此该方法可用于较大的地理区域。 推荐…

如何把图片转成gif?一分钟学会在线一键生成gif

平时我们在聊天的时候&#xff0c;经常会发送一下有趣的表情包&#xff0c;这些表情包是怎么做出来的呢&#xff1f;其实可以使用在线gif生成的方法&#xff0c;下面就来给大家演示一下图片制作gif&#xff08;https://www.gif.cn&#xff09;的具体步骤&#xff0c;一起来看看…

Flink学习记录

可以快速搭建一个Flink编写程序 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.17.1 \-DgroupIdcom.zxx.langhuan \-DartifactIdlanghuan-flink \-Dversion1.0.0-SNAPSHOT \-Dpackagecom.zx…

《全生命周期眼健康管理》助力健康科学用眼

8月8日下午&#xff0c;烟台正大光明眼科医院眼健康管理中心张提主任受邀来到烟台市残疾人事务综合服务中心&#xff0c;为残联康复训练教师及相关工作人员进行了《全生命周期眼健康管理》讲座。 烟台正大光明眼科医院眼健康管理中心张提主任 “全生命周期眼健康”这一理念其宗…

流水线时序调度之规避冲突

1 写在前面的&#xff1a; 其实略微一个大点的机器&#xff0c;一个测试流程需要若干个步骤&#xff0c;都可以用流水线的思维去看待它&#xff1b; 我之前也没往流水线的角度去考虑&#xff0c;那有些机器的时序调度是不好理解的&#xff0c;甚至计算个通量都很麻烦&#xff…

15-1_Qt 5.9 C++开发指南_Qt多媒体模块概述

多媒体功能指的主要是计算机的音频和视频的输入、输出、显示和播放等功能&#xff0c;Qt 的多媒体模块为音频和视频播放、录音、摄像头拍照和录像等提供支持&#xff0c;甚至还提供数字收音机的支持。本章将介绍 Qt 多媒体模块的功能和使用。 文章目录 1. Qt 多媒体模块概述2. …

pgAdmin开发工具之ERD

pgAdmin 是一个免费的 PostgreSQL 管理与开发平台&#xff0c;这篇文章介绍了它的安装与使用。 今天我们要介绍的是它的一个开发功能&#xff1a;实体关系图&#xff08;ERD&#xff09;工具。 ERD 工具可以使用图形化的方式表示数据库中的表、字段以及表之间的关系。 pgAdmin…

vue svg画渐变色线条

基于业务需求需要&#xff0c;需要使用svg画渐变色弧线并且采用虚线。并且封装成组件。 一、path路径 path路径是svg中最强大的图形&#xff0c;可以绘制各种svg所有能画的图形。 路径中的线是由d属性来绘制&#xff0c;属性参数由各种命令组成&#xff0c;以下是它的基本命…

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器

Jmeter设置中文的两种方式,建议使用第二种

方案一 进入jmeter图像化界面&#xff0c;选择Options下的Choose Language&#xff0c;再选择Chinese(Simplified)。这个就是选择语言为简体中文&#xff08;缺陷&#xff1a;这个只是在本次使用时为中文&#xff0c;下次打开默认还是英文的&#xff09; 方案二&#xff08;…

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测) 目录 时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)效果一览基本描述模型结构程序设计参考资料效果一览

Redis安装配置远程连接

1. yum 安装 redis&#xff1a; 直接使用命令&#xff0c;将 redis 安装到 linux 服务器中&#xff1a; yum -y install redis 2. 启动 redis&#xff1a; 在 xshell 里&#xff0c;可以使用下面命令&#xff0c;以后台方式启动 redis&#xff1a; [rootVM-8-17-centos /]…