图解:从单个服务器扩展到百万用户的系统

服务器扩容 服务器扩容策略可以分为两种:一种是增加服务器的数量;另一种是增加单台服务器的存储。 为了满足业务需求,需要通过增加服务器的数量,或存储数量,或带宽数量,或计算能力等,这种方式称为服务器扩容。在服务器架构允许的情况下,一般通过增加服务器的数量来解决。 若服务器架构固定,无法使用上面的方式,那只能通过增加已有服务器的CPU数量、内存数量、硬盘容量等进行扩容,但这种方式扩容限度有限。服务器在不停机维护的情况下扩充容量,增加存储空间,称为服务器扩容。 服务器的功能:可用性、稳定性,以及易使用性。... 阅读详情

640?wx_fmt=jpeg

作者 | Wolfram Hempel 

翻译 | Join

你开发了一个网站(例如网上商店、社交网站或者其他任何东西),之后你把它发布到了网上,网站运行良好,每天有几百的访问量,能快速地相响应用户的请求。

但是有一天,不知道什么原因,你的网站出名了! 

每分每秒都有成千上万的用户蜂拥而至,你的网站变得越来越慢……

对你来讲,这是个好消息,但是对你的Web应用来说这是个坏消息。因为现在它需要扩展了,你的应用需要为全球用户提供7*24不宕机服务。

如何进行扩展?

几年前,我讨论过水平扩展与垂直扩展。简而言之, 垂直扩展意味着在性能更强的计算机上运行同样的服务,而水平扩展是并行地运行多个服务。

如今,几乎没有人说垂直扩展了。原因很简单:

  • 随着计算机性能的增长,其价格会成倍增长

  • 单台计算机的性能是有上限的,不可能无限制地垂直扩展

  • 多核CPU意味着即使是单台计算机也可以并行的。那么,为什么不一开始就并行化呢?

现在我们水平扩展服务。需要哪些步骤呢?

1.单台服务器 + 数据库

 640?wx_fmt=png

上图可能是你后端服务最初的样子。有一个执行业务逻辑的应用服务器(Application Server)和保存数据的数据库。

看上去很不错。但是这样的配置,满足更高要求的唯一方法是在性能更强的计算机上运行,这点不是很好。

2. 增加一个反向代理

640?wx_fmt=png 

成为大规模服务架构的第一步是添加反向代理。类似于酒店大堂的接待处。

你也可以让客人直接去他们的客房。但是实际上,你需要一个中间人他去检查是否允许客人进入, 如果客房没有开放,得有人告诉客人,而不是让客人处于尴尬的境地。这些事情正是反向代理需要做的。

通常,代理是一个接收和转发请求的过程。正常情况下,「正向代理」代理的对象是客户端,「反向代理」代理的对象是服务端,它完成这些功能:

  • 健康检查功能,确保我们的服务器是一直处于运行状态的

  • 路由转发功能,把请求转发到正确的服务路径上

  • 认证功能,确保用户有权限访问后端服务器

  • 防火墙功能,确保用户只能访问允许使用的网络部分等等

3.引入负载均衡器

640?wx_fmt=png 

大多数反向代理还有另外一个功能:他们也可以充当负载均衡器。

负载均衡器是个简单概念,想象下有一百个用户在一分钟之内在你的网店里付款。遗憾的是,你的付款服务器在一分钟内只能处理50笔付款。这怎么办呢?同时运行两个付款服务器就行了。

负载均衡器的功能就是把付款请求分发到两台付款服务器上。用户1往左,用户2往右,用户3再往左。。。以此类推。

如果一次有500个用户需要立刻付款,这该怎么解决呢?确切地说,你可以扩展到十台付款服务器,之后让负载均衡器分发请求到这十台服务器上。

4.扩展数据库

640?wx_fmt=png

负载均衡器的使用使得我们可以在多个服务器之间分配负载。但是你发现问题了吗?尽管我们可以用成百上千台服务器处理请求,但是他们都是用同一个数据库存储和检索数据。

