你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

用于优化缩放和分区的体系结构策略

适用于此 Azure Well-Architected 框架性能效率清单建议:

PE:05 优化缩放和分区。 合并可靠且受控的缩放和分区。 工作负荷的缩放单元设计是缩放和分区策略的基础。

本指南介绍了缩放和分区工作负荷的建议。 缩放是能够按需增加或减少分配给工作负荷的资源。 分区涉及将工作负荷划分为更小的可管理单元,以便跨多个资源分配数据和处理。 不缩放或分区的工作负荷在高需求周期和低需求周期中未充分利用的容量可能会遇到性能不佳的问题。

定义

术语 Definition
自动缩放 一项功能,可根据预定义的配置自动调整服务的容量限制,从而根据需要进行纵向扩展或缩减。
Capacity 给定服务或功能的上限或最大容量。
客户端相关性(会话相关性) 有意将请求从单个客户端路由到单个服务器实例,以帮助确保会话管理一致。
一致性(分布式数据库) 分布式数据库中多个节点的数据的统一性,确保所有副本在给定的时间点具有相同的数据。
一致性(关系数据库) 将数据库从一个有效状态引入另一个状态的事务的属性,从而维护数据完整性。
一致性级别 一种配置,用于定义如何在分布式数据库系统中复制数据以及何时复制数据,从而确定一致性和性能之间的权衡。
数据锁定 用于防止同时更新相同数据的机制。
水平扩展 一种缩放方法,用于添加给定类型的资源实例。
乐观并发 更新使用快照进行更新的数据库的方法,而不是传统的锁定机制。
Partitioning 以物理方式将数据划分为单独的数据存储的过程。
可伸缩性 工作负荷动态更改其容量限制以适应不同需求级别的能力。
尺度单位 一组按比例缩放的资源。
状态相关性 在单个服务器上存储客户端会话数据,以便同一服务器处理来自同一客户端的后续请求。
纵向缩放 向现有资源添加计算容量的缩放方法。

缩放和分区都有助于提高性能效率,方法是确保有效使用资源,工作负荷可以处理不同的负载。 这些做法在云环境中尤其重要,在这些环境中,应用程序需要灵活且适应不断变化的需求。 缩放可确保可以扩展工作负荷容量以满足不断增长的需求。 通过分区,可以有效地划分任务或数据来处理这些不断增长的需求。 这两个进程的基础是工作负荷的缩放单元设计。 它决定了工作负荷应如何增长和分配任务。 通过整合一种可靠且受控的缩放和分区方法,可以避开潜在的工作负荷效率低下。

优化缩放

优化缩放是调整服务器、实例或资源数量以满足工作负荷波动需求的过程。 它可确保工作负荷可以处理增加的流量或需求,而不会遇到性能下降或停机的情况。

选择缩放策略

选择缩放策略涉及根据工作负荷的特定要求在垂直或水平方法之间进行决定,以增强工作负荷的容量。 选择正确的策略可确保有效地调整资源以满足工作负载需求,而无需过度使用或浪费。 若要选择正确的缩放策略,需要了解垂直和水平缩放的用例,以及它们如何满足工作负荷的需求。

了解垂直缩放。 使用垂直缩放可以增加单个资源的容量,例如升级到更大的服务器或实例大小。 当工作负荷可以从单个实例中的处理能力、内存或其他资源增加中获益时,垂直缩放非常有用。 垂直缩放适用于不容易划分为较小部分的工作负荷,或者当应用程序体系结构不支持水平缩放时。

了解水平缩放。 使用水平缩放,可以添加更多实例或资源,以便跨多个服务器分配工作负荷。 水平缩放提供了改进的复原能力、增加的容量以及处理流量或工作负荷需求增加等优势。 它适用于设计为在多个节点上运行的云原生应用程序。 水平缩放适用于可分为独立运行的较小部分的工作负荷。

