浅谈网站架构演变
浅谈网站架构
作为一个从事后台开发已经2年的程序员来讲,大部分时间都忙于业务逻辑分析,往往忽略了业务之上的架构层面的设计。
本文作为网站架构知识的补充,不仅开拓了眼界,也对以后的程序设计益处多多。下面我们就一起来看看网站架构的演变历史。
网站架构的演变大致分为如下几个阶段:
1
初始阶段的网站架构
网站在最初开始时没有太多人访问,用一台服务器就完全可以胜任,此时的网站架构如下图所示。
应用程序,文件存储,数据库所有的资源都在一台服务器上。也就是经典的LAMP架构模型(Linux操作系统+部署在Apache上+MySql存储+PHP开发)。
2
应用服务和数据服务分离
网站有了越来越多的用户,不断增长的访问量导致网站性能越来越差,数据库存储空间也越来越不足,此时由初始架构演变为应用程序与数据服务分离的架构,如下图所示。
各个服务器对硬件的资源要求各不相同:
-
应用服务器由于处理大量业务逻辑,因此需要更强大的CPU;
-
数据库服务器需要快速磁盘检索和数据缓存,因此需要更快的硬盘和更大的内存;
-
文件服务器需要存储大量的文件,因此需要更大的硬盘。
3
缓存改善网站性能
网站访问也遵循二八定律:80% 的业务访问集中在 20% 的数据上。
既然大部分的业务访问集中在一小部分数据上,那么把这一小部分数据缓存在内存中,自然可以提高网站性能,加入缓存后的网站架构如下图所示。
网站使用的缓存分为两种:
-
缓存在应用服务器上的本地缓存;
-
缓存在专门的分布式缓存服务器上的远程缓存。
那两者的区别有哪些呢?
本地缓存访问速度更快,但是受本地服务器内存限制,缓存数据有限。
远程分布式缓存一般使用集群的方式,部署大内存服务器作为专门的缓存服务器,可以理论上做到不受内存容量限制的缓存服务。
4
应用服务器集群
加入缓存后,数据访问压力缓解,但是单一服务器可以处理的请求有限,在访问高峰期,这会成为网站的瓶颈。
所以对于网站来说,既然可以通过增加一台服务器的方式改善负载压力,那就可以以同样的方式持续增加服务器不断改善系统性能,从而实现系统的可伸缩性。应用服务器集群则应运而生。此时网站架构如下图所示。
通过负载均衡将请求分发到应用服务器集群,如果用户访问量持续增长,那么就在集群中加入更多的服务器,使服务器的负载压力不再成为整个网站的瓶颈。
5
数据库的读写分离
随着网站用户不断增多,服务器搭建了集群便不再是网站的瓶颈,数据库反而会因为负载过高而成为瓶颈。
由于大部分主流数据库都有主从热备的功能,通过配置两台数据库的主从关系,可是实现数据库之间的数据复制,从而实现数据库的读写分离,减轻数据库压力。
此时网站架构如下图所示。
读写分离:
应用服务器在写数据时,访问数据库,主数据库通过主从复制机制将数据更新到从数据库,当应用服务器读数据的时候就可用通过从数据库读取数据。
6
CDN和反向代理
CDN和反向代理本质也是缓存。加入CDN和反向代理会有效加速网站访问速度。此时网站架构如下图所示。
CDN一般部署在网络提供商的机房,使得用户在请求网站服务时,可从最近的网络提供商机房获取数据。
反向代理则部署在网站的中心机房,当用户请求到达中心机房后,先访问反向代理服务器,获取反向代理服务器中的缓存的资源,直接返回给用户。
7
分布式文件系统和分布式数据库
单一服务器都满足不了大型网站持续增长的需求,这时数据库要使用分布式数据库,文件系统使用分布式文件系统。此时网站架构如下图所示。
分布式数据库是网站数据库拆分的最后手段,只有在单表数据特别大时才使用。一般更常用的是业务分库,将不同业务的数据库部署在不同机器上。
8
使用NoSQL数据库和搜索引擎
随着网站运营越来越久,业务增长越来越大,数据的产生也就越来越大。此时对数据的检索和存储也就越来越复杂,那就需要采用非关系数据库技术-NoSQL数据库和数据库查询技术-搜索引擎。此时网站架构如下图所示。
9
业务拆分
大型网站业务日益复杂,会使用拆分的手段将整个网站分为不同的产品线。在技术角度上讲,就是讲网站拆分成许多不同的应用,每个应用都要独立部署。此时网站架构如下图所示。
应用之间可以通过超链接建立关系,如在首页导航栏添加各个应用的链接地址。也可以通过消息队列进行数据分发,进行业务调用。
10
分布式服务架构
随着业务拆分越来越细,存储系统则越来越大,可能会出现不同的应用系统需要执行许多相同的业务操作的情况。那将这些共用的业务提出出来,独立部署。通过分布式服务调用共用业务服务完成具体的业务操作。此时网站架构如下图所示。
大型网站架构演化到这一步,也就是时下流行的分布式架构。但架构发展并不会止步于此,目前许多大型网站都开始有自己的云计算平台,将计算作为一种资源出售。一些中小网站不需要再关心技术架构问题,未来的网站架构肯定还会继续发展下去,会继续适应未来持续增长的业务需求。
网站架构概述大致分为以上几个阶段,后续我们会针对网站架构优化方面再做分享,主要从网站的性能、可用性、伸缩性、扩展性、安全性这几个方面入手,继续讨论网站架构方面所遇到的问题,分享架构优化的知识。
参考资料:《大型网站技术架构》----李智慧
关注一下,我写的就更来劲儿啦