前言
又把《大型网站技术架构-核心原理与案例分析》看了一遍,之前走马观花看了一遍,没有体会到精髓。现在具备一定“中型”网站开发经验后再看之,又有些体会,故整理一下这本书的内容。
大型网站架构演化
大型网站软件的特点
- 高并发、大流量
- 高可用
- 海量数据
- 用户分布广泛
- 安全环境恶劣
- 需求变更快,发布频繁
- 渐进式发展
大型网站架构演化发展历程
- 初始阶段的网站架构:all in one,一台服务器,部署了应用程序,数据库,文件,等所有资源。比如经典的
LAMP
架构。 - 应用和数据服务分离:应用程序,数据库,文件分别用了3台服务器部署。
- 使用缓存改善网站性能:本地缓存+分布式缓存。
- 使用应用服务器集群改善网站并发处理能力:通过负载均衡调度服务器来将访问请求分发到应用服务器集群中的任何一台机器。
- 数据库读写分离:数据库采用主从热备,写数据在主数据库中,主数据库通过主从复制机制将数据更新同步到从数据库。读数据从从库读取。
- 使用反向代理和 CDN 加速网站响应:这两者基本原理都是缓存。CDN 部署在网络提供商的机房,使用户可从离距离自己最近的提供商机房获取数据;反向代理部署在网站的中心机房,减轻后端负载压力,反向代理服务器命中的静态数据可直接返回。
- 使用分布式文件系统和分布式数据库系统:数据库拆分的最后手段,解决单表特别大的情况。
- 使用 NoSQL 和搜索引擎:对可伸缩的分布式有更好的支持。
- 业务拆分:将整个网站业务拆分成不同的应用,每个应用独立部署维护,应用之间通过超链接建立联系/消息队列进行数据分发/访问同一数据存储系统
- 分布式服务:公共业务提取出来独立部署
大型网站演化到这里,大多数技术问题都得以解决,如图:
大型网站架构演化的价值观
- 大型网站架构的核心价值是随网站所需灵活应对
- 驱动大型网站技术发展的主要力量是网站的业务发展
网站架构设计误区
- 一味追随大公司的解决方案
- 为了技术而技术
- 企图用技术解决所有问题
大型网站架构模式
- 分层:计算机世界无处不在,操作系统与硬件,网络七层,网站应用MVC分层。
- 分割:按业务分割
- 分布式:
- 分布式应用和服务
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
- 集群
- 缓存:
- CDN
- 反向代理
- 本地缓存
- 分布式缓存
- 异步:
- 提供系统可用性
- 加快网站响应速度
- 消除高并发访问高峰
- 冗余:服务器冗余运行,数据库冗余备份(冷热备份)
- 自动化:自动化代码管理;自动化发布;自动化测试;自动化安全检测;自动化部署;自动化监控;自动化报警;自动化失效转移;自动化失效恢复;自动化降级;自动化分配资源。
- 安全:防止XSS攻击、sql注入。
大型网站核心架构要素
- 性能
- 浏览器端:浏览器缓存,页面压缩,合理布局页面,减少Cookie传输
- CDN:静态内容分发到离用户最近的网络服务商机房。
- 应用服务器:缓存+异步。
- 代码层面:多线程+改善内存等手段优化。
- 数据库:索引,缓存,SQL优化等。
- 可用性:只要手段是冗余
- 应用服务器:负载均衡组成集群。
- 数据库:实时备份。
- 软件开发质量保证:预发布验证,自动化测试,自动化发布,灰度发布等。
- 伸缩性:主要标准是是否可以构成集群,是否容易不断地向服务器集群加服务器
- 应用服务器集群:负载均衡设备。
- 缓存服务器集群:改进缓存路由算法保证存储数据的可访问性。
- 数据库:路由分区等。
- NoSQL数据库:先天良好支持。
- 扩展性:指业务上是否可以少有改动快速上线。主要手段是事件驱动架构和分布式服务。
- 事件驱动架构:通常用消息队列实现。
- 分布式服务:按业务和可复用性将服务分离。
- 安全性:标准是针对现存和潜在的各种攻击和窃密手段,是否有可靠的应对策略。
瞬时响应:网站的高性能架构
网站性能测试
- 不同视角下网站的性能
- 用户视角网站性能:响应时间。
- 开发人员视角的网站性能:响应时间、并发量、吞吐量。
- 运维人员视角的网站性能:资源。
- 性能测试指标
- 响应时间:直观反映系统快慢。
- 并发数:反映系统负载特性。
- 吞吐量:反映系统整体处理能力。通过qps,tps,hps测量。
- 性能计数器:描述服务器或操作系统的数据指标。包括System Load、对象与线程数、内存使用、CPU使用、磁盘与网络I/O等指标。
- 性能测试方法
- 性能测试:验证系统在资源可接受范围内。
- 负载测试:测试安全临界值。
- 压力测试:测试系统最大压力承受能力。
- 稳定性测试:模拟生产环境。
- 性能测试报告
- 性能优化策略
- 性能分析:1.检测请求各环节日志,分析那个环节响应时间不合理。2.检查监控数据。
- 性能优化:
- Web前端性能优化
- 应用服务器性能优化
- 存储服务器性能优化
web前端性能优化
- 浏览器访问优化
- 减少http请求
- 使用浏览器缓存
- 启用压缩
- css放在网页最上面 js最下面
- 减少cookie传输
- CDN加速
- 反向代理:安全屏障;缓存静态和热点数据;负载均衡。
应用服务器性能优化
优化的主要手段还是:缓存,异步,集群。
- 分布式缓存
- 缓存的基本原理
- 合理的使用缓存
- 频繁修改数据:读写比2:1以上缓存才有意义
- 没有热点的访问
- 数据不一致与脏读
- 缓存可用性
- 缓存预热
- 缓存穿透
- 分布式缓存架构
- 异步操作:削峰
- 使用集群
- 代码优化
- 多线程:
- 将对象设计为无状态对象
- 使用局部对象
- 并发访问资源加锁
- 资源复用:单例和对象池
- 数据结构
- 垃圾回收
- 多线程:
存储性能优化
- 机械硬盘 vs. 固态硬盘
- B+ 树 vs. LSM 树
- RAID vs. HDFS
万无一失:网站的高可用架构
网站可用性的度量和考核
- 网站可行性度量
- 网站不可用时间(故障时间) = 故障修复时间点 - 故障发现时间点
- 网站年度可用性指标 = (1 - 网站不可用时间/年度总时间) * 100%
- 2个9基本可用,3个9较高可用,4个9具有自动恢复能力的高可用,5个9是极高可用性
- 网站可用性考核:故障分 = 故障时间 * 故障权重
高可用的网站架构
分层+分割+集群
高可用的应用
- 通过负载均衡进行无状态服务的失效转移
- 应用服务器集群的session管理
- session复制:简单,适用于集群规模较小的情况
- session绑定:粘性session
- 利用cookie记录 session:简单易用,可用性高,支持线性伸缩,但是每次响应都会传输cookie,影响性能。
- session服务器:利用分布式缓存。
高可用的应用
- 分级管理:核心应用与服务优先使用更好的硬件;部署上进行隔离。
- 超时设置
- 异步调用
- 服务降级:手段有二:拒绝服务及关闭服务。
- 幂等性设计:业务代码层面通过有效性校验等。
高可用的数据
- CAP原理
- 数据持久性
- 数据可访问性
- 数据一致性
- 数据强一致性
- 数据用户一致性
- 数据最终一致性
- 数据备份
- 冷备:简单廉价,成本和技术难度低;但不能保证数据最终一致。恢复时间可能会长,一段时间不可用。
- 热备:同步和异步方式
- 失效转移
- 失效确认
- 访问转移
- 数据恢复
高可用软件质量保障
网站发布:脚本发布,流程大致如下
- 关闭负载均衡服务器上一台或一小批服务器路由
- 关闭这些服务器应用
- 同步(复制)软件代码包到这些服务器上
- 启动这些服务器
- 打开负载均衡服务器这些服务器的路由
- 集群所有机器发布完成?是则退出:否则继续1.
自动化测试
- 预发布验证
- 代码控制
- 主干开发,分支发布
- 分支开发,主干发布
- 自动化发布
- 灰度发布
网站运行监控
- 监控数据采集
- 用户行为日志收集
- 服务器性能检测
- 运行数据报告
- 监控管理
- 系统报警
- 失效转移
- 自动优雅降级
永无止尽:网站的伸缩性架构
网站伸缩性设计
- 不同功能进行物理分离实现伸缩
- 纵向分离(分层后分离)
- 横向分离(业务分割后分离)
- 单一功能通过集群实现伸缩
应用服务器集群伸缩设计
- http重定向负载均衡:简单,但是浏览器需要两次请求服务器。
- Dns域名解析负载均衡:省掉了管理运维负载均衡服务器的麻烦,能支持基于地理位置的域名解析加速访问;但是生效时间较长,以及无法做更多改善和更强大的管理。
- 反向代理负载均衡:发生在http协议层,也叫应用层负载均衡。
- ip负载均衡:发生在网络层,修改请求目标地址进行负载均衡。
- 数据链路层负载均衡:发生在通信协议的数据链路层,通过修改mac地址进行负载均衡。广泛使用的一种方式,比如:LVS(Linux Virtual Server)
- 负载均衡算法
- 轮询
- 加权轮询
- 随机
- 最少链接
- 源地址散列
分布式缓存集群的伸缩性设计
- Memcached分布式缓存集群的访问模型
- Memcached分布式缓存集群的伸缩性挑战
- 分布式缓存的一致性hash算法
数据存储服务器集群的伸缩性设计
- 关系数据库集群的伸缩性设计:从业务上回避分布式关系型数据库的各种缺点:避免事务或利用事务补偿机制代替数据库事务;避免JOIN操作等。
- Nosql数据库的伸缩性设计
随机应变:网站的可扩展性架构
构建可扩展性的网站架构
软件架构师的最大价值不在于掌握多少先进的技术,而在于具有将一个大系统切分层N个低耦合的子模块的能力,这些子模块包含横向的业务模块,也包含纵向的基础技术模块。
利用分布式消息队列降低系统耦合性
- 事件驱动架构
- 分布式消息队列
利用分布式服务打造可复用的业务平台
- web service与企业级分布式服务:缺点有臃肿的注册和发现机制,抵消的XML序列化手段,开销相对较高的HTTP远程通信,复杂的部署与维护手段。
- 大型网站分布式服务的需求与特点
- 负载均衡
- 失效转移
- 高效的远程通信
- 整合异构系统
- 对应用最少侵入
- 版本控制
- 实时监控
- 分布式服务框架设计
可扩展的数据结构
利用NoSQL的ColumnFamily(列族)设计。
利用开放平台建设网站生态圈
- api接口
- 协议转移
- 安全
- 审计
- 路由
- 流程
固若金汤:网站的安全架构
道高一尺魔高一丈的网站应用攻击与防御
全球70%的web攻击来自XSS攻击和SQL注入。
- xss攻击
- 消毒:转移html字符
- httponly:避免攻击脚本窃取
- 注入攻击
- 开源
- 错误回显
- 盲注
- 消毒
- 参数绑定
- csrf攻击:防御的主要手段是识别访问者身份。
- 表单token
- 验证码
- referer check
- 其他攻击和漏洞
- error code
- html注释
- 文件上传
- 路径遍历
- web应用防火墙
- 网站安全漏洞扫描
信息加密技术及密钥安全管理
- 单向散列加密:MD5,SHA等
- 对称加密:DES,RC等
- 非对称加密:RSA等
- 密钥安全管理
信息过滤与反垃圾
- 文本匹配
- 正则表达式匹配:适用于敏感词较少
- Trie树、双数组Trie树:时间和空间复杂度都较好
- 多级hash表:速度较快,但浪费部分空间
- 分类算法:朴素贝叶斯算法。
- 黑名单:布隆过滤器。
电子商务风险控制
- 风险
- 账号风险
- 买家风险
- 卖家风险
- 交易风险
- 风控
- 规则引擎
- 统计模型
总结
大致总结了李智慧老师的《大型网站技术架构——核心原理与案例分析》一书中的部分知识点的原理部分, 又重新加深了架构演进的过程。建议还是需要购买原书看一看。