了解工作负荷。 垂直或水平缩放的适用性取决于工作负荷的特定特征和要求。 以下方面的常规性能监视和测试可帮助优化随时间推移的缩放策略:

  • 要求:通过考虑资源需求、可伸缩性需求和工作负荷限制等因素来了解工作负荷的特定要求。

  • 缩放单元:为预期一起缩放的组件创建缩放单元设计。 例如,100 个虚拟机可能需要两个队列和三个存储帐户来处理额外的工作负荷。 缩放单元为 100 个虚拟机、两个队列和三个存储帐户。 应独立缩放遇到容量使用波动的所有组件。

  • 体系结构:评估应用程序体系结构的设计。 某些应用程序本质上可能设计为横向缩放,而无状态组件可以轻松分布在多个实例中。 其他应用程序可能具有使垂直缩放更合适的有状态组件或依赖项。 评估工作负荷的可伸缩性和弹性要求。

设计要缩放的基础结构

设计要缩放的基础结构是创建一个体系结构的过程,该体系结构可以通过根据需要添加或调整资源来处理不断增长的需求和工作负荷。 它涉及规划和实施可横向或垂直缩放以适应增长的解决方案。 策略包括避免单一实例,这些单一实例可能会成为瓶颈,并分离应用程序组件,以确保独立的可伸缩性。 将工作负荷设计为可缩放时,它可以有效地将工作负荷分配到多个资源,从而防止瓶颈并最大限度地利用资源。

避免单一实例。 应避免对整个工作负荷使用单个集中资源。 而是跨多个资源分配工作负荷,以提高可伸缩性、容错性和性能。 了解一些特定的示例和设计注意事项,以避免工作负荷资源中的单一实例:

  • 基于队列的负载调配:不依赖单个队列来处理消息,而是考虑将工作负荷分区到多个队列以分发处理负载。 它提供更好的可伸缩性和并行处理。

  • 数据处理:单一实例模式通常出现在数据处理方案中,处理不会扇出。将长时间运行的任务分解为较小的任务,这些任务可以更好地跨多个资源分配工作负荷,并利用并行度。

  • 设计模式:扇出/扇入或管道和筛选器等设计模式有助于避免工作流中的单一实例。 这些模式允许跨多个资源分布处理任务,并提升可伸缩性和灵活性。

分离组件。 分离应用程序组件是设计可伸缩性的重要方面。 它涉及到将应用程序分解为更小的独立组件,这些组件可以根据特定的工作负荷要求独立运行和缩放。 例如,如果一个组件由于需求增加而需要更多资源,则可以在不影响其他组件的情况下缩放该组件。 这种灵活性可确保高效的资源分配并防止瓶颈。 通过分离组件,可以隔离故障并最大程度地减少对整体应用程序的影响。 如果一个组件失败,其他组件可以继续独立运行。

分离的组件更易于维护和更新。 可以更改或更新一个组件,而不会影响其他组件,因为它们是独立的。 遵循以下准则将应用程序组件分离,实现可伸缩性:

  • 关注点分离:确定应用程序的责任和功能。 根据职责将职责划分为单独的组件,具体取决于其特定任务。 例如,可能有单独的组件用于用户身份验证、数据处理和 UI。

  • 松散耦合:设计组件以通过定义完善的接口和协议相互通信。 此设计减少了组件之间的依赖关系,并允许更轻松地替换或缩放单个组件。

  • 异步通信:使用异步通信模式(如消息队列或事件驱动的体系结构)进一步分离组件。 这些模式允许组件以自己的速度独立处理任务,从而提高整体可伸缩性。

  • 微服务:考虑实现微服务,这些微服务是专注于特定业务功能的小型独立服务。 可以独立开发、部署和缩放每个微服务,从而提供更大的灵活性和可伸缩性。

设计要缩放的应用程序

