1.大型网站的特点:
相比传统企业应用系统,大型互联网应用系统有以下特点:
- 高并发、大流量:需要面对高并发用户,大流量访问。
- 高可用:系统需要7*24小时不间断服务。
- 海量数据:需要储存、管理海量数据,需要使用大量服务器。
- 用户分布广泛,网络情况复杂。
- 安全环境恶劣:黑客攻击。
- 需求快速变更,发布频繁。
- 渐进式发展:大型互联网几乎都是从小网站发展起来的,不像传统行业一开始需求就相对固定。
那么大型网站是如何做到高可用、高性能、易扩展、可伸缩且安全的网站,又是怎样演变的了?
2.大型网站架构的演化发展历程
2.1 初始化阶段的网站架构
应用程序、数据库、和用户上传的文件等所有的资源都是在一台服务器上。
2.2 应用服务和数据服务分离
随着网站用户的增加,不断增加的访问数量,和大量的文件储存,一台服务器已经不能满足需求,这时就需要分离应用和数据。
分离后整个网站使用三台服务器:应用服务器、文件服务器、数据库服务器。
三台服务器对硬件的要求不同:
- 应用服务器需要处理大量业务逻辑,需要更好的cpu;
- 数据库服务器需要快速检索磁盘和数据缓存,因此需要更快的硬盘和更大的内存;
- 文件服务器需要储存大量用户上传的文件,因此需要更大的硬盘。
2.3 使用缓存改善网站性能
随着用户进一步增加,数据库压力太大导致访问延迟。而大部分数据的访问,总是集中在某些热点数据上,例如淘宝商品访问,总是集中在评价最高的商品上。
那么我们可以将这一部分热点数据,缓存到内存中,以减少数据库的访问压力。
网站可使用的缓存分为两种:
- 本地缓存:缓存在应用服务器上,访问速度快,但受应用服务器的内存限制。
- 远程缓存:缓存在专门的分布式缓存服务器上,理论上不受内存容量限制。
2.4 使用应用服务器集群改善网站的并发处理能力
使用缓存后,数据库的压力得到有效缓解,但单个应用服务器能处理的请求连接有限,在访问高峰期,应用服务器成为整个网站的瓶颈。
单一应用服务器性能是有上限的,这种情况下,更好的方式是多个服务器的集群来分担原有服务器的访问及储存压力,从而实现系统的可伸缩性。
应用服务器集群搭建后,通过负载均衡调度服务器,将请求分发到集中中任何一台机器上。
2.5 数据库读写分离
网站使用缓存后,绝大部分数据都可以从缓存中获取,但在部分情况下任然需要访问数据库:
- 缓存未命中(请求未能从缓存系统中找到匹配的缓存)
- 缓存过期
- 全部写操作
虽然只有部分情况才会访问数据库,但当用户基数不断增大,数据库也会不堪重负。
这种情况下,可以通过读写分离,来减轻数据库的压力。
目前大部分主流数据库都支持主从热备(双机热备),通过设定两台数据库的主从关系,可以将一台数据库服务器的数据同步更新到另一台服务器上,网站利用数据库的这个功能来实现读写分离。
在写数据时访问主数据库,同时主数据库同步数据到从数据库,在读取数据时,就可以访问从数据库,同时还需要一个数据访问模块,让读写分离对应用程序透明,减少代码依赖。
2.6 使用反向代理和CDN加速网站响应
随着网站规模的扩大,用户可能分布在全国各地,不同地方的网络环境不同,要保证响应速度,就需要加速网站的访问速度。
主要的加速手段:
- CDN
- 反向代理
这两种方式都基于缓存,不同点在于:
- CDN部署在网络提供商的机房,用户在请求数据时,可以从离自己最近的网络提供商出获取数据。
- 反向代理部署在网站中心机房,用户在请求数据时,首先访问的时反响代理服务器,如果缓存着用户请求的资源,就直接将缓存返回给用户。
2.7 使用分布式文件系统和分布式数据库系统
数据库经过读写分离,拆分为两台服务器,但是随着网站发展任然不能满足需求,文件服务器也是一样。
这时就需要分布式的数据库系统和文件系统。
分布式数据库是网站数据库拆分的最后手段,只有在单表数据非常庞大的时候才使用。不到不得已时,网站更常用的数据库拆分手段是业务分库,将不同的业务的数据库部署在不同的服务器上。
2.8 使用NoSQL和搜索引擎
随着网站业务越来越复杂,对数据库储存和检索的需求也越来越复杂,网站需要采取一些非关系型数据库技术如NoSQL和非数据库查询技术如搜索引擎。
NoSQL和搜索引擎,对可伸缩的分布式系统有很好的支持。面对如此多的数据源,应用服务器通过统一的数据访问模块来访问不同的数据源。
2.9 业务拆分
大型网站面对日益复杂的业务场景,根据产品线划分,可以将一个网站拆成多个应用,每个应用都独立部署维护。
每个应用之间的数据关联有如下几种方式:
- 通过访问同一个数据储存系统(最常用)。
- 通过超链接建立关系。
- 通过消息队列进行数据分发。
2.10 分布式服务
随着业务拆分越来越细,应用系统越来越复杂,并且由于所有应用要和所有数据库连接,在数万台服务器规模的网站中,会导致数据库连接资源不足,拒绝服务。
应用系统中有许多相同的业务操作,比如用户管理、商品管理等,那么可以将这些相同的业务提取出来独立部署,由这些可复用的业务连接数据库,通过分布式服务调用共用业务服务完成具体操作。
*本文是《大型网站技术架构 核心原理与案例分析》的章节总结