大型网站技术架构核心原理与案例分析
此为《大型网站技术架构核心原理与案例分析》的记录
概述
大型网站架构演化
特点
- 高并发、大流量
- 高可用
- 海量数据
- 用户分布广泛、网络情况复杂
- 安全环境恶劣
- 需求快速变更、发布频繁
- 渐进式发展
历程
- 单体服务器
- 前后端分离、应用服务和数据服务分离
- 加入缓存和分布式缓存服务器
- 使用服务器集群改善并发处理能力
- 数据库读写分离
- 使用反向代理和CDN加速网站响应
- 使用分布式文件系统和分布式数据库系统
- 使用noSQL和搜索引擎
- 业务拆分
- 分布式服务
价值观
- 大型网站架构技术的核心价值随网站所需灵活应对
- 驱动大型网站技术发展的主要力量是网站的业务发展
误区
- 一味追随大公司的解决方案
- 为技术而技术
- 企图用技术解决所有问题
大型网站架构模式
- 分层,基本分为应用层、服务层、数据层,各层必须合理规划层次边界和接口,严格遵循分层架构的约束,禁止跨层调用和逆向调用;
- 分割,将不同功能按照高内聚低耦合模块单元进行分割,提高并发处理能力和功能扩展能力;
- 分布式
- 分布式应用和服务
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
- 集群,独立部署的服务器集群化,通过负载均衡设备共同对外提供服务
- 缓存,使用缓存的前提:数据访问热点不均衡;数据在某个时间段有效,不会很快过期
- 异步,将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行。异步架构是典型的生产者消费者模式。
- 提高系统可用性
- 加快网站响应速度
- 消除并发访问高峰
- 冗余
- 自动化
- 安全
大型网站核心架构要素
架构:最高层次的规划、南里改变的决定
软件架构:有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
架构的五要素:功能、性能、可用性、伸缩性、扩展性和安全性
架构
网站的高性能架构
网站性能测试
- 用户视角
- 开发视角
- 运维视角
性能测试指标
- 响应时间
- 并发数
- 吞吐量
- 性能计数器
性能测试方法
- 性能测试
- 负载测试
- 压力测试
- 稳定性测试
性能测试报告
性能优化策略
- 性能分析
- 性能优化
前端性能优化
- 浏览器访问优化
- 减少HTTP请求
- 使用浏览器缓存
- 启用压缩
- CSS放到页面最上,JavaScript放到最下
- 减少Cookie
- 使用CDN加速
- 反向代理
应用服务器性能优化
- 分布式缓存
- 合理使用缓存
- 分布式缓存架构
- Memcached
- 异步操作
- 使用集群
- 代码优化
- 多线程
- 资源复用
- 数据结构
- 垃圾回收
存储性能优化
- 机械硬盘 vs 固态硬盘
- B+树 vs LSM 树
- RAID vs HDFS
网站的高可用架构
网站可用性的度量和考核
网站可用性考核
高可用的网站架构
实现高可用架构的主要手段是数据和服务的冗余备份以及失效转移
- 高可用的网站架构
- 高可用的应用
- 通过负载均衡进行无状态服务的失效转移
应用服务Session管理
Web应用中将这些多次请求修改使用的上下文对象称作绘画。Session管理主要有以下手段:
- Session 复制
- Session 绑定,基于负载均衡源地址Hash算法
- 利用 Cookie 记录 Session
- Session 服务器
高可用的服务
- 分级管理
- 超时设置
- 异步调用
- 服务降级
- 幂等性设计
高可用的数据
CAP原理:提供数据服务的存储系统无法同时满足数据一致性、数据可用性、分区耐受性这三个条件。
- 数据持久性
- 数据可访问性
- 数据一致性
- 数据强一致
- 数据用户一致
- 数据最终一致
- 数据备份
- 数据冷备
- 数据热备
- 异步热备
- 同步热备
- 失效转移
- 失效确认
- 访问转移
- 数据恢复
高可用网站的软件质量保证
- 网站发布
- 自动化测试
- 预发布验证
- 代码控制
- 主干开发、分支发布
- 分支开发、主干发布
- 自动化发布
- 灰度发布
网站运行监控
“不允许没有监控的系统上线”
- 监控数据采集
- 用户行为日志收集
- 服务器端日志收集
- 客户端浏览器日志收集
- 服务器性能监控
- 运行数据报告
- 用户行为日志收集
- 监控管理
- 系统报警
- 失效转移
- 自动优雅降级
网站的伸缩架构
网站的伸缩性可分成两类,一类是根据功能进行物理分离实现伸缩,一类是单一功能通过集群实现伸缩。前者是不同的服务器部署不同的服务,提供不同的功能;后者是集群内的多台服务器部署相同的服务,提供相同的功能。
- 不同功能进行物理分离实现伸缩
- 单一功能通过集群规模实现伸缩
应用服务器集群的伸缩设计
- HTTP重定向负载均衡
- DNS域名解析负载均衡
- 反向代理负载均衡
- IP负载均衡
- 数据链路层负载均衡
- 负载均衡算法
分布式缓存集群的伸缩性设计
- Memcached 分布式缓存集群的访问模型
- 热添加缓存集群的伸缩性挑战
- 分布式缓存的一致性Hash算法
数据存储服务器集群的伸缩性设计
- 关系数据库集群的伸缩性设计
- NoSQL数据库的伸缩性设计
网站的可扩展性架构
构建可扩展的网站架构
- 开发低耦合系统
- 模块化
利用分布式消息队列降低系统耦合性
- 事件驱动架构
- 分布式消息队列
利用分布式服务打造可复用的业务平台
- Web Service 与企业级分布式服务
- 分布式服务框架设计
可扩展的数据结构
利用开发平台建设网站生态圈
网站的安全架构
网站应用攻击与防御
- XSS 攻击 跨站点脚本攻击
- 攻击类型:
- 反射型
- 持久型
- 防御手段:
- 消毒
- HttpOnly
- 攻击类型:
- 注入攻击
- 攻击类型:
- 错误回显
- 盲注
- 开源搭建
- 防御手段:
- 消毒
- 参数绑定
- 攻击类型:
- CSRF 攻击 跨站点请求伪造
- 防御手段:
- 表单Token
- 验证码
- Referer Check
- 防御手段:
- 其他攻击和漏洞
- Web应用防火墙
- 网站安全漏洞扫描
加密技术及密钥安全管理
- 单向散列加密
- 对称加密
- 非对称加密
- 密钥安全管理
信息过滤与反垃圾
- 文本匹配
- 分类算法
- 黑名单
电子商务风险控制
典型故障案例
- 写日志故障
- 应用程序日志和第三方组件日志输出要分别配置
- 日志文件输出级别为Warn,调用级别要符合其真实日志级别
- 检查第三方组件的error日志
- 高并发范文数据库引起故障
- 首页不应该访问数据库
- 首页最好是静态
- 高并发情况下锁引发的故障
- 谨慎操作锁操作
- 缓存引发的故障
- 当缓存成为了网站架构不可或缺的一部分时,对缓存的管理就要提高到和其他服务器一样的级别
- 大文件读写独占磁盘引发的故障
- 存储的使用需要根据不同文件类型和用途进行管理
- 图片等小文件应该使用专用存储服务器,不能和大文件共用存储
架构师
关注人而不是产品
寻找一个值得共同奋斗的目标,营造一个让大家能够最大限度发挥自我价值的工作氛围。
发掘人的优秀
共享美好蓝图
- 蓝图应该是表述清楚的
- 蓝图应该是形象的
- 蓝图应该是简单的
共同参与架构
- 不要只有架构师一个人拥有架构
- 让其他人维护框架与架构文档
学会妥协、成就他人
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.