首页 › AI System Design › 第1章:从零到数百万用户的规模扩展

第1章:从零到数百万用户的规模扩展

简介​

将系统扩展至支持数百万用户是一项复杂而迭代的过程,需要不断优化与改进。本章将介绍如何从单服务器架构起步,逐步扩展系统架构,以从容应对数百万用户的访问需求。​

​

​

第1节:单服务器部署​

最初,所有组件(Web 应用、数据库、缓存)都运行在一台服务器上。​

​

飞书文档 - 图片

​

Request Flow​

用户通过域名(例如,api.mysite.com)访问应用程序,这些域名通过DNS解析为IP地址。​

Web服务器的IP地址被返回给浏览器或移动应用。​

HTTP请求被发送到Web服务器,后者返回HTML或JSON响应。​

Traffic Sources​

Web 应用程序:使用服务器端语言(如 Python、Java)实现业务逻辑,使用客户端语言(如 JavaScript、HTML)负责页面展示。​

移动应用:通过 HTTP 和 JSON 与 Web 服务器通信,实现轻量级的数据交换。​

​

​

第2节:数据库分离​

随着用户规模的扩大,数据库被迁移到专用服务器上,以便实现Web层与数据库层的独立扩展。​

​

飞书文档 - 图片

​

Database Choices​

关系型数据库(SQL):以表格形式存储结构化数据。示例:MySQL、PostgreSQL。​

非关系型数据库(NoSQL):适用于非结构化数据或低延迟需求。其分类包括:​

◦

键值存储​

◦

图数据库​

◦

列式存储​

•

如果满足以下条件,非关系型数据库可能是合适的选择:​

◦

应用程序需要极低的延迟。​

◦

数据是非结构化的,或者不存在关系型数据。​

◦

只需对数据进行序列化与反序列化(如 JSON、XML、YAML 等)。​

◦

需要存储海量数据。​

​

​

第3节:纵向扩展与横向扩展​

Vertical Scaling​

•

为现有服务器增加更多资源(CPU、内存)。​

•

受限于硬件条件,且缺乏冗余机制。​

Horizontal Scaling​

•

向集群中添加更多服务器,使其更适用于大规模系统。​

•

负载均衡器用于在服务器之间处理请求路由。​

​

​

第4节:负载均衡器​

​

​

A负载均衡器在多台服务器之间分发流量。其优势包括:​

冗余性:当某台服务器宕机时,流量将被重新路由。​

◦

如果服务器1宕机,所有流量都将被路由到服务器2。​

可扩展性:可轻松添加服务器以应对流量高峰。​

◦

如果网站流量迅速增长,可以随时增加服务器来承载额外的流量。​

​

​

第5节:数据库复制​

​

​

Master-Slave Model​

•

主数据库:负责处理写操作。​

◦

<b 所有修改数据的命令,如插入、删除或更新,都必须发送到主数据库。​

•

从库:承担读操作,提升性能与可靠性。​

◦

由于在大多数应用中,读操作的频率远高于写操作,因此一个系统中的从库数量通常多于主库数量。​

Benefits​

通过并行读取操作提升性能。​

通过冗余实现高可用性和数据可靠性。​

Failure Handling​

•

如果仅有一台从库且该从库发生宕机,读请求将暂时被转发至主库。​

•

如果存在多个从库,读操作将被重定向至其他健康的从库,同时由新服务器替换旧服务器。​

•

如果主数据库宕机,将把一台从属数据库提升为新的主数据库。​

•

在生产环境中,所选的从库可能并非最新状态,因此需要通过运行数据恢复脚本来更新数据(诸如多主架构和环形复制等方案则可提供帮助)。​

​

​

第6节:缓存​

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

​

​

Caching considerations​

用例:当数据读取频繁但修改较少时,可考虑使用缓存。​

过期策略:一旦缓存数据过期,就会从缓存中移除。如果没有设置过期策略,缓存数据将永久保留在内存中。​

一致性:这意味着要确保数据存储与缓存保持同步。由于对数据存储和缓存的数据修改操作并未置于同一事务中,因此可能会出现不一致的情况。​

故障缓解:单台缓存服务器可能成为潜在的单点故障,建议在不同数据中心部署多台缓存服务器,以避免单点故障。​

逐出策略:当缓存满时,需要逐出部分项以释放内存。LRU 是最常用的缓存逐出策略。​

​

​

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

​

​

ACDN通过将静态内容(图片、CSS、JavaScript)缓存在地理分布的服务器上,从而缩短了加载时间。​

Workflow​

用户从最近的CDN服务器请求内容。​

若不可用,则从源站获取内容并进行缓存。​

CDN considerations​

成本:CDN由第三方服务商运营,会对进出CDN的数据传输收取费用。​

缓存过期:缓存过期时间既不能太长,也不能太短。​

CDN回源:如果CDN出现临时故障,客户端应能及时发现并从源站请求资源。​

文件失效:如果文件被更新,缓存应被标记为失效,以指向更新后的文件。​

​

​

第8节:无状态Web层​

通过将会话数据移至共享存储,Web服务器便成为无状态的。这使得:​

更轻松的水平扩展。​

基于流量的自动伸缩。​

​

​

​

​

第9节:多数据中心架构​

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

地理DNS路由:将用户直接引导至最近的数据中心。​

数据复制:在各数据中心之间同步数据,以防止数据不一致。​

​

​

Key considerations​

•

流量重定向:需要有效的工具将流量引导至正确的数据中心。​

•

数据同步:一种常见的策略是在多个数据中心之间复制数据。​

•

测试与部署:自动化部署工具对于确保各数据中心的服务一致性至关重要。​

​

​

第10节:消息队列​

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

​

​

•

输入服务,也称为生产者/发布者,负责创建消息并将其发布到消息队列中。​

•

其他服务称为消费者/订阅者,它们连接到该队列,并根据消息中定义的逻辑执行相应操作。​

​

​

第11节:日志、指标与自动化​

​

​

Importance​

日志记录:用于跟踪错误和系统健康状况。​

指标监控:提供关于性能和用户活动的洞察。​

自动化:简化测试、部署与扩展流程。​

​

​

第12节:数据库扩展​

Vertical Scaling​

•

增加硬件资源,但存在物理与成本上的限制。​

•

存在诸多弊端:​

◦

单点故障风险更高。​

Horizontal Scaling (Sharding)​

​

​

•

使用键值将数据分散到多个分片中(例如,user_id).​

◦

分片技术将大型数据库拆分为更小、更易于管理的组成部分,称为分片。​

◦

每个分片共享相同的模式,但每个分片中的实际数据仅属于该分片。​

•

在实施分片策略时,分片键至关重要。选择分片键时,务必确保所选键能够实现数据的均匀分布。​

挑战​

重新分片数据:当出现以下情况时,需要进行重新分片:​

◦

由于数据快速增长,单个分片已无法容纳更多数据。​

名人问题:对某个特定分片的访问量过大可能导致服务器过载。​

◦

为了解决这个问题,我们可能需要为每位名人分配一个独立的分片。​

连接与反规范化:一旦数据库被分片并分布到多台服务器上,跨数据库分片执行连接操作便变得十分困难。​

◦

一种常见的解决方法是通过反规范化数据库,使查询能够在单个表中完成。​

​

​

结论​

Key Takeaways​

保持 Web 层无状态。​

在每一层都构建冗余。​

使用缓存和CDN优化性能。​

通过分片技术扩展数据层。​

解耦各组件以提升灵活性。​

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