云服务来临前,系统如何从单个服务器扩展到百万用户?

2022-04-08 13:31

初始网站运作情况不错,并且能在每天达到几百的网站访问量,因为人数并不算多,所以我能够迅速响应用户的访问。

不过在某的一天,这个网站吸引了许许多多的人,一下子就爆火了起来,时刻都有海量上万的用户进行访问,于是我的网站承载能力达到峰值,网站的响应也大不如从前,开始变得很慢很卡。网站的爆火本该是一个好消息,不过这对网站Web应用来说却不堪重负。现在的容量已经不够了,网站Web应用需要大幅扩展,它需要为访问的用户提供7天24小时不间断服务。


demo.jpg


那我们该怎样实行扩展呢?

单台服务器和数据库就是我们目前网站后端服务刚开始的模式。应用服务器主要负责运作设定逻辑,数据库的任务就是保存我们所运行的数据,这是最原始的配置情况。

虽然这样能满足我们目前的需求,但是如果信息量和处理量变大时,我就只能提升计算机的性能和数据库空间来应对增长的需求,但如果只是单一的增加性能,对单个机器要求就会非常高,所以这并不是一个好的解决方案,所以就要开始进行水平扩展。


demo.jpg


要想组成一个大规模服务架构的首先要加入反向代理。

代理其实是接收和转发请求的过程。正向代理面向的是我们的客户端,而反向代理面向的则是我们的服务端,它具备以下几种功能:

· 服务器运行检查,并要保证服务器能处于正常的运行状态

· 路由转发,将不同的请求发送到相应的服务路径中

· 认证,对访问用户的权限进行认证

· 防火墙,进行访问部门的隔离等


demo.jpg


负载均衡器主要采取高端技术――负载均衡技术,它可以利用该技术进行各种灵活的分配计算将全部的网络请求均衡地分布到其他服务器上,通过合理管理每天的网上数据流量来减轻单个服务器上的负担,这样就算是海量的需求也能很好的进行分配,保证服务器的正常运行。


demo.jpg


OK,现在我们解决了服务器访问的问题,那数据库的扩展我们能用相同的方式来运作吗?很明显不行,这就存在一个一致性的情况,我们扩展的所有服务器最终都要用到同一个数据库来存储和检索数据,所以在多个服务器处理同一个事情时,就会出现问题,很有可能该数据会被同时处理两次,多个服务器发回的数据可能会有冲突等等。所以我们需要用更科学的办法来处理不一致的问题。

首先要将数据库分为多个部分。一部分只负责接收并存储数据,另一个或几个部分负责检索数据。这样的好处就是保证了数据的一致性,原因是数据只能被单实例写入,之后把写入数据同步到其他部分即可,这时就能满足大部分网站Web应用的处理需求了。


demo.jpg


到目前为止,我们所有的功能都是在一台服务器上完成,但是这里面就会存在一个问题,当我们需要开发多个应用,或者是需要升级新版本时,所有的功能和应用必须同时完成才能进行整体更新,如果各个应用开发时间周期不同,那么就会存在冲突。

所以我们需要引入一个新的架构范式:微服务

微服务是面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通。每个服务都围绕着具体业务进行构建,并且能够独立地部署到生产环境、类生产环境等,这就能进一步缓解开发的问题。


demo.jpg


我们服务器的缓存是用于记住最后一次的数据结果,并将这个结果交给其他服务器或者是客户端,这样后端服务器就能省去许多工作量,由缓存直接发放即可。常见的网络应用如JavaScript脚本、图片、CSS样式文件等都会存入缓存。

还有一种加强版叫内容分发网络,也就是将许多数据以物理的形式储存在全球各地,这就能让访问用户从离他们最近地方来获取网页内容,不仅降低了总机的运行压力,同时保证相应速度。


demo.jpg


消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

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

·解耦了任务和处理过程。它将不同的任务先添加到待办事项中,然后按照相应规划和进度开始处理任务,这样就能保证系统正确响应并且任务也不会丢失。

·可以按需扩展。启动大量的服务比较耗时,所以把所有的任务都添加到队列中,等待服务器去处理,同时也可以推迟提供额外的处理能力。

做到这我们已经解决了绝大部分问题,如果还想要更大的处理能力该怎么办呢?


demo.jpg


分片(sharding)是数据库分区的一种,它将大型数据库分成更小、更快、更容易管理的部分,这些部分叫做数据碎片。

对于发送端发送的每份IP数据报来说,其标识字段都包含一个值。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据包的片都要把该比特置1。片偏移字段指的是该片偏移原始数据包开始处的位置。另外,当数据包被分片后,每个片的总长度值要改为该片的长度值。

当IP数据包被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。


demo.jpg


以上的这些步骤便是云服务来临前,系统从单个服务器扩展到百万用户的一个步骤,那么云服务如何处理的呢?云服务是上面许多问题最有效的解决方案,云服务器也可以称为虚拟服务器或虚拟专用服务器。它是一个通过互联网上的云计算平台构建,托管和交付的逻辑服务器。云服务器具有与典型服务器类似的功能和功能,但可以通过云服务器提供商远程访问。之后我会继续讲解云服务的解决方案,点赞关注自由职客吧~

Copyright2018贵州自由客网络技术有限公司版权所有 黔ICP备16000950号