大型网站技术架构读书笔记

Jul 10, 2016·
Shenghui (Samuel) Gu
Shenghui (Samuel) Gu
· 4 min read

本文为《大型网站技术架构:核心原理与案例分析》的读书笔记。

大型网站架构模式

  • 分层:分层业务
  • 分割:同层业务进行分割,如购物、论坛、搜索、广告
  • 分布式
    • 分布式应用和服务
    • 分布式静态资源
    • 分布式数据和存储
    • 分布式计算
  • 集群
  • 缓存
    • CDN
    • 反向代理
    • 本地缓存
    • 分布式缓存
  • 异步
  • 冗余
  • 自动化
  • 安全

大型网站核心架构要素

性能、可用性、伸缩性、扩展性和安全性

网站的高性能架构

Web 前端性能优化

  • 浏览器访问优化
    • 减少 http 请求
    • 使用浏览器缓存
    • 启用压缩
    • CSS 放在页面最上面,JavaScript 放在页面最下面
    • 减少 Cookie 传输
  • CDN 加速
  • 反向代理

应用服务器性能优化

  • 分布式缓存
    • 频繁修改的数据:不要缓存频繁修改的数据。
    • 没有热点的访问:大部分数据访问应该集中在小部分数据。
    • 数据不一致与脏读:容忍数据的不一致。
    • 缓存可用性:分布式缓存服务器集群。
    • 缓存预热:在缓存系统启动时就把数据加载好。
    • 缓存穿透:将不存在的数据也缓存(value 值为 null)。
  • 异步操作
  • 使用集群
  • 代码优化
    • 多线程
    • 资源复用:单例和对象池
    • 数据结构
    • 垃圾回收

存储性能优化

  • 机械硬盘 vs. 固态硬盘
  • B+树 vs. LSM 树
  • RAID vs. HDFS

网站的高可用架构

高可用的应用

  • 通过负载均衡进行无状态服务的失效转移
  • 应用服务器集群的 Session 管理
    • Session 复制:适用小型网站。
    • Session 绑定:将同一 IP 的请求分发到同一台服务器。极少使用。
    • 利用 Cookie 记录 Session:将 Session 记录在客户端,每次请求就发送到服务器。
    • 服务器处理后将修改的 Session 响应给客户端。
    • Session 服务器

高可用的服务

  • 分级管理:服务优先级
  • 超时设置
  • 异步调用:消息队列
  • 服务降级
    • 拒绝服务:拒绝低优先级应用的调用。
    • 关闭功能:关闭部分不重要的服务,或者服务内部关闭部分不重要的功能。
  • 幂等性设计:在服务层保证服务重复调用和调用一次产生的结果相同。

高可用的数据

  • CAP 原理
    • 数据一致性 Consistency
      • 数据强一致性:各个副本总是一致。
      • 数据用户一致:各个副本可能不一致,通过纠错和校验机制确定一个一致的数据给用户。
      • 数据最终一致:一段时间后一致。
    • 数据可用性 Availability
    • 分区耐受性 Partition Tolerance
  • 数据备份
    • 冷备份:物理存储,无法保证数据最终一致性。
    • 热备份:异步热备份和同步热备份。
  • 失效转移
    • 失效确认:心跳检测和应用程序访问失败报告。
    • 访问转移
    • 数据恢复

软件质量保障

  • 网站发布
  • 自动化测试
  • 预发布验证
  • 代码控制:版本控制
  • 自动化发布
  • 灰度发布:部分发布

网站运行监控

  • 监控数据采集
    • 用户行为日志收集
      • 服务器端日志收集
      • 客户端浏览器日志收集
    • 服务器性能监控
    • 运行数据报告
  • 监控管理
    • 系统报警
    • 失效转移
    • 自动优雅降级

网站的伸缩性架构

网站架构的伸缩性设计

  • 不同功能进行物理分离实现伸缩
  • 单一功能通过集群规模实现伸缩

应用服务器集群的伸缩性设计

  • HTTP 重定向负载均衡:根据用户的 HTTP 请求计算真实的服务器地址,并写入 HTTP 重定向响应中返回。

    优点是简单。 缺点是两次请求,性能差; 重定向服务器可能成为瓶颈,集群伸缩性规模有限; HTTP302 响应码重定向可能使搜索引擎判断为 SEO 作弊,降低排名。 因此不多见。

  • DNS 域名解析负载均衡:在 DNS 中映射多个 IP,根据算法返回 IP 地址。

    大型网站总是部分使用 DNS 域名解析,作为第一级的负载均衡手段,得到的服务器同样也是负载均衡的内部服务器,最后将请求分发到真实的服务器上。

  • 反向代理负载均衡:优点是负载均衡和反向代理集成在一起,部署简单。缺点是可能成为瓶颈。

  • IP 负载均衡:将用户请求的目的地址修改为真实服务器地址,并接收响应,最后修改源地址返回给用户。

  • 数据链路层负载均衡:将真实服务器设置和负载均衡服务器相同的虚拟 IP,把用户请求的 mac 地址修改为真实服务器,服务器直接响应到用户。

  • 负载均衡算法

    • 轮询(Round Robin, RR)
    • 加权轮询(Weighted Round Robin, WRR)
    • 随机(Random):也可以用加权随机算法。
    • 最少连接(Least Connections):分发到连接最少的服务器上。
    • 源地址散列(Source Hashing):把 IP 地址进行 Hash 计算。

数据存储服务器集群的伸缩性设计

  • 关系数据库集群:主从读写分离、分库(业务分割)、分片(将一张表拆分)。
  • NoSQL 数据库:Apache HBase