一、大型网站架构演化
1、大型网站特点
- 高并发,大流量
- 高可用
- 海量数据
- 用户分布广泛,网络情况复杂
- 安全环境恶劣
- 需求快速变更,发布频繁
- 渐进式发展
2、大型网站架构发展历程
- 文件服务器,数据库服务器,应用服务器分离
- 应用服务器增加本地缓存,本地缓存优先,增加分布式缓存服务器
- 使用应用程序服务器集群提高网站的并发,由负载均衡服务器统一调度分发
- 使用分布式文件系统和分布式数据库系统
- 使用CDN网络加速和反向代理服务器:基本原理都是缓存,CDN部署在网络提供商的机房,是用户在请求网络服务时,可以从距离自己最近的网络提供商机房获取数据。而反向代理是部署在中心机房,当用户的请求到达中心机房后,首先访问的是反向代理服务器,如果反向代理服务器中缓存这用户请求的资源,就将其直接返回给用户,目的都是尽早返回数据给用户,加快用户访问速度,减轻后端服务器的压力。
- 使用Nosql和搜索服务器
- 业务拆分,根据不同的产品,不同的业务,将一个网站拆分成不同的应用,每个应用独立部署维护,各个应用之间通过消息中间件或者访问同一个数据存储系统来构成一个相互关联的完整系统
- 分布式服务,将公用的业务提取出来,独立部署,为其他应用服务器提供可复用的共用业务服务(可以通过dubbo和zookeeper集群实现)
3、网站架构的价值观和设计误区
- 架构的选取随网站所需灵活应对
- 主要驱动力量是网站的业务发展
- 不可一味追随大公司的架构设计,照搬照抄
- 网站技术是为了业务存在的,不可为了技术而技术
- 不要企图使用技术解决一切问题。技术是用来解决业务问题的,同样业务问题也可以采用业务手段,通过修改业务架构来解决
二、大型网站架构模式
1、分层
将系统在横向纬度上分成几个部分,每个部分负责单一职责,通过上层对下层的依赖和调用组成一个完整的系统。网络的7层通讯协议,计算机硬件、操作系统、应用软件,都采用了分层的思想。将网站系统分为应用层、服务层、数据层,三层结构分别部署在不同的服务器上
- 应用层:负责具体业务和视图展示
- 服务层:为应用层提供服务支持,如用户管理服务、购物车服务
- 数据层:提供数据存储访问服务,如数据库、缓存、文件、搜索引擎等
2、分割
在纵向方面对系统进行划分,比如应用层,可以将不同业务分割,将购物、论坛、搜索、广告分割成不同的应用,由独立的团队负责。部署在不同的服务器上。
3、分布式
分层和分割的目的就是为了切分后的模块便于分布式部署,将不同的模块部署在不同的服务器上。同时,分布式也带来了很多问题,
- 不同服务器之间的通信对网络依赖很大
- 保持数据一致性比较困难
- 网站依赖错综复杂,开发维护困难
常见的分布式方案有以下几种
- 分布式应用和服务。
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
- 分布式文件系统
- 分布式锁
- 分布式配置。支持网站线上服务配置实时更新
4、集群
虽然分布式已经将各个应用分开部署,但是对于用户集中访问的模块,还需要独立部署服务器集群化,即多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。并且支持线性扩展,发生故障时的失效转移。即使是访问量很小的分布式应用和服务也至少要部署两台构成小的集群,提高系统的可用性
5、缓存
缓存是改善软件性能的第一手段。大型网站很多方面都使用了缓存设计:
- CDN,即内容分发网络。在这里缓存网站的一下静态资源(较少变化的数据),可以就近以最快速度返回给用户。如视频网站和门户网站会将用户访问量大的热点内容缓存在CDN
- 反向代理。当用户的请求到达数据中心时,最先访问到的是反向代理服务器,这里缓存网站的静态资源,无需继续将请求转发给应用服务器,直接返回给用户
- 本地缓存。在应用服务器本地缓存这热点数据,应用程序可以在本地内存中直接访问,无需访问数据层
- 分布式缓存。将数据存储在专门的分布式缓存集群中,应用服务器通过网络通讯访问缓存数据。
缓存同时也存在着缓存击穿、缓存雪崩、缓存热点不集中的问题
6、异步
在单一服务器内部可通过多线程共享内存队列的方式实现异步,在分布式系统中,多个服务器集群通过分布式消息队列实现异步。异步架构是典型的生产者-消费者模式。使用异步消息队列能够带来如下好处:
- 提高系统可用性
- 提高系统响应速度
- 消除并发访问高峰。消息队列能够把突然增加的访问请求数据放入到队列中,等待消费者处理,不会对网站造成太大压力
7、冗余
为了提高系统的可用性,防止某些服务器宕机的情况下系统依然可以继续服务,需要一定的服务器冗余运行、数据冗余备份。数据库除了定期备份实现冷备份之外,还需要主从分离,实时同步实现热备份。为了抵御海啸、地震等不可抗力,还需要在全球范围内部署灾备数据中心。
8、自动化
发布过程自动化:自动化代码管理,自动化测试,自动化安全测试,自动化部署。系统运行过程中还有:自动化监控、自动化报警、自动化失效转移、自动化失效恢复、自动化降级、自动化资源分配。
9、架构模式在新浪微博的应用
新浪微博系统分为三层:
- 最下层是基础服务层,提供数据库、缓存、搜索、存储等基础服务
- 中间层是平台服务和应用服务层,微博的核心是微博、用户、关系,这些服务被分割成独立的模块,通过依赖调用和对共享基础服务构成微博的业务基础
- API层,是微博的业务层,包括网站、app、第三方应用,通过调用API集成到微博系统中,共同组成一个生态系统
微博的发布,早起使用同步推模式,用户发表微博后会立即将这条微博插入到数据库所有粉丝的订阅列表中,用户量比较大时,会引起大量的数据库写操作,超出负载,导致系统性能下降。后来改用异步推拉方式,用户发表微博之后立刻写到消息队列中然后立刻返回,消息队列消费者将微博推送给当前在线粉丝的订阅列表中,非在线用户等登录后在根据关注列表拉取微博订阅列表