缩放工作负荷时,应将应用程序设计为分发负载。 仅仅因为可以在基础结构级别添加更多副本并不意味着应用程序可以使用副本。 设计要缩放的应用程序是构建应用程序,以便通过跨资源分配应用程序工作负载来处理增加的需求。 如果可能,请避免需要单个实例的客户端关联、数据锁定或状态相关性的解决方案。 你想要将客户端或进程路由到具有可用容量的资源。 若要设计应用程序可伸缩性,请考虑以下策略:

消除服务器端会话状态。 应尽可能将应用程序设计为无状态。 对于有状态应用程序,应使用服务器外部的状态存储。 外部化会话状态是将会话数据存储在应用程序服务器或容器之外的做法。 可以将会话状态外部化,以便在多个服务器或服务之间分配会话数据,从而在分布式环境中实现无缝会话管理。 在外部化会话状态时,请考虑以下事项:

  • 评估会话要求。 了解需要存储和管理的会话数据。 考虑会话属性、会话超时以及会话复制或持久性的任何特定要求。 确定会话状态的大小以及读取和写入作的频率。

  • 选择解决方案。 选择符合性能和可伸缩性需求的存储解决方案。 选项包括使用分布式缓存、数据库或会话状态服务。 在做出选择时,请考虑数据一致性、延迟和可伸缩性等因素。

  • 设置应用程序。 更新应用程序以使用所选会话状态存储解决方案。 可能需要更改应用程序的配置文件或代码以连接到外部存储服务。

  • 更新逻辑。 更改应用程序的会话管理逻辑,以存储和检索外部存储解决方案中的会话数据。 可能需要使用存储解决方案提供的 API 或库来管理会话状态。

消除客户端相关性。 客户端相关性也称为会话相关性或粘滞会话。 消除客户端相关性时,可以在多个副本或服务器之间均匀分配客户端请求,而不会将所有请求从客户端路由到同一副本。 此配置可以通过允许任何可用副本处理请求来提高应用程序的可伸缩性和性能。

查看负载均衡算法。 负载均衡算法可能会导致无意和人工客户端固定,其中将过多的请求发送到一个后端实例。 如果算法设置为始终将来自同一用户的请求发送到同一实例,则可能会进行固定。 如果请求彼此太相似,也可能发生这种情况。

消除数据锁定。 数据锁定可确保一致性,但性能有缺点。 这可能会导致锁升级,并对并发、延迟和可用性产生负面影响。 若要消除数据锁定,应实现 乐观并发。 非关系数据库应使用乐观并发 控制 并具有正确的 一致性级别。 数据分区策略还应支持并发需求。

使用动态服务发现。 动态服务发现是在分布式系统中自动检测和注册服务的过程。 它允许客户端发现可用的服务,而无需紧密耦合到特定实例。 客户端不应能够直接依赖工作负荷中的特定实例。 为了避免这些依赖项,应使用代理来分发和重新分发客户端连接。 代理充当客户端和服务之间的中介,提供一层抽象,允许添加或删除服务,而不会影响客户端。

使用后台任务。 缩放应用程序时,它可以处理不断增加的工作负荷或更多的并发请求。 卸载密集型任务作为后台任务可使主应用程序处理用户请求,而无需资源密集型作压倒用户请求。 按照以下步骤将任务卸载为后台任务:

  1. 在可以卸载的应用程序中查找 CPU 密集型和 I/O 密集型任务。 这些任务通常涉及大量计算或与外部资源(例如数据库或网络作)的交互。

  2. 设计应用程序以支持后台任务。 将密集型任务与主应用程序逻辑分离,并提供启动和管理后台任务的机制。

  3. 使用适当的技术或框架实现后台任务处理。 包括编程语言或平台提供的功能,例如异步编程、线程处理或任务队列。 在单独的任务或线程中包含密集型作,这些任务可以并发运行或计划在特定时间间隔运行。

  4. 如果其中有许多任务,或者任务需要大量时间或资源,则分发后台任务。 有关一种可能的解决方案,请参阅 竞争使用者模式

