大型网站架构演化

互联网 来源:Hh鸿 60℃ 0评论

有幸在图书馆借了本《大型网站技术架构:核心原理与案例分析》,拜读后获益匪浅,在此分享一下第一章 大型网站架构演化。

前言

  传统的企业应用系统主要面对的技术挑战是复杂凌乱、千变万化的所谓业务逻辑,而大型网站主要面对的技术挑战是庞大的用户,高并发的访问和海量的数据处理;前者的挑战来自功能性需求,后者的挑战来自非功能性需求。与传统软件产品或企业应用系统一开始就规划好全部的功能和非功能需求不同,几乎所有的大型互联网网站都是从一个小网站开始,渐进地发展起来的。好的互联网产品都是慢慢运营出来的,不是一开始就开发好的,这也正好与网站架构的发展演化过程对应。

初始阶段的网站架构

  小型网站访问人数少,因此只需要一台服务器绰绰有余,应用程序、文件、数据库等所有的资源文件都在一台服务器上。通常服务器操作系统使用Linux,应用程序使用PHP开发,然后部署在Apache上,数据库使用MySQL,汇集各种开源软件及一台廉价服务器就可以开始网站的发展之路。


初始阶段的网站架构

应用服务和数据服务分离

  随着网站业务的发展,一台服务器逐渐无法满足需求:越来越多的用户访问导致性能变差,越来越多的数据导致存储空间不足。这时就需要把应用与数据库分离,分离后整个网站有三台服务器:应用服务器、文件服务器、数据库服务器。它们对硬件资源的要求各不相同:

  • 应用服务器需要处理大量业务逻辑,因此需要更快更大的CPU
  • 文件服务器需要存储大量用户上传的文件,因此需要更大的硬盘
  • 数据库服务器需要快速磁盘检索和数据缓存。

    应用服务和数据服务分离

使用缓存改善网站性能

  随着用户逐渐增多,网站又一次面临挑战:数据库压力太大导致访问延迟,进而影响网站性能和用户体验,这时需要对网站进一步优化。首先网站的访问特点和世界财富的分配一样遵循二八定律:80%的业务访问集中在20%的数据上。既然大部分业务访问集中在一小部分数据上,那么把这部分数据缓存在内存中,就可以减少数据的压力。网站使用的缓存可以分为两种:

  • 本地缓存:缓存在应用服务器上,访问速度更快,但受应用服务器内存限制。
  • 远程服务器缓存:缓存在专门的分布式缓存服务器上,可以使用集群的方式,部署大内存的服务器作为专门的缓存服务器,理论上可以不受内存容量限制。

    使用缓存改善网站性能

使用应用服务器集群改善网站的并发处理能力

  使用缓存后数据访问压力得到缓解,但是单一的应用服务器能够处理的请求数有限,在访问高峰期,应用服务器将成为整个网站的瓶颈。这时可以使用集群。
  集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力不足时,与其换一台更强大的服务器,不如增加一台服务器去分担原有的服务器压力。对于大型网站而言,无论多么强大的服务器,都满足不了持续增长的业务需求,更高效的方式就是增加服务器来分担压力。对于网站架构而言,如果增添一台新的服务器可以改善负载压力,那么就可以使用同样的方式来应对源源不断的业务需求,从而实现系统的可伸缩性。
  通过负载均衡调度服务器,可将来自用户访问浏览器的请求分发到应用服务器集群中的任何一台服务器上。


应用服务器集群

数据库读写分离

  使用缓存后,大部分数据读操作不需要通过数据库就能完成,但仍有小部分读操作(缓存不命中、过期)和全部写操作仍需要数据库来处理,当用户达到一定规模后就会出现数据库负载压力过高的问题。
  目前大多数的数据库都支持主从热备份,通过配置两台服务器的主从关系,可以将一台数据库服务器的数据更新同步到另一台,实现数据库读写分离,从而进一步改善数据库负载压力。为了便于应用程序访问分离后的数据库,通常在应用服务器使用专门的数据访问模块,是数据库读写分离对应用透明。


数据库读写分离

使用反向代理和CDN加速网站响应

  由于中国复杂的网络环境,不同地区的用户访问网站时,速度差别也极大。为了提供更好的用户体验,加快网站访问速度,使用CDN和反向代理。一方面加快用户访问速度,另一方面也减轻后端服务器的负载压力。

  • CDN部署在网络提供商的机房,使用户在请求网站服务是,可以从距离最近最近的网络提供商机房获取数据。
  • 反向代理部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果有资源则直接返回给用户。

    使用反向代理和CDN加速网站响应

使用分布式文件系统和分布式数据库系统

  随着网站业务的发展,数据库、文件服务器就可以向应用服务器一样使用集群来提高性能,分别使用分布式数据库和分布式文件系统。
  分布式数据库是数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。不到万不得已,网站更常用的手段是业务分库,将不同业务的数据库部署在不同的物理服务器上。


使用分布式文件系统和分布式数据库系统

使用NoSQL和搜索引擎

  随着网站业务越来越复杂,对数据存储和检索的需求越来越复杂,网站需要采用一些非关系型数据库(NoSQL)和非数据库查询技术如搜索引擎。应用服务器通过一个统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。


使用NoSQL和搜索引擎

业务拆分

  对于大型网站,我们可以分而治之,把整个网站的业务分为不同的模块,比如大型的交易购物完整可以分为首页、店铺、订单、买家等,分别交给不同的业务团队来负责。具体到技术上,也会拆分成许多不同的应用,每个应用独立部署维护。应用之间通过超链接建立关系(例如在首页上的导航链接每个都指向不同的应用地址),也可以通过消息队列进行数据分发,最后通过相同的数据存储系统来构成一个互相关联的完整系统。


业务拆分

消息队列服务器:http://blog.csdn.net/reggergdsg/article/details/51711804

分布式服务

  随着业务拆分,整个系统越来越大,应用的整体复杂度呈指数级增加,部署维护越来越困难,并且所有的应用服务器都要与数据库服务连接, 在数万台服务器规模的情况下,这些连接的数目是服务器规模的平方,导致资源不足。这时候就要对相同的业务进行提取,独立部署,把这些可重用的业务和连接数据库等,提取出来作为公共业务服务,而应用系统只需要通过分布式服务访问公共业务服务完成业务操作。


分布式服务

后记

  大型网站的架构演化到这里,基本上大多数的技术问题都得以解决。既然大型网站架构解决了海量数据的管理和高并发事务的处理,那么就可以把这些解决方案应用到网站自身以外的业务上去。例如建设云计算平台,并将计算作为一种基础资源出售给中小网站付费使用。