那么,我们不能以同样的方式来扩展数据库吗?很遗憾,这里有个一致性的问题。

系统使用的所有服务需要就他们使用的数据达成一致。数据不一致会导致各种问题,如订单被多次处理,从一个余额只有100元的账户中扣除两笔90元的付款等等......那么我们在扩展数据库的时候如何确保一致性呢?

我们需要做的第一件事是把数据库分成多个部分。一部分专门负责接收并存储数据,其他部分负责检索数据。这个方案有时称为主从模式或者单实例写多副本读。这里假设是从数据库读的频率高于写的频率。这个方案的好处是保证了一致性,因为数据只能被单实例写入,之后把写入数据同步到其他部分即可。缺点是我们仍然只有一个写数据库实例。

这对于中小型的Web应用来说没问题, 但是像Facebook这样的则不会这样做了。我们会在第九节中研究扩展数据库的步骤。

5.微服务

640?wx_fmt=png

到目前为止,我们的付款、订单、库存、用户管理等等这些功能都在一台服务器上。

这也不是坏事,单个服务器同时意味着更低的复杂性。随着规模的增加,事情会变得复杂和低效:

  • 开发团队随着应用的发展而增长。但是随着越来越多的开发人员工作在同一台服务器上,发生冲突的可能性很大。

  • 仅有一台服务器,意味着每当我们发布新版本时,必须要等所有工作完成后才能发布。当一个团队想快速地发布而另外一个团队只完成了一半工作的时候,这种互相依赖性很危险。

对于这些问题的解决方案是一个新的架构范式:微服务, 它已经在开发人员中掀起了风暴。

  • 每个服务都可以单独扩展,更好地适应需求

  • 开发团队之间相互独立,每个团队都负责自己的微服务生命周期(创建,部署,更新等)

  • 每个微服务都有自己的资源,比如数据库,进一步缓解了第4节中的问题。

6.缓存和内容分发网络(CDN)

640?wx_fmt=png

有什么方式能使服务更高效? 网络应用的很大一部由静态资源构成,如图片、CSS样式文件、JavaScript脚本以及一些针对特定产品提前渲染好的页面等等。

我们使用缓存而不是对每个请求都重新处理,缓存用于记住最后一次的结果并交由其他服务或者客户端,这样就不用每次都请求后端服务了。

缓存的加强版叫内容分发网络(Content Delivery Network),遍布全球的大量缓存。 这使得用户可以从物理上靠近他们的地方来获取网页内容,而不是每次都把数据从源头搬到用户那里。

7.消息队列

 640?wx_fmt=png

你去过游乐园吗?你是否走到售票柜台去买票?也许不是这样,可能是排队等候。政府机构、邮局、游乐园入口都属于并行概念的例子,多个售票亭同时售票,但似乎也永远不足以为每个人立即服务,于是队列形成了。

队列同样也是用于大型Web应用。每分钟都有成千上万的图片上传到Instagram、Facebook每个图片都需要处理,调整大小,分析与打标签,这些都是耗时的处理过程。

因此,不要让用户等到完成所有步骤,图片接收服务只需要做以下三件事:

  • 存储原始的、未处理的图片

  • 向用户确认图片已经上传

  • 创建一个待办的任务

这个待办事项列表中的任务可以被其他任意数量服务接收,每个服务完成其中一个任务,直到所有的待办事项完成。管理这些“待办事项列表”的称为消息队列。使用这样的队列有许多优点:

  • 解耦了任务和处理过程。有时需要处理大量的图片,有时很少。有时有大量服务可用,有时很少可用。简单地把任务添加到待办事项而不是直接处理它们,这确保了系统保持响应并且任务也不会丢失。

  • 可以按需扩展。启动大量的服务比较耗时,所以当有大量用户上传图片时再去启动服务,这已经太晚了。我们把任务添加到队列中,我们可以推迟提供额外的处理能力。

好了,如果按照我们上面的所有步骤操作下来,我们的系统已经做好提供大流量服务的准备了。但是如果还想提供更大量的,该怎么做呢?还有一些可以做:

