本文从以下 2 个方向,对互联网系统架构演化进行了一个综述:
1. 大型互联网架构目前面临的挑战及其解决思路
2. 大型互联网系统架构演化过程,包含了所有的现在主要的互联网架构的考量点、技术方案、要解决的问题等。
建议用 10min 阅读,可以了解互联网架构的全貌。
一、架构演进面临的挑战及解决思路
互联网主要面对的技术挑战,用一句话概括:就是用户不断上升产生的并发访问压力以及数据存储压力,所以系统需要更强的处理能力才能解决这些问题。
而系统处理能力提升,主要有两种途径:
1. 垂直伸缩:
提升单台服务器的处理能力,比如用更快频率的 cpu,用更多核的 cpu,用更大的内存,用更快的网卡,用更多的磁盘组成一台服务器,使单台服务器的处理能力得到提升,通过这种手段提升系统的处理能力。
缺点如下:
a. 当垂直伸缩达到一定程度以后,继续增加计算需要花费更多的钱。
b. 垂直伸缩是有物理极限的,即使是大型机,也有自己的物理极限,它不可能无限地伸缩下去的。
c. 操作系统的设计或者应用程序的设计制约着垂直伸缩,最多只能达到一个点无法继续提高。
在大型互联网出现之前,传统的软件,比如银行、电信这些企业的软件系统,主要是使用垂直伸缩这种手段实现系统能力提升的,在服务器上增强,提升服务器的硬件水平。当某种类型的服务器能力提升到了瓶颈以后,就会用更强大的服务器,比如说从服务器升级到小型机,从小型机提升到中型机,从中型机提升到大型机,服务器越来越强大,处理能力越来越强大,当然价格也越来越昂贵,运维越来越复杂。
2. 水平伸缩:
单机的处理能力并不提升,也不使用更昂贵的更快的更厉害的硬件,而是通过更多的服务器,将这些服务器构成一个分布式集群,通过这个集群,统一对外提供服务,以此来提高系统整体的处理能力。
水平伸缩优点:
a. 只要架构合理,能够添加服务器到集群中,你的系统就是永远可以正常运行。
b. 它没有极限,它的成本也不会说到了某个临界点就突然增加。而且逐渐的增加服务器,获得相同的计算处理能力,只会比以前的服务器更便宜,不会更贵,因为硬件的价格总是在不断地下降的。
c. 应用程序运行在一个服务器上,是为单一服务器而设计的,而增加服务器的话只是让程序部署在更多的服务器上,所以也不需要对应用程序进行太多的改变,应用程序不会受到硬件制约。
在互联网行业中多采用水平伸缩的手段。
二、大型互联网系统架构演化过程
要让更多的服务器构成一个整体,需要在架构上进行设计,让这些服务器成为整体系统中的一个部分,有效地组织起来,统一提升系统的处理能力。
以下将通过大型互联网系统架构的演进过程,来详细理解如何通过以上两种伸缩方式逐步提升系统处理能力的。
这个过程对外看起来是一个业务演进过程,也就是用户量不断增长的一个过程。
实际上大型互联网整个的技术驱动就是因为用户量不断地在增加,数据量不断增加,导致并发访问压力持续增大,产生了一系列技术挑战。为了应对这个挑战,要不断地增强系统的技术处理能力,优化系统的架构。
最早的时候是单机系统,这时候可以满足少量用户的使用;
随着数据量提升,需要进行应用服务器与数据库分离,这个时候可以满足万级用户的使用;
再然后需要通过分布式缓存和服务器集群提升系统性能,这时候可以满足 10 万级的用户,之后需要进行反向代理,CDN 加速还需要数据库读写分离,以满足百万用户级的访问;
随着数据量爆发式增长,使用分布式文件系统和分布式数据库系统,以满足千万级用户的访问;
最后使用搜索引擎、NoSQL、消息队列、分布式服务等更复杂的技术方案,以满足亿级用户的访问。
1. 单机系统
在最早的时候,系统因为用户量比较少,可能只是有限的几个用户,这个阶段系统主要是用来验证技术以及业务模式是否可行的,系统也不需要太复杂,有限的几个主要功能。
开发完应用程序以后,部署在应用服务器上,一个应用访问自己服务器上的数据库,访问自己服务器的文件系统,构成了一个单机系统,这个系统就可以满足少量用户使用了。
如果这个系统被证明是可行的,是有价值的,好用的,如 Google 最早就是部署在斯坦福的实验室里面,给实验室的同学和老师使用的。这些同学和老师使用后发现 Google 的搜索引擎比以前的搜索引擎(比如像 Yahoo 这样的搜索引擎)要好用的多,很快这个消息就扩散出去了。整个斯坦福大学的老师同学可能都过来访问这个服务器。这个时候服务器就不能够承受访问压力了,需要进行第一次升级,数据库与应用分离。
2、数据库与应用程序分离
前面单机的时候,数据库和应用程序是部署在一起的。
进行第一次分离的时候,应用程序、数据库、文件系统分别部署在不同的服务器上,从 1 台服务器变成了 3 台服务器,那么相应的处理能力就提升了 3 倍。
这种分离几乎是不需要花什么技术成本的,只需要把数据库文件系统进行远程部署,进行远程访问就可以了,这个时候的处理能力提升了 3 倍。
3、使用缓存改善性能
随着用户进一步的增加,更多的用户过来访,3 台服务器也不能够承受这样的压力了,那么就需要使用缓存改善性能。
缓存主要有分布式缓存和本地缓存两种。
分布式缓存可以构成一个集群,存储更多的缓存数据,通过使用缓存一则应用程序不需要去访问数据库,因为数据库的数据是存在磁盘上的,访问数据库需要花费更多的时间,而缓存中的数据只是存储在内存中的,访问时间更短。
另一方面,数据库中的数据是以原始数据的形式存在的,而缓存中的数据通常是以结果形式存在,如果说已经构建成某个对象,缓存的就是这个对象,不需要进行对象的计算,这样就减少了计算的时间,同时也减少了 CPU 的压力。
这样不管是对计算资源的节约,还是对访问时间的节约,都会得到比较大的提升。通过使用缓存可以极大的改善性能。
4、应用服务集群化
虽然通过数据库分离和使用缓存,加快了系统的响应时间,减少了系统的计算压力,但是随着用户的进一步增加,应用服务器可能会成为瓶颈,一台应用服务器连接大量的并发用户的访问可能会成为一个瓶颈点,这时候就需要对应用服务器进行升级。
解决办法就是通过负载均衡服务器,将应用服务器部署为一个集群,添加更多的应用服务去处理用户的访问。
5、数据库读写分离
虽然通过负载均衡可以不断的添加应用服务器,为更多的用户提供系统访问服务。但是这个时候数据库会再一次成为整个系统的瓶颈点。
因为大量的用户过来访问,他们的主要操作都需要落在数据库上。虽然缓存可以缓存一部分的数据库读操作,但是还是有一部分读操作在缓存中找不到,还需要访问数据库,而且所有的写操作几乎都要访问数据库,这时候数据库就会成为瓶颈。
单一的数据库不能够承受这么大的访问压力。
这时候的解决办法就是数据库的读写分离,将一个数据库通过数据复制的方式,分裂为两个数据库,主数据库主要负责数据的写操作,所有的写操作都复制到从数据库上,保证从数据库的数据和主数据库数据一致,而从数据库主要提供数据的读操作。
通过这样一种手段,将一台数据库服务器水平伸缩成两台数据库服务器,可以提供更强大的数据处理能力。
6、使用反向代理和 CDN 加速相应
在对数据库做读写分离以后,要想更进一步增加系统的处理能力,需要使用反向代理和 CDN 加速。
所谓的 CDN 是指距离用户最近的一个服务器,当访问一个互联网应用的时候,我们的访问请求并不是直接到达互联网站的数据中心的,而是通过运营服务商进行数据转发的。
那么在进行数据转发的时候,最好已经有我们想要访问的数据了,这样就不需要访问互联网数据中心了。这个服务就叫做 CDN 服务,CDN 服务就是部署在网络运营商机房里的离用户最近的一个服务器,用户请求先到这里查询有没有用户需要的数据,如果有,就从 CDN 直接返回,如果没有,再通过 CDN 进一步访问网站的数据中心,得到数据后再缓存到 CDN 供其他用户访问或下一次访问,所以 CDN 的本质还是一个缓存。
用户请求到达网站的数据中心后,也不是直接请求应用服务器,依然是查找一次缓存,这个缓存叫做反向代理服务器。
反向代理服务器是指通过反向代理的方式代理整个网站的请求服务,先在反向代理服务器中查找是否有用户请求的数据,如果有,就从反向代理服务器直接返回,如果没有,再去请求应用服务器。通过这样的 CDN 和反向代理两级缓存,可以返回绝大部分用户请求的网络数据,极大地减少应用服务器的负载压力,提升服务器数据中心的处理能力,响应更多的用户并发处理请求。
7、使用分布式文件系统和分布式数据库系统
更进一步思考,虽然 CDN 和反向代理已经缓存了大量的用户数据,返回了大量的用户请求,但是随着用户量的增加,还是有很多的用户请求会到达数据中心。
这个时候文件系统和数据库系统依然会成为瓶颈点。问题变成如何解决这个瓶颈点?
解决方案主要是分布式的文件系统和分布式的数据库系统。
所谓的分布式文件系统就是通过一组服务器集群统一对外提供文件服务。比如说像淘宝的商品图片服务以及 Facebook 这样的相册服务每天都有大量的用户上传大量的图片,那么如何管理这些海量的文件图片,就要使用一个分布式的文件服务器系统。
随着数据量逐渐增加,前面的主从数据库也不能够承受这么大的访问压力和存储容量要求,那么需要对数据库做进一步水平伸缩,这个时候就使用分布式的数据库,通过数据分片的方式,将一张表的数据分布在多个物理服务器上,以减少单一数据库的服务器访问压力。通过这样的手段可以进一步的提升系统的处理能力。
8、使用消息队列与分布式服务
最后,随着用户量进一步增加,要想实现更强大计算处理能力,可以使用的技术手段有分布式消息队列服务、搜索引擎和 nosql,以及通过分布式服务,将可复用的业务分离开来,部署在不同的服务器集群上。
用户量增加,除了意味着用户对系统的访问压力增加,还伴随着业务复杂度增加。使用分布式消息队列和分布式的服务,主要要解决的就是业务的增加时系统的复杂度问题。随着业务的增加,很多的业务都有一些重复的服务功能需要复用,这时候使用分布式的服务去解决服务的复用问题。
而不同的服务之间不同的应用之间,它们的耦合关系会使得系统更加复杂,这时候使用分布式消息队列服务,将不同的应用服务器进行解耦,使它们之间的关系变得低耦合,通过消息进行连接,而不是服务调用的方式或者应用调用的方式进行连接,使服务变得更加的简单,使系统的处理能力和扩容能力变得更加的强大。
本文总结
首先,大型互联网系统的挑战主要包括:高并发和大流量的请求、高可用的挑战、海量数据的挑战、网络情况复杂安全性差,以及需求快速变更发布频繁这样的挑战。
为了应对这样的挑战,需要提升系统的处理能力。
处理能力提升有两种手段,一种是垂直伸缩,一种是水平伸缩。
垂直伸缩有自身的局限性,所以在互联网企业中主要使用的手段是水平伸缩。水平伸缩的原理就是不断地增加服务器以提高系统的处理能力。而如何添加新服务器,使新的服务器和原有的服务器构成一个完整的整体对外提供服务,就是互联网架构的主要技术挑战和技术内容。
在应对挑战的过程中,互联网架构主要的应对方法,就是从单机系统到分布式系统,通过服务器拆分的方式,从单机系统一个服务器变成很多个服务器,是整个的发展思路以及发展过程。
其中最主要的发展阶段包括:
使用分布式的缓存,提高系统的访问特性,减少数据存储的压力;
使用负载均衡,提供更多的应用服务器提高系统计算处理能力;
使用分布式存储,提供更多的服务器,分摊数据的读写压力;
以及使用微服务与异步架构,使系统变得更加低耦合,使应用业务变得更加可复用,通过这种手段支撑更强大的业务处理能力,从而支撑起一个大型网站系统架构。
以上内容摘取自拉勾
《阿里前辈的架构经》(点绿字查看更多)
第 01 讲(从 0 到亿级用户的架构演进)
主讲人:李智慧,前阿里巴巴技术专家
加拉勾职场导师 Amy 微信:lagouandy,即可领取技术人福利包一份(内含稀缺开源代码),为你职场助攻