《大型网站技术架构》学习笔记
文章目录
架构常用技术
- 分布式缓存
- 负载均衡
- 消息队列
- 分布式服务
网站架构考虑的点
- 高可用
- 高性能
- 可扩展
- 伸缩性
- 安全性
架构上的问题
- 如何实现秒杀系统,如何处理高并发冲击的问题?
- 订单系统在高峰期如何处理订单队列?
- 通过缓存手段,设计数据库伸缩性架构?
大型网站特点
- 高并发、大流量
- 高可用
- 海量数据
- 用户分布广泛, 网络情况复杂
- 安全性
- 需求快速变更,发布频繁
- 渐进式发展
解决网站性能和可用性问题的手段
- 数据库与应用程序分离
- 使用缓存改善网站性能:
- 服务器上的本地缓存
- 分布式缓存服务器上的远程缓存
- 使用应用服务器集群改善网站的并发处理能力:新增机器, 通过nginx实现负载均衡,提高系统的可伸缩性。
- 数据库读写分离:数据库的主从热备,配置两台数据库的主从关系,将一台数据服务器的数据同步到另一台服务器上。(写主库、读从库)
- 使用反向代理和CDN加速网站响应。
基本原理: 使用缓存
区别:
- CDN缓存部署在网络运营商机房。(而CDN分发解决方案解决了与静态网站相关的性能和可靠性问题)
- 反向代理部署在网站的中心机房(也缓存静态资源)。
- 前向代理(client端代理)和反向代理的区别(svrver端代理)
请求流程: CDN机房 -> 反向代理服务器 -> 网站资源
- 使用分布式文件系统、分布式数据库系统(数据库拆分的最后手段)。更常用的手段是业务分库。
- 使用NoSql(非关系型数据库)和搜索引擎。
- 业务拆分。
- 分布式服务
大型网站系统-架构图
- 二八定律:80%的业务访问在20%的数据上。
- 网站技术是为业务而存在的。
- 技术解决不了所有问题,可能是业务架构造成的问题。 (e.g. 12306一开始的业务架构是整点放票,抢票时的大流量问题从技术上难以实现;后面改为分段售票,控制了并发访问的量,降低系统的资源成本和技术成本)
- 技术是用来解决业务问题的。业务问题也可以通过业务的手段去解决。
大型网站的架构模式
分层(应用层、服务层、数据层)
分布式(使用更多的计算机完成同样的功能)
- 解决的问题: 高并发的问题
- 带来的问题:
- 服务调用必须通过网络,可能会对性能造成影响
- 服务宕机的可能性大(部署在多台服务器上),降低服务的可用性
- 分布式环境 数据的一致性
- 网站依赖加大,维护成本增加
- 分布式方案:
- 分布式应用和服务(解决性能和并发性问题),不同模块复用共同的服务,便于业务扩展。
- 分布式静态资源(前端资源,Js,CSS,Logo)
- 分布式数据和存储:以P为单位海量数据(NoSQl产品基本都是分布式)
- 分布式计算:搜索引擎的索引构建、数据仓库的数据分析统计(Hardoop、MapReduce),将程序分发到数据所在位置加速计算和分布式计算。
- 分布式配置:支持网站线上服务器配置实更新。
- 分布式锁: 分布式环境下实现并发和协同
- 分布式文件: 支持云存储
集群: 提高系统的高可用(考虑负载均衡)
缓存:改善软件性能的第一手段
- 缓存设计:
- CDN
- 反向代理
- 本地缓存
- 分布式缓存
- 缓存的前提条件:
- 热点数据访问不均匀,热点数据存放在缓存中, 减少数据请求压力
- 某段时间内有效, 不会很快过期, 否则缓存的数据会因为失效产生脏读。
- 缓存的意义:
- 加快数据的访问速度
- 减少后端应用和数据存储的负载压力
- 缓存设计:
异步
- 意义: 降低系统软件的耦合性
- 方法: 业务之间的消息传递不是同步调用的,而是将一个业务操作分成多个阶段,每个阶段通过共享数据的方式异步执行。
- 异步手段:
- 多线程共享内容队列(单机器)
- 分布式消息队列 -> 内存队列的分布式部署
- 特性:
- 典型的生产者/消费者模式,两者不存在直接调用的关系,功能随意变化对系统无影响(高扩展性)
- 提高系统可用性:消费者服务器出现故障,数据会在消息队列服务器堆积。生产者服务器可以继续处理业务请求,系统整体表现无故障。消费者服务器恢复正常后, 继续处理消息队列中的数据。
- 加快网站响应速度:不需要等待消费者服务器处理完业务请求后就直接返回,响应延迟减少。
- 消除并发访问高峰: 不会对整个网站造成过大的负载压力。
- 注意的问题:
- 异步处理业务可能会对用户体验、业务流程造成影响。
冗余
- 意义:保证服务器宕机的情况下网站能正常继续服务。
- 手段:
- 服务器冗余运行,数据冗余备份,服务宕机的情况下可以将服务和数据转移到其他机器。
- 服务必须部署至少两台机器构成一个集群 -> 冗余实现服务高可用。数据定期备份:
- 冷备份 (全量备份)
- 热备份(实时备份)
- 部署数据灾备中心。
自动化(集中在发布运维上)
- 自动化代码管理
- 自动化测试
- 自动化安全测试
- 自动化部署
- 自动化监控
- 自动化报警
- 自动化失效转移
- 自动化失效恢复
- 自动化降级
- 自动化分配资源
大型网站核心架构要素
- 定义:软件架构,有关软件整体架构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
- 目标
- 性能
- 可用性
- 伸缩性
- 扩展性(主要手段):
事件驱动架构
分布式服务
- 安全性
网站系统架构层次
前端架构
浏览器优化技术
- 页面缓存
- 合并HTTP减少请求次数
- 使用页面压缩
CDN: 内容分发网络,部署在网络运营商机房
动静分离,静态资源独立部署
图片服务
反向代理, 在应用服务器、静态资源服务器、图片服务器之前,提供页面缓存服务。
DNS
应用层架构
- 开发架构
- 页面渲染
- 负载均衡
- Session管理:为了高可用,应用服务器一般设计为无状态,不保存用户请求的上下文。为了保存用户的session信息:
- 专门的机制管理Session
- 跨集群间Session的同步(共享)
- 动态页面静态化
- 业务拆分(1. 降低系统耦合度;2. 数据库业务分库 -> 效果相对较好)
- 虚拟化服务器:对于并发访问较低的业务,更容易用较少的资源构建高可用的应用服务集群。