8.分片,分片,还是分片

640?wx_fmt=png

什么是分片?好吧,深呼吸一下,准备好了吗?我们看下定义:

"Sharding is a technique of parallelizing an application's stacks by separating them into multiple units, each responsible for a certain key or namespace"

哎呦...... 分片究竟是是什么意思呢?

其实也很简单:Facebook上需要为20亿用户提供个人资料, 可以把你的应用架构分解为 26个mini-Facebook, 用户名如果以A开头,会被mini-facebook A处理, 用户名如果以B开头,会被mini-facebook B来处理……

分片不一定按字母顺序,根据业务需要,你可以基于任何数量的因素,比如位置、使用频率(特权用户被路由到好的硬件)等等。你可以根据需要以这种方式切分服务器、数据库或其他方面。

9. 对负载均衡器进行负载均衡

 640?wx_fmt=png

到目前为止,我们一直使用一个负载均衡器,即使你购买的一些功能强悍(且其价格极其昂贵)的硬件负载均衡器,但是他们可以处理的请求量也存在硬件限制。

幸运地是,我们可以有一个全球性、分散且稳定的层,用于在请求达到负载均衡器之前对请求负载均衡。最棒的地方是免费,这是域名系统或简称DNS。DNS将域名(如arcentry.com)映射到IP,143.204.47.77。DNS允许我们为域名指定多个IP,每个IP都会解析到不同的负载均衡器。

你看,扩展Web应用确实需要考虑很多东西,感谢你和我们一起待了这么久。我希望这篇文章能给你一些有用的东西。但是如果你做任何IT领域相关的工作,你在阅读本文的时候,可能有个问题一直萦绕在你的脑海:"云服务是怎样的呢?"

Cloud Computing / Serverless

但是云服务如何呢?确实,它是上面许多问题最有效的解决方案。

你无需解决这些难题。相反,这些难题留给了云厂商,他们为我们提供一个系统,可以根据需求进行扩展,而不用担心错综复杂的问题。

例如。Arcentry网站不会执行上述讨论的任何操作(除了数据库的读写分离),而只是把这些难题留给Amazon Web Service Lambda函数处理了,用户省去了烦恼。

但是,并不是说你使用了云服务以后(如 Amazon Web Service Lambda),所有的问题都解决了,它随之而来的是一系列挑战和权衡。请继续关注本系列的下一篇文章,

了解更多关于"the cloud for newbs and non-techies".

原文链接:

https://arcentry.com/blog/scaling-webapps-for-newbs-and-non-techies/

你可能会喜欢

我是一个线程

我是一个Java Class

CPU阿甘

面向对象圣经

TCP/IP之大明邮差

CPU阿甘

负载均衡的原理

一个故事讲完HTTPs

编程语言的巅峰

Java:一个帝国的诞生

JavaScript:一个屌丝的逆袭

C语言:春节回家,我发现只有我没有对象

640?wx_fmt=jpeg

全球顶级自建邮局服务器PMTA5.0安装图解(IPV6和IPV4组合) 全球顶级邮件服务器PMTA5.0安装图解: PowerMTA是世界顶级的邮件服务器,PowerMTA5.0是PowerMTA的最新版本,具有更优的性能,每天单台服务器可投递几十上百万级邮件,这里我用了IPV6和IPV4组合配置,下面介绍安装步骤 准备工具: 1、PMTA5.0安装包 2、WinScp、Xshell工具 3、购买好服务器IP对应数量域名并且做好解析 4、祖传vmta和smtp用户批量生成脚本 一、将PMTA5.0安装包、祖传批量生成脚本上传到服务器 二、安装PMTA5.0邮 阅读详情

相关推荐

百万级爬虫系统案例 - 从需求分析到架构实现(附代码实现)

本文将分享我在构建百万级爬虫系统过程中的代码实战经验和技术选型,希望能帮助你应对大规模数据采集的挑战。大规模爬虫系统绝不是简单堆砌服务器资源就能解决的问题,而是需要从架构设计层面进行彻底重构。

