大型网站架构演化笔记
前言
在阅读《大型网站技术架构:核心原理与案例分析》里大型网站架构演化一文的时候,被其中的大型网站架构演化的剖析图深深所吸引,并根据书上的图,自己使用VISIO也尝试去绘制一遍,然后结合书上的描述以及自己的领悟写下这篇笔记。
《大型网站技术架构:核心原理与案例分析》通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型、架构设计、性能优化、Web 安全、系统发布、运维监控等在内的大型网站开发全景视图。
概要
以往,我们都尝试建立过规模较小、流量较少以及较低并发的小型网站,例如学生信息交流平台、二手商城等。但是当规模逐渐庞大的时候,小型网站的架构就会凸显出性能不足,延迟较高等现象,软件架构师需要为此扩展和优化项目结构,从而不断升级成为大型网站。不同阶段的架构都能够适应于不同阶段的规模发展,应对不同的需求,但最终的目标是能够高效、迅捷地处理庞大的用户群、高并发的访问以及海量的数据。
通常来说,建站初期流量会相对较少,一台服务器就足以应付所有请求。此时通常采用单块架构的形式,将应用层、数据层、服务层集合在同一台主机中。
单块架构 - 是在三层架构的基础之上,将整个项目放至一个服务器当中运行。通常以WAR包或者EAR包存在,当部署这类应用时,通常是将整个一个块作为一个整体,部署到同一个Web容器,如Tomcat或者Jetty中。当这类应用运行起来后,所有的功能也都运行在同一个进程中。
随着业务的不断发展,一台服务器逐渐不能满足需求:访客的增多导致访问的延迟不断增加、存储的数据增多导致服务器存储空间不够。此时,就需要将应用服务和数据服务分离。
分开的服务可以根据业务的需求购置不同性能的服务器。应用服务器需要更快的CPU来处理复杂的业务逻辑,文件服务器需要更大的磁盘空间来存储较大的文件,数据服务器需要更大的内存和更快的硬盘来进行数据缓存和数据索引。
随着用户逐渐增多,数据库的压力太大导致访问延迟,从而影响了网站的性能,用户体验也受到了影响。网站访问的特点遵循“二八定律”:80%的业务访问集中在20%的数据上。可以根据以上特点总结,若大部分的业务访问集中在小部分的数据上,架构师可以提前将这一小部分数据进行缓存在内存当中,继而可以大幅度减少数据库的压力,提高网站的访问速度。
网站使用的缓存通常分为两种:本地缓存(缓存在应用服务器上)和远程缓存(缓存在分布式缓存服务器上)。本地缓存的访问速度较快,但是受限于应用服务器的内存,存储的数量有限。分布式远程缓存可以使用集群的方式,部署大内存的服务器作为专门的缓存服务器,存储的数量可以尽可能地大。
在网站访问的高峰期处理高并发问题时,单一服务器明显显得性能不足。基于以上情况,可以使用集群的手段来增加若干个服务器,分担原有的服务器的压力,提高系统性能,从而实现系统的可伸缩性。并且结合负载均衡调节器,将不同的用户的请求尽可能均匀分发到集群中不同的服务器上,使得应用服务器的负载压力不再是整个网站的瓶颈。
集群 - 一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。
负载均衡 - 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
网站在使用缓存后,可以使绝大部分的数据操作访问都可以不通过数据库就能够完成。但是仍有一部分读操作(缓存访问不命中、缓存过期)和全部写的操作需要访问数据库,在网站的用户达到一定的规模后,数据库因为负载压力过高成为网站的瓶颈。
大部分主流数据库都提供主从(Master/Slave)热备功能,通过配置两台数据库的主从关系,可以将一台主数据库服务器的数据同步更新到另外一台从数据库服务器上。网站利用数据库这一功能,实现数据库的读写分离,从而改善数据库负载压力。
应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据同步更新到从数据库中,这样当应用服务器读数据库的时候,可以通过从服务器获取数据。此外,为了便于应用程序读写分离后的数据库,通常提供一个专门的数据访问模块,使得数据库读写分离对应用透明,便于操作。
热备份 - 系统处于正常运转状态下的备份。
冷备份 - 也被称为离线备份,是指在关闭数据库并且数据库不能更新的状况下进行的数据库完整备份。
随着网站业务不断发展,用户群规模不断扩大,由于用户群的地理位置不同,不同地区的用户访问同一网站时的速度也不尽相同,甚至差距很大。为了提高用户的访问速度,主要手段有两种:CDN(Content Delivery Network)和反向代理。
CDN和反向代理的基本原理都是缓存。区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房。访问的顺序依次为CDN、反向代理、应用服务器。
使用CDN和反向代理的目的都是尽早返回数据给用户,一方面加快用户访问速度,另一方面也减轻后端服务器的负载压力。
CDN - 即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
反向代理 - 以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。作用类似于网关入口。
任何强大的单一服务器都无法满足大型网站持续增长的业务需求以及庞大的用户群。虽然数据库经过读写分离后,从一台高度集中的服务器拆分为两台各司其职的服务器,但仍然无法满足需求。这时需要使用分布式数据库,同理作用于文件系统,需要使用分布式文件系统。
分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。在大多数时候中,网站采用更多的手段为业务分库,将不同的业务数据部署在不同的物理服务器上。
分布式数据库 - 利用高速计算机网络将物理上分散的多个数据存储单元连接起来组成一个逻辑上统一的数据库。分布式数据库的基本思想是将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上,以获取更大的存储容量和更高的并发访问量。
NoSQL和搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具有更好的支持,更有效利用空间来进行数据检索和存储。
应用服务器可以通过一个统一的数据访问模块访问各种数据,使得若干数据源对应用透明,减少应用程序管理诸多数据源的麻烦。
NoSQL - 业界指的是非关系型数据库。常用于超大规模数据的存储。需要存储的这些海量数据并不需要固定的模式,无需多余操作就可以横向扩展。
大型网站为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站业务分成不同的产品线,如大型购物交易网站将会将首页、商铺、订单、购物车等拆分成不同的产品线,分归不同的业务团队负责。
划分后的应用可以独立部署维护,应用之间可以通过网关路由建立关系,也可以通过消息队列进行数据分发。
微服务架构 - 一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
随着业务拆分越来越小,存储系统越来越庞大,应用系统的整体复杂度呈指数级增加,部署维护越来越困难。根据现有系统分析,很多应用系统中都需要执行相同的业务操作,比如用户管理、商品管理等,那么可以将这些共同的业务提取出来,单独部署维护。由这些可复用的业务连接数据库,提供业务共同服务,降低业务之间的耦合,提高业务的复用。
总结
通过以上的大型网站架构繁衍,可以了解到如何通过技术来更有效的去解决不同阶段会遇到的难题。但是对通读这本书,技术固然可以解决当前问题,但是不能因为技术而技术,有些时候,利用业务的能力会比技术更有用处,比如提高用户的体验,设置更多具有交互式的体验等。综合各方因素,才能将大型网站完善的运营下去。