配置缩放

配置缩放是设置和调整参数以根据工作负荷需求动态分配资源的过程。 它包含使用自动缩放功能、了解服务缩放边界和实现有意义的负载指标等策略。 适当的配置可确保应用程序可以响应不同的需求,同时最大限度地提高效率。 配置缩放时,请考虑以下策略:

通过自动缩放使用服务。 自动缩放功能会自动缩放基础结构以满足需求。 使用具有内置自动缩放功能的平台即服务(PaaS)产品/服务。 PaaS 上的缩放性是一个主要优势。 例如,横向扩展虚拟机需要单独的负载均衡器、客户端请求处理和外部存储状态。 PaaS 产品/服务处理大部分任务。

约束自动缩放。 设置自动缩放限制以最大程度地减少过度缩放,这可能会导致不必要的成本。 有时无法设置缩放限制。 在这些情况下,应设置警报,以在组件达到最大缩放限制和过度缩放时通知你。

了解服务缩放边界。 了解服务缩放限制、增量和限制时,可以在选择服务时做出明智的决策。 缩放边界确定所选服务是否可以处理预期的工作负荷、高效缩放并满足应用程序的性能要求。 要考虑的缩放边界包括:

  • 缩放限制:缩放限制是位置或服务可以处理的最大容量。 请务必了解这些限制,以帮助确保服务能够容纳预期的工作负荷并处理峰值使用量,而不会降低性能。 每个资源都有上限。 如果需要超出缩放限制,则应对工作负荷进行分区。

  • 缩放增量:服务按定义的增量进行缩放。 例如,计算服务可能会按实例和 Pod 进行缩放,而数据库可能会按实例、事务单元和虚拟核心进行缩放。 请务必了解这些增量以优化资源分配并防止资源浮点。

  • 缩放限制:某些服务允许纵向扩展或横向扩展,但限制自动反向缩放的能力。 被迫手动缩减,或者可能需要重新部署新资源。 这些限制通常是为了保护工作负荷。 纵向缩减或缩减可能会对工作负荷的可用性和性能产生影响。 服务可能会强制实施某些限制或约束,以帮助确保工作负荷有足够的资源来有效运行。 这些限制可能会影响数据一致性和同步,尤其是在分布式系统中。 该服务可能具有在纵向扩展或横向扩展期间处理数据复制和一致性的机制,但可能无法提供对纵向缩减或缩减的相同级别的支持。

使用有意义的负载指标。 缩放应使用有意义的负载指标作为缩放触发器。 有意义的负载指标包括简单的指标,例如 CPU 或内存。 它们还包括更高级的指标,例如队列深度、SQL 查询、自定义指标查询和 HTTP 队列长度。 请考虑将简单和高级负载指标组合用作缩放触发器。

使用缓冲区。 缓冲区是未使用的容量,可用于处理需求高峰。 一个设计良好的工作负荷计划,用于意外的工作负荷高峰。 应添加缓冲区来处理水平和垂直缩放的峰值。

防止拍打。 Flapping 是一种循环条件,当一个缩放事件触发相反的缩放事件时,会创建连续的来回缩放作。 例如,如果缩小实例数,可能会导致 CPU 使用率在剩余实例中增加,从而触发横向扩展事件。 横向扩展事件反过来又会导致 CPU 使用率下降,并重复此过程。

请务必在横向扩展和缩小阈值之间选择适当的边距以避免浮点。 可以通过设置阈值来防止频繁和不必要的横向缩减和横向扩展作,这些阈值在 CPU 使用率方面存在显著差异。

使用部署标记。 可通过一些技术更轻松地缩放工作负荷。 可以通过添加一个或多个缩放单元,使用 部署标记 模式轻松缩放工作负荷。

风险:虽然缩放通过调整容量来满足需求来帮助优化成本,但它可能会导致在长时间的高需求期间总增加成本。