老何的专栏 2935

常用画图软件汇总

ProcessOn 特点: 在线。 免费(免费版文件数量限制9个)。 海量的模板库。 丰富的素材,除了常规的基础图形之外,还包括各大云平台供应商的图标,也支持从网络搜索或者导入图标。 支持多种图形的制作,流程图、架构图、思维导图、网络拓扑图、UI原型图等。 地址: https://www.processon.com Axure 特点: 需要下载客户端。 支持团队协助共同制作,支持版本管理。 丰富...

wym2011aaj的专栏 3257

百万级到千万级用户服务器网络架构图_主主负载

百万级到千万级用户服务器,该架构图可以无限扩展,满足对高并发和千万级架构需求

如何有效地扩展数据库服务器以满足日益增长的工作量

在当今以数据为驱动的世界中,企业面临着一个挑战,即在保证应用程序的最佳性能的同时,管理迅速增长的数据量。扩展数据库服务器在满足这些需求方面起着至关重要的作用。本篇博客将探讨各种策略,以有效地扩展数据库服务器,以处理不断增加的工作量,提升性能并确保数据可用性。什么是数据库服务器扩展?数据库服务器扩展是增加数据库服务器的容量和性能,以处理不断增长的数据量、用户请求和系统负载的过程。通过升级硬件组件...

小技术君 404

步进电机

步进电机

happygrilclh的博客 2140

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7161

服务器扩展模式

负载均衡、服务器集群

luohaitao的专栏 446

【机器人】转动的指数坐标表示心得理解

转动的指数坐标表示心得理解1.前言2.指数坐标表示旋转矩阵3.原理推导4.矩阵对数、矩阵指数 1.前言 最近因为项目需求,又学习了一点机器人学的东西,参考书籍为《现代机器人学》,该书采用指数坐标、旋量的方式来对机器人进行描述和运动学、动力学建模,让我对机器人有了更深的理解,也是弥补DH参数建模复杂的缺陷,虽然DH法只用4个参数,而旋量需要更多,但是它骚啊! 本文是我学习了转动的指数坐标表示的一个心得体会,如有问题请多多包涵。 2.指数坐标表示旋转矩阵 指数坐标可以用来表示求解旋转矩阵,其原理非常简单巧妙,需

要恰饭得嘛 2328

IIS添加服务器扩展

进入“控制面板”下的“管理工具”文件夹,双击打开“Internet信息服务”,然后右击服务器名称,在弹出的菜单中选择“新建”子菜单中的“Web站点”,打开Web站点创建向导窗口,单击欢迎窗口中的“下一步”并输入创建的Web网站名称,这个名称可以随便输入,只要便于识别区别即可;接下来依次设置好IP地址,最后是设置主目录,即制作好的网站将被放置在哪个目录中,其它设置一般只要保持默认值,一直单击“下一步”即可完成。二、配置服务器扩展程序   创建好了Web网站,现在我们就要对其进行服务器扩展程序的配置了。启动In

xxq1985的专栏 1458

车辆横向控制MPC实战:从‘老王模型’到CasADi求解的保姆级避坑指南

本文详细解析了车辆横向控制MPC的实战应用,从经典动力学模型选择到CasADi求解器的优化配置,提供了一套完整的避坑指南。重点介绍了车辆动力学模型的验证要点、CasADi环境的高效配置技巧以及MPC问题建模的核心要素,帮助开发者快速实现稳健的横向控制方案。

weixin_42524499的博客 346

AudioTrack音频播放流程深度解析

深入解析Android AudioTrack音频播放的完整链路:从Java API到Native层,从共享内存Ring Buffer机制到FAST Track低延迟优化,配合源码分析带你彻底搞懂Android音频播放的底层原理

Cheson的专栏 938

实现百万并发的服务器端框架图解

