构建高可用、高性能、高可拓展性网站系统,大型网站架构的全貌
目录
- 第一章,从演化、模式、要素三个维度描述网站整体架构
- 第二章,从性能,可用性,伸缩性,拓展性,安全这五个要素方面描述网站架构核心原理
- 第三章,分析具体案例
- 第四章,架构师角度的回顾
概述
1.大型网站架构演化
大型网站软件系统的特点
- 高并发,大流量
- 高可用
- 海量数据
- 用户分布广,网络情况复杂
- 安全环境恶劣
- 需求快速变更,发布频繁
- 渐进式发展
大型网站架构演化发展历程
- 初始阶段,都在一台服务器上
- 应用服务和数据服务分离:应用服务器,文件服务器,数据库服务器
- 使用缓存改善网站性能:部署大内存服务器作为专门的缓存服务器
- 应用服务器集群改善网站的并发处理能力
- 数据库读写分离,(主从数据库)
- 使用反向代理和CDN加速网站响应,基本原理都是缓存(缓存在网络提供商的机房/缓存在网站的中心机房)
- 分布式文件系统和分布式数据库系统,业务分库更常用
- 使用NoSQL和搜索引擎,对数据存储和检索
- 业务拆分
- 分布式服务,提取共有业务独立部署
大型网站架构演化的价值观
随网站所需灵活应对
业务发展驱动技术发展
误区:
- 一味追求大方案
- 为了技术而技术
- 企图用技术解决所有问题
2.大型网站架构模式
网站架构模式
- 分层:应用层,服务层,数据层
- 分割:纵向方面对软件进行切分
- 分布式应用、服务、资源、数据、计算
- 集群:并发特性
- 缓存:CDN、反向代理,本地缓存,分布式缓存
- 异步,一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行协作,时典型的生产者消费者模式,两者不存在直接调用,能够提高系统可用性,加快网站响应速度,消除并发访问高峰
- 冗余:冷热备份
- 自动化:发布运维
- 安全
3.大型网站核心架构要素
- 性能:所有环节都能性能优化,浏览器端、CDN、应用服务器端、代码层面、数据库服务器端
- 可用性:防止宕机,主要通过冗余
- 伸缩性:多台服务器构建集群
- 拓展性:增加新业务,主要手段-时间驱动架构和分布式服务
- 安全性
4.瞬时响应:网站的高性能架构
网站性能测试
- 用户视角的网站性能:响应速度
- 开发人员视角:响应延迟、吞吐量、并发处理能力、稳定性
- 运维人员:基础设施性能和资源利用率
性能测试指标
- 响应时间:执行一个操作需要的时间
- 并发数:同时处理请求的数目
- 吞吐量:单位时间内系统处理的请求数量
- 性能计数器:描述服务器或操作系统性能的一些数据指标
性能测试方法
- 性能测试
- 负载测试
- 压力测试
- 稳定性测试
Web前段性能优化
- 浏览器访问优化:减少http请求,使用浏览器缓存,压缩,减少cookie传输
- CDN加速
- 反向代理:传统代理位于浏览器一侧,反向代理服务器位于网站机房一侧
应用服务器性能优化
分布式缓存--网站性能优化第一定律:优先考虑使用缓存优化性能
- 缓存本质:数据存储在相对较高访问速度
- 合理使用缓存,针对频繁修改的数据,是否热点数据,容忍数据不一致,可用性,缓存预热,缓存穿透(不存在的值也缓存起来,为null)
- 分布式缓存架构
- Memcached 集中式的缓存集群管理,互不通信的分布式架构方式
异步操作
使用消息队列,将调用异步化,具有良好的削峰作用--通过异步处理,将短时间高并发产生的事务消息存储在消息队列中
使用集群
使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群
代码优化
- 多线程
- 资源复用:单例模式/对象池
- 数据结构
- 垃圾回收
存储性能优化
- 机械硬盘VS固态硬盘
- B+树 VS LSM树
LSM树的设计思想非常朴素:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。
LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。
- RAID VS HDFS
RAID:磁盘冗余阵列
HDFS:Hadoop分布式文件系统,NameNode负责元数据服务,DataNode负责真正数据存储,一个数据由三分副本
5.万无一失:网站的高可用架构
网站可用性度量与考核
四个九
故障分类考核
高可用的网站架构
基本分层架构模型:应用、服务、数据
按模块功能分割集群
高可用的应用
应用的无状态性:应用服务器不保存业务的上下文信息,而仅跟姐姐每次请求提交的数据进行相应的业务逻辑处理,多个服务器之间完全对等
- 通过负载均衡进行无状态服务的失效转移
- 应用服务器集群的Session管理:实际上业务总是有状态的,多次请求修改使用的上下文对象称作回话,通过session复制(不好),session绑定,利用cookie记录session,session服务器
高可用的服务
- 分级管理
- 超时设置
- 异步调用
- 服务降级
- 幂等性设计
高可用的数据
CAP原理:
一致性Consistency,可用性Availibility,分区耐受性Patition Tolerance(系统具有跨网络分区的伸缩性)
数据备份
- 冷备
- 异步热备
- 同步热备
失效转移
- 失效确认
- 访问转移
高可用网站的软件质量保证
- 网站发布
- 自动化测试
- 预发布验证
- 代码控制
- 自动化发布
- 灰度发布
网站运行监控
- 监控数据采集
- 监控管理
6.网站的伸缩性架构
网站架构的伸缩性设计
- 不同功能进行物理分离实现伸缩
- 单一功能通过集群规模实现伸缩
应用服务器集群的伸缩性设计
- HTTP重定向负载均衡
- DNS域名解析负载均衡
- 反向代理负载均衡
- IP负载均衡
- 数据链路层负载均衡(修改mac地址)
- 负载均衡算法:轮询,加权轮询,随机,最少连接,原地址散列
分布式缓存集群的伸缩性设计
- Memcached分布式缓存集群的访问模型
-
分布式缓存的一致性Hash算法,再加一个虚拟层可以使负载均衡
数据存储服务器集群的伸缩性设计
- 关系数据库集群的伸缩性设计
- NoSQL数据库的伸缩性设计
7.网站的可扩展架构
- 拓展性(Extensibility)指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力
- 伸缩性(Scalability)指系统能够通过增加(减少)自身资源规模的方式增强(减少)自己计算处理事务的能力
将一个大系统切分成N个低耦合的子模块
利用分布式消息队列降低系统耦合性
- 事件驱动架构(Event Driven Architecture),如生产者消费者模式
- 分布式消息队列,消息发送者和消息接受者之间没有直接耦合
利用分布式服务打造可复用的业务平台
将模块独立部署,降低系统耦合性
- 纵向拆分:将一个大应用拆分为多个小应用
- 横向拆分:将复用的业务拆分出来,独立部署为分布式服务
8.网站的安全架构
网站应用攻击与防御
- XSS跨站点脚本攻击(Cross Site Script):黑客通过篡改网页,注入恶意HTML脚本--消毒:对某些html危险字符转义,过滤和消毒处理,HttpOnly
- 注入攻击,SQL注入攻击,攻击者在HTTP请求中注入恶意SQL命令
- CSRF跨站点请求伪造,利用浏览器Cookie或服务器Session策略,盗取用户身份进行非法操作
信息加密技术及密钥安全管理
- 单向散列加密,得到固定长度的输出,进行密码加密保存
- 对称加密:使用同一个密钥
- 非对称加密:公钥+私钥,用在信息安全传输、数字签名等场合
密钥安全管理
- 密钥和算法放在一个独立服务器上
- 加解密算法放在应用系统中,密钥切成数片保存在不同的存储介质中
信息过滤与 反垃圾
- 文本匹配:正则表达式,双数组Trie算法,多级Hash表
- 分类算法:贝叶斯分类算法
- 黑名单:Hash表,布隆过滤器(不完全精确)
12.网购秒杀系统架构设计案例分析
技术挑战
- 对现有网站业务造成冲击
- 高并发下的应用、数据库负载
- 突然增加的网络带宽
- 直接下单
应对策略
- 秒杀系统独立部署
- 秒杀商品页面静态化
- 租借秒杀活动网络带宽
- 动态生成随机下单页面URL
秒杀系统架构设计
- 控制秒杀商品页面购买按钮的点亮:JavaScript脚本控制,秒杀开始时生成一个新的JavaScript文件并被用户浏览器加载
- 只允许第一个提交的订单被发送到订单子系统,只有少数用户能进入下单页面,其他用户之间进入秒杀结束页面