测试缩放

测试缩放涉及模拟受控环境中的各种工作负荷方案,以评估工作负荷如何响应不同级别的需求。 它有助于确保工作负荷在各种负载期间高效缩放,最大程度地提高性能效率。

需要确保工作负荷在实际条件下高效缩放。 在镜像生产设置的环境中执行负载和压力测试至关重要。 这些测试是在非生产环境中进行的,可用于评估垂直和水平缩放策略,并确定哪一项最有效地优化性能。 下面是测试缩放的建议方法:

  • 定义工作负荷方案。 确定需要测试的关键工作负荷方案,例如增加用户流量、并发请求、数据量或资源使用。

  • 使用类似于生产的测试环境。 在基础结构、配置和数据方面,创建与生产环境非常相似的独立测试环境。

  • 设置性能指标。 定义要度量的性能指标,例如响应时间、吞吐量、CPU 和内存利用率以及错误率。

  • 开发测试用例。 开发模拟不同工作负荷方案的测试用例,逐步增加负载,以评估不同级别的性能。

  • 执行和监视测试。 使用定义的测试用例运行测试,并在每个负载级别收集性能数据。 监视工作负荷行为、资源消耗和性能降低。

  • 分析和优化缩放。 分析测试结果,确定性能瓶颈、可伸缩性限制或改进方面。 优化配置、基础结构或代码以提高可伸缩性和性能。 缩放需要一段时间才能完成,因此测试缩放延迟的影响。

  • 解决依赖项问题。 查找潜在的依赖项问题。 在工作负荷的一个区域中缩放或分区可能会导致依赖项出现性能问题。 工作负荷的有状态部分(如数据库)是依赖项性能问题的最常见原因。 数据库需要仔细设计才能水平缩放。 应考虑度量值(如 乐观并发 或数据分区),以启用对数据库的更多吞吐量。

  • 调整后重新测试。 在实施优化后重复可伸缩性测试,以验证改进并帮助确保工作负荷能够高效地处理预期的工作负荷。

权衡:考虑工作负荷的预算约束和成本效益目标。 由于需要更大、更强大的资源,垂直缩放可能涉及更高的成本。 水平缩放通过使用可按需添加或删除的较小实例来节省成本。

分区工作负荷

分区是将大型数据集或工作负荷划分为更小、更易于管理的部分(称为分区)的过程。 每个分区都包含数据或工作负荷的子集,通常单独存储或处理。 分区可实现并行处理并减少争用。 将工作负荷划分为较小的单元后,应用程序可以独立处理每个单元。 结果是更好地使用资源和更快的处理时间。 分区还有助于将数据分布到多个存储设备,减少单个设备上的负载并提高整体性能。

了解分区

使用的特定分区方法取决于你拥有的数据或工作负荷的类型以及所使用的技术。 分区的一些常见策略包括:

  • 水平分区:在此方法中,数据集或工作负荷根据特定条件进行划分,例如值范围或特定属性。 每个分区都包含符合定义的条件的数据子集。

  • 垂直分区:在此方法中,数据集或工作负荷根据特定属性或列进行划分。 每个分区都包含列或属性的子集,以便更有效地访问所需的数据。

  • 功能分区:在此方法中,数据或工作负荷根据需要执行的特定函数或作进行划分。 每个分区都包含特定函数所需的数据或组件,可实现优化的处理和性能。

规划分区

请务必在分区时考虑数据分布、查询模式、数据增长和工作负荷要求等因素。 适当的规划和设计对于帮助确保分区和最大化性能效率至关重要。 如果以事后方式解决分区问题,则更具挑战性,因为已有要维护的实时工作负荷。 可能需要更改数据访问逻辑,在分区之间分配大量数据,并支持在数据分发期间继续使用。

实现分区

