泛而不深。

  1. 概述

    1. 大型网站
      1. 挑战
        1. 高可用
        2. 高性能:高并发、异构运营商网络
        3. 高可扩展:需求变更频繁,渐进式发展
        4. 高安全性
        5. 海量数据
      2. 发展历程
        1. 单机
        2. 应用与DB分离
        3. +缓存集群
        4. 应用层:单机->分布式
        5. DB读写分离
        6. CDN、反向代理从前端基于缓存提速
        7. DB、文件系统:单机->分布式
        8. 检索:NoSQL、搜索引擎
        9. 纵向拆分:业务拆分
        10. 横向拆分:分布式服务
    2. 架构模式(一些常见概念)
      1. 分层(横向)
      2. 分割(纵向)
      3. 分布式:提升性能或可用性,但引入更高的复杂度:CAP问题
        1. 分布式静态资源:CDN……
        2. 分布式服务
        3. 分布式存储:NoSQL……
        4. 分布式计算
      4. 集群:可伸缩、负载均衡……
      5. 缓存:CDN、反向代理、本地/分布式
      6. 异步:消息队列
      7. 冗余:冷/热备份
      8. 自动化:代码管理/测试/安全检测/部署/发布
      9. 安全:通信加密、密码、验证码、XSS/SQL注入等攻击防范、过滤垃圾/敏感信息、风险控制
      10. 例:新浪微博
        1. 基础服务(存储/缓存/检索……)+平台服务(通用业务)+业务层/API
        2. 早期MPSS:单机多端口(单机部署同服务多实例)
    3. 架构要素 性能/可用性/伸缩性/扩展性/安全性(更详细的见这里
  2. 架构

    1. 性能
      1. 指标
        1. 响应时间:avg/.99/max……
        2. 并发数:并发用户数
        3. 吞吐:QPS/TPS(Transaction)/HPS(Http)……
        4. 性能计数器:load/CPU/MEM/磁盘网络IO/线程数/对象数……
      2. 性能测试
        1. 目标
          1. 负载测试:吞吐到达顶峰时的压力
          2. 压力测试:系统崩溃时的压力
          3. 稳定性测试:长时间打压
        2. 测试报告
          1. 并发数/TPS(QPS)/时间/正确率(错误率)/load/内存……
      3. 性能优化
        1. 性能分析
          1. 由整体到局部定位问题
          2. 排查原因
        2. 性能优化
          1. Web前端性能优化
          2. 应用服务器性能优化
          3. 存储性能优化
    2. 可用性
      1. 度量
        1. .99:基本可用,年不可用88小时,twitter
        2. .999:较高可用,年不可用9小时
        3. .9999:高可用,年不可用53分钟,QQ
        4. .99999:极高可用,年不可用5分钟
        5. 解决方案
        6. 应用/业务逻辑层
          1. 无状态服务+负载均衡+失效转移
          2. session复制、session服务器
        7. 服务层
          1. 分级管理、超时设置、异步调用、服务降级、幂等性服务
        8. 数据层
          1. 数据备份
          2. 失效转移
        9. 质量保证
          1. 网站发布:飞行中的飞机换引擎,逐步替换
          2. Web自动化测试:运行在浏览器中的Selenium
          3. 预发布验证
          4. 代码管理
          5. 自动化发布
          6. 灰度发布
        10. 监控:不允许没有监控的系统上线
          1. 数据采集
    3. 可伸缩性
      1. 网站的伸缩
        1. 从现有服务中分离出新服务
          1. 纵向:分层后分离:数据库、缓存、平台服务……
          2. 横向:不同业务模块分离部署
        2. 单点 -> 集群
      2. 服务器集群的伸缩
        1. 负载均衡方法
          1. HTTP重定向
          2. DNS:多个A记录
          3. 应用层负载均衡: 反向代理,效率低
          4. IP层负载均衡:负载均衡服务器的内核进程修改目标IP,自身充当代理,因此压力也很大
          5. 数据链路层负载均衡:虚拟IP+修改MAC地址,响应不经过负载均衡服务器。此方案最常用,例如:开源的LVS (Linux Virtual Server)
        2. 负载均衡算法
          1. 轮询 (Round Robin)
          2. 加权轮询 (Weighted Round Robin)
          3. 随机 (Random)
          4. 最少连接 (Least Connections)
          5. 源地址散列 (Souce Hashing):例如对IP进行HASH
      3. 缓存集群的伸缩
        1. 余数HASH问题:增加1个节点命中率变为N/N(N+1)=1/(N+1)
        2. 一致性HASH
      4. 存储集群的伸缩
        1. 关系数据库:主从+分库,例如Amoeba、Cobar
          1. 无状态的broker集群
          2. 伸缩时迁移数据:遍历Key迁移,或以schema为单位迁移+MySQL同步机制
          3. 避免跨库的JOIN和事务
        2. NoSQL
    4. 可扩展性
      1. 低耦合:架构师的价值不在于掌握多少先进的技术,而在于将系统切分成若干低耦合的子系统/模块的能力
      2. 分布式消息队列
        1. 事件驱动架构:发布-订阅
        2. 复杂的:支持ESB、SOA……,简单的:基于MySQL……
      3. 实现可复用的业务平台
        1. “巨无霸系统”:编译部署困难、代码分支管理困难、数据库连接耗尽、新增业务困难……
        2. 拆:横向+纵向 -> 分布式服务框架:
          1. 功能:负载均衡、失效转移、高性能RPC、整合异构系统、对应用最少侵入、服务版本管理、监控
          2. 实现:FB的Thrift、淘宝的Dubbo
      4. 开放平台:API、协议转换、安全、审计路由……
    5. 安全性
      1. 常见攻击
        1. XSS (Cross Site Script)
        2. 注入攻击:SQL、OS
        3. CSRF (Cross Site Request Forgery):以用户身份跨站请求,解决:表单token、验证 码、referer检查
      2. 防御
        1. Web应用防火墙:开源的ModSecurity
        2. 安全漏洞扫描