第一章:从零到百万用户规模的扩展
2026/7/3 2:55:39 网站建设 项目流程

原文:https://github.com/liquidslr/system-design-notes/tree/main/01.%20Scaling

介绍

将系统扩展到支持数百万用户是一个复杂且迭代的过程,需要不断改进和优化。本章概述了如何从单服务器设置开始,逐步扩展架构以处理数百万用户。


第一部分:单服务器设置

最初,所有组件(Web应用程序、数据库、缓存)都在单个服务器上运行。

请求流程

  1. 用户通过域名(例如,api.mysite.com)访问应用程序,这些域名通过 DNS 解析为 IP 地址。
  2. 将网络服务器的 IP 地址返回给浏览器或移动应用程序。
  3. HTTP 请求被发送到 Web 服务器,服务器返回 HTML 或 JSON 响应。

流量来源

  1. Web 应用程序:使用服务器端语言(例如 Python、Java)实现业务逻辑,使用客户端语言(例如 JavaScript、HTML)实现展示。
  2. 移动应用程序:使用 HTTP 和 JSON 与 Web 服务器通信,实现轻量级数据交换。

第二部分:数据库分离

随着用户群的增长,数据库被迁移到专用服务器上,以便 Web 层和数据库层可以独立扩展。

数据库选择

  1. 关系型数据库(SQL):以表格形式存储的结构化数据。例如:MySQL、PostgreSQL。
  2. 非关系型数据库(NoSQL):适用于非结构化数据或低延迟要求。类别包括:
    • 键值存储
    • 图数据库
    • 列式存储
    • 文档存储
  • 如果满足以下条件,非关系型数据库可能是正确的选择:
    • 应用需要极低的延迟。
    • 数据是非结构化的,或者没有关系型数据。
    • 只需要序列化和反序列化数据(JSON、XML、YAML 等)。
    • 需要存储海量数据。

第三部分:垂直缩放与水平缩放

垂直缩放

  • 为现有服务器增加更多资源(CPU、RAM)。
  • 受硬件限制且缺乏冗余。

水平缩放

  • 向池中添加更多服务器,使其更适合大规模系统。
  • 负载均衡器用于处理服务器之间的请求路由。

第四部分:负载均衡器

负载均衡器将流量分配到多个服务器。其优点包括:

  1. 冗余机制:如果服务器离线,流量将被重新路由。
    • 如果服务器 1 离线,所有流量将路由到服务器 2。
  2. 可扩展性:可轻松添加服务器以应对流量高峰。
    • 如果网站流量快速增长,可以添加后续服务器来处理额外的流量。

第五节:数据库复制

主从模式

  • 主数据库:处理写入操作。
    • 所有数据修改命令,如插入、删除或更新,都必须发送到主数据库。
  • 从属数据库:处理读取操作,提高性能和可靠性。
    • 由于大多数应用程序中读取操作与写入操作的比例较高,因此,系统中从数据库的数量通常大于主数据库的数量。

好处

  1. 通过并行读取操作提升性能。
  2. 通过冗余实现高可用性和数据可靠性。

故障处理

  • 如果只有一个从数据库可用,并且该从数据库离线,则读取操作将暂时定向到主数据库。
  • 如果有多个从属数据库可用,则读取操作将重定向到其他健康的从属数据库,并且新服务器将替换旧服务器。
  • 如果主数据库离线,则会从数据库升级为新的主数据库。
  • 在生产系统中,所选的从数据库可能不是最新的,因此需要通过运行数据恢复脚本来更新数据(多主和循环复制等方法可能会有所帮助)。

第六节:缓存

缓存将频繁访问的数据存储在内存中,以减轻数据库负载。缓存层是一个临时数据存储层,速度远快于数据库。