确定要使用的分区类型时,必须分析数据的特征、访问模式、并发要求和可伸缩性目标。 每种分区类型都有自己的优点和注意事项。 下面是每种分区类型需要考虑的一些因素:

  • 如果要将数据分布到多个资源或服务器,以提高可伸缩性和性能,则横向分区是合适的。 在每个分区上可以独立并行化和处理工作负荷时,这一点很有效。 当多个用户或进程需要能够同时访问或更新数据集时,请考虑水平分区。

  • 当经常访问某些属性或列时,垂直分区是合适的,而其他属性或列则不太经常访问。 通过垂直分区,可以最大程度地减少不必要的数据检索,从而有效访问所需数据。

  • 当不同的函数需要不同的数据子集并且可以独立处理时,功能分区是合适的。 通过允许每个分区集中特定作,功能分区可以优化性能。

测试和优化分区

测试分区方案以验证策略的有效性和效率,以便进行调整以提高性能。 测量响应时间、吞吐量和可伸缩性等因素。 将结果与性能目标进行比较,并确定任何瓶颈或问题。 根据分析确定潜在的优化机会。 可能需要跨分区重新分发数据、调整分区大小或更改分区条件。

权衡:分区增加了工作负荷设计和开发的复杂性。 分区需要开发人员和数据库管理员之间的对话和规划。

风险:分区引入了一些需要考虑和解决的潜在问题,包括:

  • 数据偏斜:分区可能会导致数据倾斜,其中某些分区接收的数据或工作负荷与其他分区相比不成比例。 数据倾斜可能会导致性能不平衡,并导致特定分区的争用增加。

  • 查询性能:设计不佳的分区方案可能会对查询性能产生负面影响。 如果查询需要跨多个分区访问数据,则可能需要在分区之间进行额外的协调和通信,从而导致延迟增加。

Azure 便利化

优化缩放。 Azure 具有支持垂直和水平缩放的基础结构容量。 Azure 服务具有不同的性能层,称为 SKU。 SKU 允许垂直缩放。 许多 Azure 资源都支持自动缩放或其他就地缩放选项。 某些资源支持高级指标或自定义输入,以支持微调缩放行为。 Azure 中的大多数缩放实现可以设置限制并支持需要发出更改警报的必要可观测性。

使用 Azure Monitor 可以监视应用程序和基础结构中的各种指标和条件。 可以使用 Monitor 根据预定义的规则触发自动缩放作。 例如,在 Azure Kubernetes 服务(AKS)中,可以使用 Monitor 启用水平 Pod 自动缩放(HPA)和群集自动缩放。 使用 Monitor 的监视和警报功能,可以有效地促进 Azure 中的缩放,并帮助确保应用程序和基础结构可以动态调整以满足需求。

还可以在 Azure 中生成自定义自动缩放。 可以对没有自动缩放功能的资源使用 Monitor 中的警报。 可以将这些警报设置为基于查询或基于指标,并且可以使用 Azure 自动化执行作。 自动化提供了一个平台,用于跨 Azure、云和本地环境托管和运行 PowerShell 和 Python 代码。 它提供按需部署 Runbook 或按计划部署 Runbook、运行历史记录和日志记录、集成机密存储和源代码管理集成等功能。

设计应用程序进行缩放:下面是 Azure 促进应用程序缩放设计的一些方法;

  • 消除数据锁定:在 Azure SQL 数据库中,可以启用 优化的锁定 以提高需要严格一致性的数据库的性能。

  • 使用后台任务:Azure 提供用于实现后台作业的服务和指南。 有关详细信息,请参阅 后台作业

  • 实现负载均衡:Azure 提供不需要客户端相关性的负载均衡器。 这些负载均衡器包括 Azure Front DoorAzure 应用程序网关Azure 负载均衡器

对工作负荷进行分区:Azure 为不同的数据存储提供各种分区策略。 这些策略通过跨多个分区分布数据来帮助提高性能和可伸缩性。 有关详细信息,请参阅 数据分区策略

性能效率清单

请参阅完整的建议集。