架构学习第四周作业
一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。
答:
大型互联网架构演化进程
主要通过水平伸缩方式逐步提升系统处理能力。
这个过程看起来像是一个业务演进过程,也是用户量不断增长的过程。实际上驱动大型互联网的技术发展的就是不断增加的用户量。数据量随着用户量的增加而增加,导致并发访问压力持续增大,产生了一系列技术挑战。为了应对这些挑战,要不断地增强系统的技术处理能力,优化系统的架构,如下图所示。
最早的时候是单机系统,这时候可以满足少量用户的使用;随着数据量提升,需要进行应用服务器与数据库分离,这时候可以满足万级用户的使用;再然后需要通过分布式缓存和服务器集群提升系统性能,可以满足十万级的用户;之后需要进行反向代理,CDN 加速,还需要数据库读写分离,以满足百万用户级的访问;随着数据量爆发式增长,使用分布式文件系统和分布式数据库系统,以满足千万级用户的访问;最后使用搜索引擎、NoSQL、消息队列、分布式服务等更复杂的技术方案,以满足亿级用户的访问。
单机系统
先来看单机系统,在最早的时候,系统因为用户量比较少,可能只是有限的几个用户,这个阶段系统主要是用来验证技术以及业务模式是否可行,系统也不需要太复杂,只需要具备有限的几个主要功能。应用程序开发完以后,部署在应用服务器上,一个应用访问自己服务器上的数据库,访问自己服务器的文件系统,如下图所示,这就构成了一个单机系统,这个系统就可以满足少量用户使用了。
如果这个系统被证明是可行的、有价值的、好用的,比如 Google 的搜索引擎系统,会逐渐吸引其他用户,造成用户访问增长。Google 最早就是部署在斯坦福的实验室里面,给实验室的同学和老师使用的。这些同学和老师使用后发现 Google 的搜索引擎比以前的搜索引擎(比如说像 Yahoo 这样的搜索引擎)要好用的多,这个消息很快就扩散出去了,整个斯坦福大学的老师同学可能都会过来访问这个服务器。这时候服务器就不能够承受访问压力了,需要进行第一次升级——数据库与应用分离。数据库与应用分离如下图所示,而前面单机的时候,数据库和应用程序是部署在一起的。
缓存
进行第一次分离的时候,应用程序、数据库、文件系统分别部署在不同的服务器上,从 1 台服务器变成了 3 台服务器,那么相应的处理能力就提升了 3 倍。这种分离几乎是不需要技术成本的,只需要把数据库文件系统进行远程部署和远程访问就可以了,这个时候的处理能力提升了 3 倍。
然而随着用户进一步的增加,更多的用户过来访,3 台服务器也不能够承受这样的压力了,那么就需要使用缓存改善性能,如下图所示。
通过这样一种手段,将一台数据库服务器水平伸缩成两台数据库服务器,可以提供更强大的数据处理能力。
反向代理和 CDN 加速
在对数据库做读写分离以后,要想更进一步增加系统的处理能力,需要使用反向代理和 CDN 加速,如下图所示。
所谓的 CDN 是指距离用户最近的一个服务器,当访问一个互联网应用的时候,我们的访问请求并不是直接到达互联网站的数据中心的,而是通过运营服务商进行数据转发的。那么在进行数据转发的时候,最好已经有我们想要访问的数据,这样就不需要访问互联网数据中心了。这个服务就叫作 CDN 服务。
CDN 服务就是部署在网络运营商机房里的离用户最近的一个服务器,用户请求先到这里查询有没有用户需要的数据,如果有,就从 CDN 直接返回,如果没有,再通过 CDN 进一步访问网站的数据中心,得到数据后再缓存到 CDN 供其他用户访问或下一次访问,所以 CDN 的本质还是一个缓存。
用户请求到达网站的数据中心后,也不是直接请求应用服务器,依然是查找一次缓存,这个缓存叫作反向代理服务器。
反向代理服务器是指通过反向代理的方式代理整个网站的请求服务,先在反向代理服务器中查找是否有用户请求的数据,如果有,就从反向代理服务器直接返回;如果没有,再去请求应用服务器。通过这样的 CDN 和反向代理两级缓存,可以返回绝大部分用户请求的网络数据,极大地减少应用服务器的负载压力,提升服务器数据中心的处理能力,响应更多的用户并发处理请求。
分布式文件系统和分布式数据库系统
更进一步思考,虽然 CDN 和反向代理已经缓存了大量的用户数据,返回了大量的用户请求,但是随着用户量的增加,还是有很多的用户请求会到达数据中心。这个时候文件系统和数据库系统依然会成为瓶颈点。
那么如何解决这个瓶颈点?解决方案主要是分布式的文件系统和分布式的数据库系统。如下图所示。
所谓的分布式文件系统就是通过一组服务器集群统一对外提供文件服务。像淘宝的商品图片服务以及 Facebook 这样的相册服务,每天都有大量的用户上传大量的图片,那么如何管理这些海量的文件图片?这就要使用一个分布式的文件服务器系统。
随着数据量逐渐增加,前面讲的主从数据库也不能够承受这么大的访问压力和存储容量要求,那么就需要对数据库做进一步水平伸缩,使用分布式的数据库。即通过数据分片的方式,将一张表的数据分布在多个物理服务器上,以减少单一数据库的服务器访问压力。通过这样的手段可以进一步提升系统的处理能力。
消息队列与分布式服务
最后,随着用户量进一步增加,要想实现更强大的计算处理能力,可以使用的技术手段有分布式消息队列服务、搜索引擎和 NoSQL,以及通过分布式服务,将可复用的业务分离开来,部署在不同的服务器集群上。
用户量增加,除了意味着用户对系统的访问压力增加,还伴随着业务复杂度增加。使用分布式消息队列和分布式的服务,主要解决的就是业务增加时系统的复杂度问题。如下图所示。
随着业务的增加,很多的业务都有一些重复的服务功能需要复用,这时候使用分布式的服务去解决服务的复用问题。而不同的服务、不同的应用之间,它们的耦合关系会使得系统更加复杂,这时候使用分布式消息队列服务,将不同的应用服务器进行解耦,通过消息进行连接,而不是服务调用的方式或者应用调用的方式进行连接,使它们之间的关系变得低耦合,使服务变得更加简单,使系统的处理能力和扩容能力变得更加的强大。
评论