所有的网站都是从一个小网站主键的扩展演化而壮大,凡是那种一口气就想做成一个庞大的网站的企业往往以失败告终。当年的淘宝也只不过是一个简单黄页加商品展示功能,并且代码还是从国外购买的。十年之后淘宝的发展惊天动地。

一般网站的演化往往会经历一个几个过程,当然并不是所有的网站都会经历,有些网站在上线之后可能没有流量而止步不前,并且也没有扩展的必要了,归根结底是用户需求推动网站变更和发展。

1、初级网站架构

这时候往往只有一台服务器,应用、数据库、文件存储都在一台服务器,技术往往使用成功低廉的LPAM,即:Linux、PHP、Apache、MySQL。网站的可用性和稳定性很难保证,这时候网站处于刚起步阶段,用户量比较小。

2、应用和数据库分离

随着用户量的提高,业务的发展,导致一台服务器的存储不够,用户的体验也越来越差,这时候就需要将应用和数据存储分离,应用服务器、数据库服务器、文件服务器。这样每个服务器可以各司其职,压力不再由一台服务器承担。但是随着用户量的继续增大数据库的压力会继续增大,从而影响用户的访问体验,这时候需要想办法减轻数据库的压力。

3、使用缓存改善网站性能

其实大部分的网站都是读多写少,正如淘宝也是如此,每天逛淘宝的人数要远远大于下单的人。网站的访问特点也和现实世界的财富分配一样遵循二八定律:80%的业务访问集中在20%的数据的。淘宝买家浏览商品往往更关注成交量高、好评数多的商品上。这时候我们就需要重点关注这20%的数据该怎么样存储才能让用户的体验更好。这时候我们就需要引入缓存机制,缓存分为本地缓存(session、request等)和远程的分布式缓存(redis、memcache等)。本地缓存速度最快,但是空间有限,我们不能指望他能存储业务数据,这时候我就需要依赖于远程的分布式缓存。

大型网站架构技术一览 大型网站架构演变_扩展


引用缓存之后,会大大提高数据的访问速度,数据库不再试访问速度的瓶颈,只有为什么会提高这里就不详细说明,后面会专门讲解

4、使用服务器集群改变网站的并发能力

当一台服务器的处理能力无法满足要求时,我们需要引入多台来进行横向扩展。纵向扩展只能解决当前一时的问题,不是长久之计。这样我们通过不断添加新的服务器可以应对网站用户访问源源不断增加的问题,从而实现系统的可伸缩性。

大型网站架构技术一览 大型网站架构演变_架构_02


5、数据库的读写分离

网站使用缓存之后大多数的请求可以不通过数据库就可以完成,但是那些缓存没有命中的读操作和所有写操作多会落在数据库上。目前大部分的主流数据库都支持主从热备功能,通过配置两台数据库的主从关系从而实现数据库的读写分离,从而减轻数据库的压力。

大型网站架构技术一览 大型网站架构演变_架构_03


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

由于中国地域板块的广大,网络环境参差不齐,不同地区用户访问网站的响应速度也各不相同,响应越慢越容易流失用户,为了给用户更好的体验需要提高的网站的响应速度,这时可以引入反向代理和CDN。

CDN和反向代理的原理都是缓存,CDN是部署在网络提供商的机房里,这样用户在访问网站时可以从距离自己最近的机房里获取资源;反向代理是部署在中心机房,当用户请求到达中心机房后,首先访问反向代理服务器,如果反向代理服务缓存着用户需要的资源则直接返回给用户

大型网站架构技术一览 大型网站架构演变_扩展_04


通过CDN和反向代理的引入,又进一步减轻了应用服务器的压力

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

任何单一的服务器都满足不了网站持续增长的业务,当数据库的主从无法满足要求时就需要引入分布式数据库。文件系统也是,需要引入分布式文件系统。

分布式数据库是网站数据拆分的最终手段,只有当单表十分庞大,查询效率非常低的情况我们才不得己采取分库分表。不到万不得己时,我们一般按照业务进行数据拆分,不同业务数据放到不同的服务器中。引入分布式数据库之后又涉及路由规则、数据查询等问题,这里就不一一阐述了,后续会做专门介绍。

8、使用Nosql和搜索引擎

当网站运用了以上7种扩展之后,网站已经有了一定的规模了,再随着网站业务越来越复杂,又需要引入一些NoSQL(Mongodb等)和搜索引擎(Lucene、solar等)技术。

9、业务拆分

随着业务的逐渐和庞大,这时候我们应该分而治之,将不同业务拆分成独立的服务,各个服务之间协同工作。例如电商我们可以拆分为订单服务、商品服务、物流服务等。每一个应用服务独立部署,各个服务之间可以通过RPC调用、消息等。

10、分布式服务

随着服务的不断拆分,有一部分服务可以作为基础服务,供其他服务公用。通过服务的复用减少了一部分服务器资源和部署成本。