大型网站技术架构核心原理与案例分析 读书笔记
大型网站架构模式
一、网站架构模式
分层
大型网站一般分为三层:
- 应用层
- 服务层
- 数据层
实践中,每一层还可以细分。如应用层又分为视图层和业务逻辑层;服务层分为数据接口层和逻辑处理层。
分层是逻辑上的。在物理部署上,三层可以部署在同一个物理机器上。但随着网站业务的发展,必然要做分离部署。
分割
按功能纵向分割。大型网站的分割粒度会很细。如应用层按业务,将购物、论坛、搜索、广告分割成不同的应用,由独立团队负责,部署在不同服务器上;在同一个应用内部,如果业务复杂,会继续进行分割,如购物业务可以细分成机票酒店、3C、小商品等业务。
分布式
分层和分割是为了切分后的模块便于分布式部署,但分布式部署也带来其他问题。
- 网络。服务调用通过网路,严重影响性能。
- 服务器越多,宕机概率越高,网站可用性降低。
- 数据一致性和分布式事务难以保证。
- 导致网站依赖错综复杂,开发管理维护困难。
因此切莫为了分布式而分布式。
常用的分布式方案有以下几种:
- 分布式应用和服务
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
- 分布式配置
- 分布式锁
- 分布式文件系统
集群
集群、负载均衡提高可用性。
缓存
缓存可以加快访问速度,减轻后端应用和数据存储的负载压力。
- CDN:内容分发网络,部署在离终端用户最近的网络服务商。如视频网站和门户网站会将用户访问量大的热点内容缓存在CDN.
- 反向代理:属于网站前端架构的一部分。用户请求到达网站所在的数据中心时,最先到达反向代理服务器。缓存静态资源。
- 本地缓存:应用服务器本地缓存着热点数据,应用程序可以在本机内存中直接访问数据,无需访问数据库。
- 分布式缓存:大型网站数据量大,单机不能承受内存空间消耗,需要专门的分布式缓存集群。
使用缓存有两个前提条件:
- 数据访问热点不均衡,有些数据会被频繁访问。
- 数据在某个时间段有效,不会很快过期。
异步
单一服务器内部可以通过多线程共享内存队列的方式实现异步;分布式系统中,多个集群通过分布式消息队列实现异步。
分布式消息队列可以看做内存队列的分布式部署。
异步架构是典型的生产者消费者模式,两者不存在直接调用,只要保持数据结构不变,彼此功能实现可以随意变化。
异步消息队列还有如下特性:
- 提高系统可用性。消费者服务器发生故障后,数据会在消息队列服务器堆积,生产者可以继续处理业务。消费者服务器恢复后可以继续处理消息队列中的数据。
- 加快网站响应速度。生产者写入消息队列后即可返回,不必等待消费者处理。
- 削峰。将突然增加的访问请求数据放入消息队列中,等待消费者处理。
需要注意的是,使用异步方式处理业务可能会对用户体验、业务流程造成影响,需要网站产品设计方面的支持。
冗余
- 冷备份,数据库定期备份,存档
- 热备份,数据库主从分离,实时同步
- 灾备数据中心,全球范围部署
自动化
- 自动化代码管理,版本控制、分支创建合并等过程自动化,开发工程师只要提交自己参与开发的产品代号,系统就会自动为其创建开发分支,后期自动代码合并
- 自动化测试
- 自动化安全检测
- 自动化部署
- 自动化监控、告警,服务器宕机、程序bug、存储空间不足、突然爆发的访问高峰
- 自动化失效转移,将失效的服务器从集群中隔离,不再响应系统中的应用请求。
- 自动化失效恢复
- 自动化降级,拒绝部分请求,关闭部分不重要的服务将负载将至安全水平
- 自动化分配资源,将空闲资源分配给重要的服务
安全
- 通过密码、手机校验码进行身份认证
- 网络通信加密
- 验证码
- 对XSS攻击、SQL注入进行编码转换
- 对垃圾信息进行过滤
- 对交易转账等操作进行风险控制
二、新浪微博
架构
新浪微博最初是一个小网站,采用LAMP架构。应用程序使用PHP开发,所有数据都存储在MySQL数据库中。
后来业务增长,用户增加,新浪微博架构几经重构,形成现在的架构。
- 最底层是基础服务层,DB、Cache、存储、MQ、实时搜索、IDC同步
- 中间层是平台服务和应用服务。平台服务包含微博、关系、用户和计数。应用服务包含图片池。
- 最上层是API和新浪微博的业务层,各种客户端(包括web网站)和第三方应用通过调用API集成到新浪微博系统中。
部署
新浪微博在早期还使用过一种MPSS(MultiPort Single Server)的分布式集群部署方案。集群中每台服务器都部署多个服务,每个服务使用不同端口对外提供服务。现在网站应用中常见的是将物理机虚拟化成多个虚拟机,在虚拟机部署应用。这样更加简单,还可以在不同虚拟机使用相同端口号。
消息队列
新浪微博的早期架构中,微博发布使用同步推送模式。用户发表微博后,系统立即将微博插入到数据库所有粉丝的订阅列表中。当用户量比较大时,特别是明星用户发微博,会引发大量数据库写操作,超出数据库负载,导致系统性能急剧下降。后来改用异步推拉结合的模式,用户发表微博后,系统将微博写入消息队列后立即返回,用户迅速得到响应。消息队列的消费者任务将微博推送给所有当前在线粉丝的订阅列表中,非在线用户登陆后再根据关注列表拉去订阅列表。
缓存
由于微博频繁刷新,新浪微博采用多级缓存策略:
- 热门微博和明星用户的微博缓存在所有微博服务器上
- 在线用户的微博和近期微博缓存在分布式缓存集群中
微博操作中的“刷微博”几乎全部都是缓存访问操作,可以获得很好的系统性能。
多数据中心
自动化工具
安全
三、总结
山寨与创新的区别在于对问题和需求的真正理解与把握。
网友评论