架构常用技术

  1. 分布式缓存
  2. 负载均衡
  3. 消息队列
  4. 分布式服务

网站架构考虑的点

  1. 高可用
  2. 高性能
  3. 可扩展
  4. 伸缩性
  5. 安全性

架构上的问题

  1. 如何实现秒杀系统,如何处理高并发冲击的问题?
  2. 订单系统在高峰期如何处理订单队列?
  3. 通过缓存手段,设计数据库伸缩性架构?

大型网站特点

  1. 高并发、大流量
  2. 高可用
  3. 海量数据
  4. 用户分布广泛, 网络情况复杂
  5. 安全性
  6. 需求快速变更,发布频繁
  7. 渐进式发展

解决网站性能和可用性问题的手段

  1. 数据库与应用程序分离
  2. 使用缓存改善网站性能:
    1. 服务器上的本地缓存
    2. 分布式缓存服务器上的远程缓存
  3. 使用应用服务器集群改善网站的并发处理能力:新增机器, 通过nginx实现负载均衡,提高系统的可伸缩性。
  4. 数据库读写分离:数据库的主从热备,配置两台数据库的主从关系,将一台数据服务器的数据同步到另一台服务器上。(写主库、读从库)
  5. 使用反向代理和CDN加速网站响应。
    • 基本原理: 使用缓存

    • 区别:

      1. CDN缓存部署在网络运营商机房。(而CDN分发解决方案解决了与静态网站相关的性能和可靠性问题)
      2. 反向代理部署在网站的中心机房(也缓存静态资源)。
      • 前向代理(client端代理)和反向代理的区别(svrver端代理)
    • 请求流程: CDN机房 -> 反向代理服务器 -> 网站资源

  6. 使用分布式文件系统、分布式数据库系统(数据库拆分的最后手段)。更常用的手段是业务分库。
  7. 使用NoSql(非关系型数据库)和搜索引擎。
  8. 业务拆分。
  9. 分布式服务

大型网站系统-架构图

大型网站架构图

  1. 二八定律:80%的业务访问在20%的数据上。
  2. 网站技术是为业务而存在的。
  3. 技术解决不了所有问题,可能是业务架构造成的问题。 (e.g. 12306一开始的业务架构是整点放票,抢票时的大流量问题从技术上难以实现;后面改为分段售票,控制了并发访问的量,降低系统的资源成本和技术成本)
  4. 技术是用来解决业务问题的。业务问题也可以通过业务的手段去解决。

大型网站的架构模式

  1. 分层(应用层、服务层、数据层)

  2. 分布式(使用更多的计算机完成同样的功能)

    • 解决的问题: 高并发的问题
    • 带来的问题:
      1. 服务调用必须通过网络,可能会对性能造成影响
      2. 服务宕机的可能性大(部署在多台服务器上),降低服务的可用性
      3. 分布式环境 数据的一致性
      4. 网站依赖加大,维护成本增加
    • 分布式方案:
      1. 分布式应用和服务(解决性能和并发性问题),不同模块复用共同的服务,便于业务扩展。
      2. 分布式静态资源(前端资源,Js,CSS,Logo)
      3. 分布式数据和存储:以P为单位海量数据(NoSQl产品基本都是分布式)
      4. 分布式计算:搜索引擎的索引构建、数据仓库的数据分析统计(Hardoop、MapReduce),将程序分发到数据所在位置加速计算和分布式计算。
      5. 分布式配置:支持网站线上服务器配置实更新。
      6. 分布式锁: 分布式环境下实现并发和协同
      7. 分布式文件: 支持云存储
  3. 集群: 提高系统的高可用(考虑负载均衡)

  4. 缓存:改善软件性能的第一手段

    1. 缓存设计:
      1. CDN
      2. 反向代理
      3. 本地缓存
      4. 分布式缓存
    2. 缓存的前提条件:
      1. 热点数据访问不均匀,热点数据存放在缓存中, 减少数据请求压力
      2. 某段时间内有效, 不会很快过期, 否则缓存的数据会因为失效产生脏读。
    3. 缓存的意义:
      1. 加快数据的访问速度
      2. 减少后端应用和数据存储的负载压力
  5. 异步

    1. 意义: 降低系统软件的耦合性
    2. 方法: 业务之间的消息传递不是同步调用的,而是将一个业务操作分成多个阶段,每个阶段通过共享数据的方式异步执行。
    3. 异步手段:
      1. 多线程共享内容队列(单机器)
      2. 分布式消息队列 -> 内存队列的分布式部署
    4. 特性:
      1. 典型的生产者/消费者模式,两者不存在直接调用的关系,功能随意变化对系统无影响(高扩展性)
      2. 提高系统可用性:消费者服务器出现故障,数据会在消息队列服务器堆积。生产者服务器可以继续处理业务请求,系统整体表现无故障。消费者服务器恢复正常后, 继续处理消息队列中的数据。
      3. 加快网站响应速度:不需要等待消费者服务器处理完业务请求后就直接返回,响应延迟减少。
      4. 消除并发访问高峰: 不会对整个网站造成过大的负载压力。
    5. 注意的问题:
      1. 异步处理业务可能会对用户体验、业务流程造成影响。
  6. 冗余

    1. 意义:保证服务器宕机的情况下网站能正常继续服务。
    2. 手段:
      1. 服务器冗余运行,数据冗余备份,服务宕机的情况下可以将服务和数据转移到其他机器。
      2. 服务必须部署至少两台机器构成一个集群 -> 冗余实现服务高可用。数据定期备份:
        1. 冷备份 (全量备份)
        2. 热备份(实时备份)
      3. 部署数据灾备中心。
  7. 自动化(集中在发布运维上)

    1. 自动化代码管理
    2. 自动化测试
    3. 自动化安全测试
    4. 自动化部署
    5. 自动化监控
    6. 自动化报警
    7. 自动化失效转移
    8. 自动化失效恢复
    9. 自动化降级
    10. 自动化分配资源

大型网站核心架构要素

  • 定义:软件架构,有关软件整体架构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
  • 目标
    1. 性能
    2. 可用性
    3. 伸缩性
    4. 扩展性(主要手段):
      • 事件驱动架构

      • 分布式服务

    5. 安全性

网站系统架构层次

Web System Architecture Level.jpeg

前端架构

  1. 浏览器优化技术

    1. 页面缓存
    2. 合并HTTP减少请求次数
    3. 使用页面压缩
  2. CDN: 内容分发网络,部署在网络运营商机房

  3. 动静分离,静态资源独立部署

  4. 图片服务

  5. 反向代理, 在应用服务器、静态资源服务器、图片服务器之前,提供页面缓存服务。

  6. DNS

应用层架构

  1. 开发架构
  2. 页面渲染
  3. 负载均衡
  4. Session管理:为了高可用,应用服务器一般设计为无状态,不保存用户请求的上下文。为了保存用户的session信息:
    1. 专门的机制管理Session
    2. 跨集群间Session的同步(共享)
  5. 动态页面静态化
  6. 业务拆分(1. 降低系统耦合度;2. 数据库业务分库 -> 效果相对较好)
  7. 虚拟化服务器:对于并发访问较低的业务,更容易用较少的资源构建高可用的应用服务集群。

服务层架构