新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 站长技术 > 服务器

如何从单个服务器扩展到百万用户的系统?

时间:2019-06-14 09:30:24  来源:  作者:

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

 

如何从单个服务器扩展到百万用户的系统?

 

 

但是有一天,不知道什么原因,你的网站出名了! 每分每秒都有成千上万的用户蜂拥而至,你的网站变得越来越慢……

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

如何进行扩展?

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

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

  • 随着计算机性能的增长,其价格会成倍增长。
  • 单台计算机的性能是有上限的,不可能无限制地垂直扩展。
  • 多核 CPU 意味着即使是单台计算机也可以并行的。那么,为什么不一开始就并行化呢?

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

单台服务器+数据库

 

如何从单个服务器扩展到百万用户的系统?

 

 

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

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

增加一个反向代理

 

如何从单个服务器扩展到百万用户的系统?

 

 

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

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

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

  • 健康检查功能,确保我们的服务器是一直处于运行状态的。
  • 路由转发功能,把请求转发到正确的服务路径上。
  • 认证功能,确保用户有权限访问后端服务器。
  • 防火墙功能,确保用户只能访问允许使用的网络部分等等。

引入负载均衡器

 

如何从单个服务器扩展到百万用户的系统?

 

 

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

负载均衡器是个简单概念,想象下有一百个用户在一分钟之内在你的网店里付款。

遗憾的是,你的付款服务器在一分钟内只能处理 50 笔付款。这怎么办呢?同时运行两个付款服务器就行了。

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

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

扩展数据库

 

如何从单个服务器扩展到百万用户的系统?

 

 

负载均衡器的使用使得我们可以在多个服务器之间分配负载。但是你发现问题了吗?

尽管我们可以用成百上千台服务器处理请求,但是他们都是用同一个数据库存储和检索数据。

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

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

我们需要做的第一件事是把数据库分成多个部分。一部分专门负责接收并存储数据,其他部分负责检索数据。

这个方案有时称为主从模式或者单实例写多副本读。这里假设是从数据库读的频率高于写的频率。

这个方案的好处是保证了一致性,因为数据只能被单实例写入,之后把写入数据同步到其他部分即可。缺点是我们仍然只有一个写数据库实例。

这对于中小型的 Web 应用来说没问题, 但是像 Facebook 这样的则不会这样做了。

微服务

 

如何从单个服务器扩展到百万用户的系统?

 

 

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

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

  • 开发团队随着应用的发展而增长。但是随着越来越多的开发人员工作在同一台服务器上,发生冲突的可能性很大。
  • 仅有一台服务器,意味着每当我们发布新版本时,必须要等所有工作完成后才能发布。

当一个团队想快速地发布而另外一个团队只完成了一半工作的时候,这种互相依赖性很危险。

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

  • 每个服务都可以单独扩展,更好地适应需求。
  • 开发团队之间相互独立,每个团队都负责自己的微服务生命周期(创建,部署,更新等)。
  • 每个微服务都有自己的资源,比如数据库,进一步缓解了第 4 节中的问题。

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

 

如何从单个服务器扩展到百万用户的系统?

 

 

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

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

缓存的加强版叫内容分发网络(Content Delivery Network),遍布全球的大量缓存。

这使得用户可以从物理上靠近他们的地方来获取网页内容,而不是每次都把数据从源头搬到用户那里。

消息队列

 

如何从单个服务器扩展到百万用户的系统?

 

 

你去过游乐园吗?你是否走到售票柜台去买票?也许不是这样,可能是排队等候。

政府机构、邮局、游乐园入口都属于并行概念的例子,多个售票亭同时售票,但似乎也永远不足以为每个人立即服务,于是队列形成了。

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

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

  • 存储原始的、未处理的图片。
  • 向用户确认图片已经上传。
  • 创建一个待办的任务。

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

使用这样的队列有许多优点:

  • 解耦了任务和处理过程。有时需要处理大量的图片,有时很少。有时有大量服务可用,有时很少可用。简单地把任务添加到待办事项而不是直接处理它们,这确保了系统保持响应并且任务也不会丢失。
  • 可以按需扩展。启动大量的服务比较耗时,所以当有大量用户上传图片时再去启动服务,这已经太晚了。我们把任务添加到队列中,我们可以推迟提供额外的处理能力。

好了,如果按照我们上面的所有步骤操作下来,我们的系统已经做好提供大流量服务的准备了。

但是如果还想提供更大量的,该怎么做呢?还有一些可以做。

分片,分片,还是分片

 

如何从单个服务器扩展到百万用户的系统?

 

 

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

"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 来处理……

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

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

 

如何从单个服务器扩展到百万用户的系统?

 

 

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

幸运地是,我们可以有一个全球性、分散且稳定的层,用于在请求达到负载均衡器之前对请求负载均衡。

最棒的地方是免费,这是域名系统或简称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)所有的问题都解决了,它随之而来的是一系列挑战和权衡。

作者:Wolfram Hempel ,Join 翻译

来源:码农翻身
 



