为解决大型网站面临的高并发访问、海量数据处理、高可靠运行等一系列问题与挑战,大型互联网公司在实践中提出许多解决方案,以实现网站的高性能、高可用、易伸缩、可扩展、安全等各种技术架构目标。这些解决方案又被更多网站重复使用,从而形成大型网站架构模式。
分层
最典型的就是网络的7层通信协议,将系统从横向维度切分成几个部分,每个部分负责比较单一的职责,通过上下层的依赖和调用组成一个完整的系统。
网站架构的分层
一般来说大型网站被分为三层:应用层、数据层、服务层;大的分层结构中还可以继续细分,比如应用层可细分为视图层和业务逻辑层。
在开发过程中必须合理规划层次边界和接口,严格遵循分层架构的约束,禁止跨层次的调用及逆向调用。
分层架构是逻辑上上,在物理上也可根据分层模式进行模块分离部署,即三层结构分别部署在不同的服务器上,使网站有更多的计算资源以应对越来越多的用户访问。
分割
分割实质就是从纵向方面对软件进行切分。比如在应用层,将不同的业务进行切分,类似将购物、论坛、广告等切分成相对独立的应用模块,这些模块在逻辑上还是物理部署上都可以相对独立的。
分布式
分层和分割的目的是切分模块后便于分布式部署,即将不同的模块部署到不同的服务器上,分布式意味着可以使用更多的计算机完成同样的功能。
分布式的缺陷
-
服务调用必须通过网络,可能对性能造成一定影响。
-
服务器越多,宕机的几率越大,一个公用模块服务的不可用可能会导致大量服务不可用。
-
数据在分布式环境难以保持一致性,分布式事务也难以保证。
常用的分布式方案
-
分布式应用和服务
-
分布式静态资源
-
分布式数据和存储
-
分布式计算
这里提一下分布式计算,目前网站普遍使用Hadoop极其MapReduce分布式计算框架,特点是移动计算而不是移动数据,将计算程序分发到数据所在的位置以加速计算和分布式计算。
集群
对于用户集中访问的模块(如登录、网站首页),需要将独立部署的服务器集群化,即多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务。
集群能有效提高系统的有效性,当某台服务器发生故障时,负载均衡设备的失效转译机制会将用户请求转发到集群中其他的服务器上,时服务器故障不影响用户使用。一定程度上解决了分布式缺陷中第二点
缓存
常用的缓存措施有如下几种:
CDN:即内容分发网络,部署在距离终端用户最近的网络服务商,用户的请求总是先到达他的网络服务商,在这里缓存一下静态资源,就可以快速的直接返回给用户。
反向代理:当用户的请求到达网站数据中心时,最想访问的就是反向代理服务器,在这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能返回给用户。
本地缓存:在应用服务器本地缓存着热点数据,应用程序可以直接在本机内存中直接访问数据,无需访问数据库。
分布式缓存:大型网站的数据量非常庞大,单机存储能力有限,这时候就需要分布式缓存集群,应用程序通过网络通信访问缓存数据。
另外想使缓存发挥作用,需要满足两个前提:
-
数据访问热点不均衡,热点数据应该放至缓存中
-
数据在某个时间内有效,不会很快过期,否则缓存的数据会因已失效而产生脏读。
异步
对于计算机软件来说,事物之间直接关系越少,就越少被彼此影响越可以独立发展和开发,系统解耦手段除了分层、分割、分布外,还有一个总要手段就是异步。异步架构是典型的生产者消费者模式。
业务之间的消息传递不是同步调用,而是将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行进行协作。在单一服务器内部可通过多线程共享内存队列的方式实现异步,在分布式系统中,多个服务器集群通过分布式消息队列实现异步,分布式消息队列可以看做内存队列分布式部署。
异步消息队列有如下特性:
-
提高系统可用性:消费者服务器发生故障,数据会在消息队列总堆积,并且对生产者服务器没有影响,消费者服务器恢复正常后可以继续处理消息队列中的数据。
-
加快网站响应速度:生产者将消息放入消息队列,不需要等待执行完成就可以将结果返回给用户。
-
消除并发访问高峰:用户访问网站时随机的,存在访问高峰和低谷,使用异步方式将突然增加的访问请求放入消息队列,等待消费者服务器依次处理,就不会对整个网站负载造成太大压力。
冗余
网站需要7*24小时连续运行,但是服务器随时都有可能发生故障,为保证服务器在宕机的情况下网站依然可以继续服务,不丢失数据,就需要一定程度的服务器冗余运行,数据冗余备份,这样当某台服务器宕机时,可以将其上的服务和数据访问专一到其他机器上。数据库除了定期备份,存档保存,实现冷备份外,还需要对数据库进行主从分离,实现同步实现热备份。
自动化
一切都可以自动化是网站的理想状态,目前主要需要实现如下两个自动化
发布过程自动化
包括自动化代码管理、自动化测试、自动化安全监测、自动化部署。
自动化监控
包括自动化报警、自动化失效转移、自动化失效恢复、自动化降级、自动化分配资源等。
安全
这一部分可以看我在web安全中写的内容,主要是防止XSS、CSRF等攻击。
此文主要参考《大型网站技术架构》一书的内容