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