系统扩展
学习如何扩展后端系统,以应对流量、数据和复杂性的增长。
为什么系统需要扩展
随着应用不断增长,用户、请求和数据的增加最终会让单台服务器不堪重负,因此系统需要扩展。
- 更多用户会产生更多并发请求,从而增加系统负载。
- 不断增长的数据量会减慢处理和存储操作。
- 在持续需求下,单台服务器会成为性能瓶颈。
详情
所有系统一开始都很简单,通常运行在一台机器上。在低规模下,这种方式运行良好,因为服务器可以处理传入请求、执行业务逻辑并管理数据,而不会承受明显压力。
随着应用增长,需求也会增加。更多用户意味着更多同时发起的请求,这会给 CPU、内存和网络资源带来压力。
数据增长又增加了一层负担。更大的数据集需要更多存储空间,并且会让查询变慢,从而进一步增加响应时间。
最终,系统会达到单台机器无法继续跟上的程度。为了保持性能、防止变慢,并确保系统在不断增加的负载下仍能可靠运行,就必须进行扩展。
垂直扩展
垂直扩展通过增加更多资源,如 CPU、内存和存储,来提升单台机器的容量。
- 升级硬件可以让单台服务器处理更多负载。
- 无需管理多台机器或分布式协调。
- 扩展受硬件限制和成本上升的约束。
详情
垂直扩展,也称为 scale up,是通过升级单台服务器来提升系统容量。这通常包括增加更多 CPU 核心、提升 RAM,或扩展存储。
这种方式很直接。系统架构保持不变,也不需要引入网络通信或数据同步等分布式系统复杂性。
不过,垂直扩展有明确的上限。物理机器只能升级到一定程度,而且高端硬件的成本会越来越高。
因此,垂直扩展在早期阶段效果很好,但最终对于大规模系统来说会变得不够用。
水平扩展
水平扩展通过增加更多服务器并在它们之间分配工作负载来提升系统容量。
- 工作负载分布在多台机器上,而不是一台。
- 通过横向扩展,系统可以处理显著更高的流量。
- 一台服务器故障不会导致整个系统宕机。
详情
水平扩展,也称为横向扩展,通过增加更多服务器而不是升级单台服务器来提升系统容量。每台服务器处理总工作负载的一部分。
传入流量会分布到这些服务器上,使系统相比单机架构能够并行处理更多请求。
这种方法也提高了可靠性。如果一台服务器故障,其他服务器仍可继续处理请求,从而降低故障影响。
不过,水平扩展会引入分布式系统的复杂性,需要协调、负载均衡和数据一致性机制。
负载均衡
负载均衡器会将传入请求分发到多个服务器,以提升性能和可靠性。
- 请求会分布到多台服务器上,以防止单台机器过载。
- 不健康的服务器会被检测出来,并从流量路由中移除。
- 通过避免单点故障,系统可靠性得到提升。
详情
随着系统进行水平扩展,传入流量必须分发到多台服务器上。负载均衡器位于这些服务器前面,并作为所有请求的入口点。
负载均衡器不会把所有流量都发送到一台机器,而是使用轮询(round-robin)或最少连接(least connections)等算法来均匀分配请求。这样可以防止任何单台服务器成为瓶颈。
负载均衡器还会持续检查服务器的健康状态。如果某台服务器变慢、崩溃,或者未通过健康检查,它会被自动从池中移除,这样用户就不会被路由到损坏的实例。
此外,负载均衡器还可以处理 SSL 终止、基于路径的请求路由以及流量整形等任务。Nginx、HAProxy 以及云托管负载均衡器等工具被广泛用于在现代系统中实现这一层。
负载均衡策略
不同的负载均衡策略决定流量如何分配,直接影响性能、公平性和系统稳定性。
- 轮询会均匀分配请求,但不会考虑服务器负载。
- 最少连接会将流量发送到当前最空闲的服务器。
- 粘性会话会在需要时让用户始终连接到同一台服务器。
详情
负载均衡器不仅仅是一个流量分配器——它如何分配流量很重要。
最简单的策略是轮询,即每个请求按顺序发送到下一台服务器。当服务器完全相同时,这种方式有效,但当工作负载不同的时候就会失效。
最少连接通过将流量路由到当前处理活动请求最少的服务器来改进这一点,从而减少过载并提升响应时间。
粘性会话会让用户始终绑定到同一台服务器。当会话数据存储在本地时,这很有帮助,但会降低灵活性,并可能造成负载不均。
现代系统会将策略与健康检查和权重结合使用。性能更强的服务器可以承载更多流量,而出现故障的服务器会被自动移除。
如果策略选择不当,即使有负载均衡器,也会导致负载不均、延迟更高以及基础设施浪费。
无状态服务器
无状态服务器不会在本地存储特定于客户端的数据,因此任何服务器都可以处理任何请求。
- 服务器不会在请求之间保留会话数据。
- 状态存储在外部的数据库、缓存或会话存储中。
- 请求可以路由到任何服务器,而不依赖之前的交互。
详情
在无状态系统中,每个请求都是独立的。服务器不会在本地内存中存储关于之前请求或用户会话的信息。
相反,任何所需的状态——例如用户会话或身份验证数据——都存储在外部系统中,如数据库、缓存或专用会话存储。
这种设计使水平扩展更容易。由于没有服务器持有唯一的会话数据,请求可以路由到任何可用的服务器,而无需担心之前的请求是由哪台服务器处理的。
无状态架构还提高了可靠性和灵活性,因为可以在不影响用户交互的情况下添加、移除或替换服务器。
自动扩缩容
自动扩缩容会根据流量动态调整服务器数量,以保持性能和效率。
- 当流量增加时,系统会自动添加服务器。
- 当需求减少时,会移除服务器以降低资源使用。
- 扩缩容决策基于 CPU 使用率或请求速率等指标。
详情
真实系统中的流量并不是恒定的。使用量可能会在高峰时段激增,并在非高峰时段下降,这会让固定基础设施变得低效。
自动扩缩容通过自动调整系统容量来解决这个问题。当流量增加时,会添加新的服务器来处理负载。当流量减少时,会移除未使用的服务器。
这个过程通常由 CPU 利用率、内存使用量或请求速率等指标驱动。系统会定义阈值,以便能够快速响应需求变化。
自动扩缩容同时提升性能和成本效率。系统可以在无需人工干预的情况下应对突发流量高峰,同时避免在低使用率期间产生不必要的基础设施成本。
内容分发网络(CDN)
CDN 会将内容缓存到更靠近用户的位置,以降低延迟并分担应用服务器的流量。
- 静态内容会缓存在靠近用户的边缘服务器上。
- 请求会由最近的位置响应,而不是由源服务器响应。
- 这可以降低延迟,并减少后端基础设施的负载。
详情
当用户访问应用时,数据通常会从一个中心服务器传输,而这个服务器在地理位置上可能相距很远。这个距离会带来延迟,并减慢响应时间。
CDN 通过将静态内容——例如图片、脚本和样式表——缓存到分布在全球各地的边缘服务器上来解决这个问题。当用户发起请求时,内容会从最近的边缘位置提供。
这会显著缩短数据传输距离,从而带来更快的加载时间和更好的用户体验。
CDN 还通过处理大量流量来减轻源服务器的负载。像 Cloudflare、AWS CloudFront 和 Fastly 这样的服务,通常用于在可扩展系统中实现这一层。
可扩展系统架构
可扩展系统构建为分层架构,其中每个组件负责处理工作负载的特定部分。
- 流量通过多个层级,每一层都旨在高效处理规模扩展。
- 负载分布在应用服务器和数据库之间。
- 每一层都可以根据系统需求独立扩展。
详情
可扩展系统不是单个组件,而是多个层协同工作以处理不断增长的需求。每一层都负责请求流程中的特定功能。
用户首先与 CDN 交互,CDN 提供缓存内容并降低延迟。需要动态处理的请求会转发到负载均衡器。
负载均衡器将流量分配到多个应用服务器,使系统能够并行处理大量请求。
应用服务器与分布式数据库交互,其中数据会被分片或复制,以处理大规模数据集和高查询量。
这种分层方法使系统的每个部分都可以独立扩展,从而能够在不重新设计整个系统的情况下应对用户、流量和数据的增长。
问题部分
1 / 5
此课程属于高级内容
升级到高级版以去除模糊效果并解锁完整内容。