缓存注意事项

  1. 使用场景:当数据读取频繁但修改频率较低时,可以考虑使用缓存。
  2. 过期策略:缓存数据过期后,将从缓存中移除。如果没有设置过期策略,缓存数据将永久存储在内存中。
  3. 一致性:这意味着保持数据存储和缓存同步。不一致的情况可能发生,是因为对数据存储和缓存的数据修改操作没有在同一个事务中进行。
  4. 缓解故障:单个缓存服务器可能存在单点故障,建议在不同的数据中心部署多个缓存服务器以避免单点故障。
  5. 缓存驱逐策略:当缓存已满时,需要驱逐缓存项以释放内存。LRU(最近最少使用)是最常用的缓存驱逐策略。

第七节:内容分发网络(CDN)

CDN通过在地理位置分散的服务器上缓存静态内容(图像、CSS、JavaScript)来提高加载速度

工作流程

  1. 用户向最近的 CDN 服务器请求内容。
  2. 如果内容不可用,则会从源服务器获取内容并进行缓存。

CDN 注意事项

  1. 成本:CDN 由第三方提供商运营,他们会对进出 CDN 的数据传输收取费用。
  2. 缓存过期时间:缓存过期时间既不能太长也不能太短。
  3. CDN 回退:如果 CDN 出现暂时性故障,客户端应该能够检测到问题并从源服务器请求资源。
  4. 文件失效:如果文件已更新,则应使缓存失效,以指向已更新的文件。

第 8 节:无状态 Web 层

通过将会话数据迁移到共享数据存储区,Web 服务器变为无状态服务器。这使得:

  1. 更易于水平缩放。
  2. 根据流量自动扩缩容。


第 9 节:多数据中心部署

跨多个数据中心部署可以提高可用性并降低延迟。相关策略包括:

  1. GeoDNS路由:将用户定向到最近的数据中心。
  2. 数据复制:跨中心同步数据,防止数据不一致。

关键考虑因素

  • 流量重定向:需要有效的工具将流量引导至正确的数据中心。
  • 数据同步:一种常见的策略是将数据复制到多个数据中心。
  • 测试和部署:自动化部署工具对于保持所有数据中心服务的一致性至关重要。

第 10 节:消息队列

消息队列是一个持久化组件,存储在内存中,支持异步通信。它充当缓冲区,分发异步请求。

  • 输入服务(称为生产者/发布者)创建消息,并将其发布到消息队列。
  • 其他被称为消费者/订阅者的服务连接到队列,并执行消息定义的操作。

第 11 节:日志记录、指标和自动化

重要性

  1. 日志记录:跟踪错误和系统运行状况。
  2. 指标:提供有关性能和用户活动的见解。
  3. 自动化:简化测试、部署和扩展流程。

第 12 节:数据库扩展

垂直缩放

  • 增加了硬件资源,但存在物理和成本方面的限制。
  • 存在多项缺点:
    • 单点故障风险更大。
    • 垂直扩展的总体成本很高。

水平扩展(分片)

  • 使用键(例如user_id)将数据分散到多个分片中。
    • 分片将大型数据库分割成更小、更易于管理的部分,称为分片。
    • 每个分片共享相同的模式,但每个分片上的实际数据都是该分片独有的。
  • 分片键在实施分片策略时至关重要。选择分片键时,务必选择能够均匀分布数据的键。
挑战
  1. 数据重新分片:当出现以下情况时需要进行数据重新分片:

    • 由于增长迅速,单个分片已无法容纳更多数据。
    • 由于数据分布不均,某些分片可能会比其他分片更快地耗尽资源。
    • 一致性哈希用于克服这些问题。
  2. 名人问题:对特定分片的过度访问可能导致服务器过载。

    • 为了解决这个问题,我们可能需要为每位名人分配一个分片。
  3. 连接与反规范化:一旦数据库被分片到多个服务器上,就很难跨数据库分片执行连接操作。

    • 常见的解决方法是对数据库进行反规范化,以便在单个表中执行查询。

结论

要点总结

  1. 保持 Web 层无状态。
  2. 在每一层都建立冗余机制。
  3. 使用缓存和 CDN 来优化性能。
  4. 利用分片技术扩展数据层。
  5. 为了提高灵活性,需要将各个组件解耦。

本章为构建能够处理数百万用户的可扩展系统奠定了坚实的基础。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询