索引
1、大型网站架构演化
1.1 大型网站软件系统特点
- 高并发,大流量
- 高可用
- 海量数据
- 用户分布广泛,网络情况复杂
- 安全环境恶劣
- 需求快速变更,发布频繁
- 渐进式发展
1.2 大型网站架构演化
1.2.1 初始阶段
应用程序,数据库,文件等所有的资源都部署在一台服务器上。
1.2.2 应用服务和数据服务分离
随着越来越多的用户访问,导致性能越来越差,而且大量的数据导致存储空间不足,这时侯。一台服务器已经不能满足需求,需要将应用和数据分离,整个网站使用三台服务器:应用服务器、文件服务器和数据库服务器。
1.2.3 使用缓存
应用和数据分离后,不同特性的服务器承当不同的服务角色,网站的并发处理能力和数据存储空间得到极大的改善,但是用户数量再次增加致使数据库压力太大导致访问延迟,进而影响整个网站的性能。
网站访问遵循二八定律:80% 的业务访问集中在 20% 的数据上。比如淘宝买家浏览的商品集中在少部分成交数多,评价良好的商品上。因此我们我们可以把集中访问的这小部分数据缓存在内存中,减少数据的访问压力,提升网站的访问速度,改善数据的写入性能。
1.2.4 使用服务器集群
使用缓存后,数据访问压力得到有效的缓解,但是单一应用服务器能够处理的请求连接有限,在网站访问高峰期,应用服务器成为整个网站的瓶颈,这时候我们可以通过增加一台服务器的方式改善负载压力。通过负载均衡调度服务器,可以将来自用户浏览器的访问请求分发到应用服务器集群中的任何一台服务器上。
1.2.5 数据库读写分离
在网站使用缓存后,绝大部分数据读操作访问都可以不通过数据库就能完成,但是仍有一部分读操作和全部的写操作需要访问数据库,在网站用户达到一定的规模后,数据库会因为负载过高而成为瓶颈。
可以利用数据库的主从热备功能实现数据库读写分离。应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样应用服务器读取数据的时候,就可以通过从数据库获得数据。
1.2.6 反向代理和 CDN
用户规模越来越大,不同地区的用户访问网站时差别也是极大的。这时候就需要使用 CDN 和反向代理来加速网站访问速度同时也减轻后端服务器的负载压力。
CND 和反向代理的基本原理都是缓存,区别在于 CDN 部署在网络提供商的机房,使用户在请求网站服务的时候,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网络的中心机房,当用户请求到达中心机房后,首相访问的服务器是反向代理服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。
1.2.7 分布式系统和搜索引擎
网站持续的业务增长使得拆分服务器依然不能满足需求,这时候就需要使用分布式数据库和分布式文件系统,将不同的业务数据部署在不同的服务器上,同时使用 NoSQL 和搜索引擎来应对数据存储和检索的复杂需求。
1.2.8 业务拆分和分布式服务
面对越来越复杂的业务场景,通过使用分而治之的手段将整个网站业务分成不同的产品线,比如购物网站的首页、店铺和买家拆分,分归不同的业务团队负责,将每个应用独立部署通过消息队列进行数据分发。
同时可以将某些公用的业务提取出来,独立部署,通过分布式服务调用共用业务服务完成具体业务操作。
2、大型网站架构模式
2.1 分层
分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对比较单一的职责,然后通过层对下层的依赖和调用组成一个完整的系统
分层 | 功能 |
---|---|
应用层 | 负责具体业务和视图展示,如网站首页以搜索输入和结果展示 |
服务层 | 为应用层提供服务支持,如用户管理服务、购物车服务 |
数据层 | 提供数据存储访问服务,如数据库,缓存,文件,搜索引擎等 |
2.2 分割
分割就是在纵向方面对软件进行切分,将不同的功能和服务分割开,包装成高内聚低耦合的模块单元
2.3 分布式
分层和分割的一个主要目的就是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,同过远程协调工作。
分布式带来的问题
- 分布式意味着服务调用必须通过网络,这可能会对性能造成比较严重的影响
- 服务器越多,宕机概论越大,使网站可用性降低
- 数据在分布式的环境中保持数据一致性也是十分困难的,分布式事务也难以保证
分布式方案
- 分布式应用和服务
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
2.4 集群
分布式虽然已经将分层和分割后的模块独立部署,但是对于用户集中访问的模块还需要将独立部署的服务器集群化,即多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。
2.5 缓存
缓存就是将数据存放在距离计算最近的位置以加快处理速度。常用缓存设计:CDN,反向代理,本地缓存,分布式缓存
2.6 异步
系统解耦和的手段除了分层、分割和分布等,还有一个重要的手段就是异步,业务之间的传递不是同步调用,而是将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行性进行协作。
异步架构是典型的生产者-消费者模式,有如下特性:
提高系统可用性:消费者服务器发生故障,数据会在消息队列中存储堆积,生产者服务器继续处理业务,系统表现无故障;消费者服务器恢复正常后,继续处理消息队列中的数据。
加快网站响应速度:处在业务处理前端的生产者服务器在处理完业务请求后,将数据写入消息队列,不需要等待消费者服务器处理就可以返回,响应延迟减少
消除并发访问高峰:用户访问网站是随机的,存在高峰和低谷,使用消息队列将突然增加的访问请求数据放入消息队列中,等待消费者服务器依次处理,就不会堆整个网站造成太大压力。
2.7 冗余
保证服务器宕机的情况下依然可以继续服务,不丢失数据,就需要一定程度的服务器冗余运行,数据冗余备份,这样当某台服务器宕机时,可以将其上的服务和数据访问转移到其他机器上。
2.8 自动化
发布自动化,自动化代码管理,自动化测试,自动化监控,自动化报警,自动化失效转移,自动化失效恢复,自动化降级,自动化分配资源
2.9 安全
密码和手机校验码,网络加密,敏感信息过滤等
3、大型网站核心架构要素
性能、可用性、伸缩性、扩展性和安全性