本文内容转自:Golang实现百万并发 但内容并不局限于Go语言,而是服务器框架都要解决的问题,原文用图示简单易懂,转来这里是为了以后复习。 以下是具体内容: 这篇文章源自Handling 1 Million Requests per Minute with Go。原文中的例子是一个HTTP服务器,将上传的Json文档写入亚马逊的简单存储服务(S3)。这是一个异步服务,不需要等到存储真正完成,收到请求后可以立刻返回。 在这里我们用一个例子来类比上面的工作,有一条传送带(网络),源源不断的运来小球(来自客户端

斧冰 1015

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2294

单机百万并发,golang 50行代码

单机百万并发,golang 50行代码怎么实现?

277

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

【史上最全面esp32教程】网络篇和tcp/ip的使用

ESP32史上最全面wifi和tcp/ip连接及示例程序

m0_62599305的博客 9520

图解 | 监控系统 Prometheus 的原理

通过图解的方式,分别介绍了 Prometheus 的优势和劣势、指标收集、采集方式、Exporter、PromQL、监控告警,希望能给大家云原生的监控之路上带来一些启发~

m0_73735578的博客 1170

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

百万并发负载设计:四层 LVS + 七层 Nginx 架构图解!

摘要:高并发负载架构通过LVS和Nginx的分层设计实现高效流量调度。LVS作为四层负载均衡器,基于IP+端口进行内核态转发,支撑百万级并发;Nginx作为七层负载均衡,处理HTTP协议层的智能路由、缓存等高级功能。该架构将LVS的高性能转发与Nginx的应用层控制相结合,既保证吞吐量又提升灵活性,适用于电商秒杀、直播等高并发场景,形成"用户-LVS-Nginx-应用集群"的分层处理体系。

lovehu6686的博客 378

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

网游服务器搭建方案图解(以魔兽世界为例)

国服的巫妖王终于开了,而服务器“卡”的问题再次由于人数暴增而显现出来。下面小编就给大家介绍一下网络游戏的服务器搭建方案,也许大家能稍微理解一下服务器的苦衷。这么多新号,看着像开追悼会似的!如火如荼的网络游戏产业正吸引着各方的眼光,这其中也包括正迫切寻找新的利润增长点的电信运营商。

首席技术执行官CTO(Chief Technology Officer)|技术总监--邓斌博客 2691

魔兽世界网站服务器搭建,网游服务器搭建方案图解(以魔兽世界为例)(示例代码)...

国服的巫妖王终于开了,而服务器“卡”的问题再次由于人数暴增而显现出来。下面小编就给大家介绍一下网络游戏的服务器搭建方案,也许大家能稍微理解一下服务器的苦衷。这么多新号,看着像开追悼会似的!如火如荼的网络游戏产业正吸引着各方的眼光,这其中也包括正迫切寻找新的利润增长点的电信运营商。作为联系网络游戏产品与网游用户最重要的渠道,电信运营商已不仅仅满足于提供网络平台所获得的收入,而是越来越多地直接参与到网...

weixin_34533343的博客 1751

Qwen3.5-9B政务场景应用:政策文件图解+办事指南生成系统部署实录

本文介绍了如何在星图GPU平台上自动化部署Qwen3.5-9B镜像,构建政务场景下的政策文件图解与办事指南生成系统。该系统可自动解析政策文件核心内容,生成直观图解和步骤化办事指南,显著提升政务服务的效率与市民满意度。

weixin_36431814的博客 19

图解Linux网络包接收过程

因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发,要理解性能开销,会进行性能优化。而很多时候,如果你对Linux底层的理解不深的话,遇到很多线上性能瓶颈你会觉得狗拿刺猬,无从下手。 我们今天用图解的方式,来深度理解一下在Linux下网络包的接收过程。还是按照惯例来借用一段最简单的代码开始思考。为了简单起见,我们用udp来举例,如下: int main(){ int serverSocketFd = socke

hellozhxy的博客 589

万字图解Linux网络包接收过程

关注公众号后台回复pay或mall获取实战项目资料+视频因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高...

公众号-老炮说Java 947
上一篇: 为什么中国没有诞生世界流行的编程语言?
下一篇: 我逛了一下JDK一条街,发现了不少好东西!
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值