Tags:服务器   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
第一步:创建脚本#!/bin/bash# func:自动监控tomcat脚本并且执行重启操作# 获取tomcat进程ID(其中[grep -w 'tomcat']代码中的tomcat需要替换为你的tomcat文件夹名)Tomc...【详细内容】
2019-11-27   服务器  点击:(0)  评论:(0)  加入收藏
最近在用freeswitch软交换进行语音通话,通话的时候需要调用音频文件进行播放,当并发量上来的时候,freeswitch监听服务的端口会不断的down掉,查看日志发现报了一个错如下: 这个问...【详细内容】
2019-11-25   服务器  点击:(1)  评论:(0)  加入收藏
有时候大家需要将一台服务器内的数据传输到另外一台设备,有很多种方法,如果两台物理机离得很近,可以通过移动硬盘传输。如果是跨地区的,有人首先通过filezilla将数据下载到windo...【详细内容】
2019-11-25   服务器  点击:(3)  评论:(0)  加入收藏
最近有业务上有抓包的需求,所以经理安排我看了一下whistle这个项目,这个项目在github上有6k的标星,链接就不贴了吧,可以自行取github上搜索`whistle`,第一个就是.拿到链接...【详细内容】
2019-11-22   服务器  点击:(12)  评论:(0)  加入收藏
基本环境准备jdk安装配置。安装目录例如:/usr/java/jdk1.8.0_05tomcat下载放到约定目录。例如:/usr/local/dmstomcat tomcat做成系统服务把tomcat做成系统服务,就可以使用servi...【详细内容】
2019-11-20   服务器  点击:(6)  评论:(0)  加入收藏
一、传统并发模型的缺点基于线程的并发 特点: 每任务一线程 直线式的编程 使用资源昂高, context切换代价高,竞争锁昂贵 太多线程可能导致吞吐量下降,响应时间暴涨。基于事件的...【详细内容】
2019-11-20   服务器  点击:(5)  评论:(0)  加入收藏
在日常工作中,有时候需要把公司内部的某些服务向外提供服务,例如FTP服务、WEB服务等等,像这种需求,应该怎样解决呢?下面通过一个简单的案例来讲解拓扑图 企业内网用户和FTP服务器...【详细内容】
2019-11-20   服务器  点击:(16)  评论:(0)  加入收藏
先说说上次被黑得经历,上次被黑的服务器是阿里云,服务器倒是没事,仅仅是被删库了,主要原因有两点:一是外网数据库端口没关,二是线上数据库密码过于简单,总结来说是弱密码口令攻击,数据库密码有多简单:123456,说到这里,一口老血喷...【详细内容】
2019-11-20   服务器  点击:(4)  评论:(0)  加入收藏
概述今天主要介绍一下linux系统的一些开源绘图应用程序。下面一起来看看吧~1、Pinta 主要亮点: Paint.NET / 微软“画图”的极好替代品 支持附加组件(有对 WebP 图像的支持) 支...【详细内容】
2019-11-15   服务器  点击:(7)  评论:(0)  加入收藏
上篇介绍了一个简单的UDP服务框架,但是面对海量的请求,同步框架显然有点力不从心。于是在我接手好友系统的接口服务的时候,就采用了一个强大的异步框架——MCP框架。...【详细内容】
2019-11-13   服务器  点击:(8)  评论:(0)  加入收藏
近年来,大量由僵尸网络驱动的DDoS攻击利用了成千上万的被感染的物联网,通过向受害者网站发起大量的流量为攻击手段,最终造成严重后果。常年以来的顽疾DDoS似乎难以根治,那服务器...【详细内容】
2019-11-13   服务器  点击:(6)  评论:(0)  加入收藏
在工作中会遇到mysql要跨服务器访问,下面就介绍mysql的FEDERATED引擎如何建立跨服务器访问进入mysql命令行,没有看到Federated,说明没有安装mysql>show engines; 安装Federated...【详细内容】
2019-11-12   服务器  点击:(8)  评论:(0)  加入收藏
经历了两天不懈努力,终于恢复了一次误操作删除的生产服务器数据。对本次事故过程和解决办法记录在此,警醒自己,也提示别人莫犯此错。也希望遇到问题的朋友能找到一丝灵感解决问题。...【详细内容】
2019-11-12   服务器  点击:(15)  评论:(0)  加入收藏
Rsyslog 是一个自由开源的日志记录程序,在 CentOS 8 和 RHEL 8 系统上默认可用。它提供了一种从客户端节点到单个中央服务器的“集中日志”的简单有效的方法。Rsyslog 是一...【详细内容】
2019-11-12   服务器  点击:(12)  评论:(0)  加入收藏
docker 相关命令 docker安装的教程大家从网上搜一下 下面介绍几个相关的docker服务相关命令启动dockersudo service docker start停止dockersudo service docker stop重启d...【详细内容】
2019-11-12   服务器  点击:(7)  评论:(0)  加入收藏
OpenStack是一个开源平台,可让你构建在商用硬件上运行的基础架构即服务(IaaS)云。OpenStack背后的技术由一系列项目组成,这些项目为云基础架构解决方案提供了各种组件。它可以处...【详细内容】
2019-11-11   服务器  点击:(13)  评论:(0)  加入收藏
以下为服务器常用端口列表:端口 服务 说明 21 FTPFTP 服务所开放的端口,用于上传、下载文件。 22 SSH SSH端口,用于通过命令行模式 远程连接 Linux 服务器或vps。23 Telnet Tel...【详细内容】
2019-11-11   服务器  点击:(19)  评论:(0)  加入收藏
我们给客户做网站,经常会涉及到 给客户购买服务器,因为客户也不是很清楚,一般都委托给我们来购买,这里简单介绍下 我们是如何购买的,这里以阿里云举例 阿里云有两大类操作系统,win...【详细内容】
2019-11-11   服务器  点击:(12)  评论:(0)  加入收藏
Web服务器信息收集域名收集 :ping www.baidu.com 得到IP :相关工具:Nslookup>www.baidu.com:子域名:子域名挖掘器,(使用工具时不要代理上网)还可以看到网站搭建的容器等,容器&mid...【详细内容】
2019-11-08   服务器  点击:(12)  评论:(0)  加入收藏
今天给大家讲解一下命令执行和代码执行漏洞的危害以及详解步骤。代码执行和命令执行是有区别的,一个叫命令,一个叫代码,代码执行的话,一般指的是执行代码命令执行的话,一般都是执...【详细内容】
2019-11-07   服务器  点击:(23)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条