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

有关优化缩放和分区的建议

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

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

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

定义

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

关键设计策略

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

优化缩放

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

选择缩放策略

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

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

了解水平缩放。 使用水平缩放,可以添加更多实例或资源,以将工作负载分配到多个服务器。 水平缩放提供了一些好处,例如提高复原能力、增加容量,以及处理增加的流量或工作负载需求的能力。 它对于设计为在多个节点上运行的云原生应用程序有效。 水平缩放适用于可分为独立运行的较小部分的工作负载。

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

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

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

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

设计要缩放的基础结构

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

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

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

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

  • 设计模式:设计模式(如 扇出/扇入管道和筛选器 )可帮助避免工作流中的单一实例。 这些模式支持跨多个资源分配处理任务,并提升可伸缩性和灵活性。

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

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

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

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

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

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

设计可缩放的应用程序

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

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

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

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

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

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

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

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

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

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

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

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

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

  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、运行历史记录和日志记录、集成机密存储以及源代码管理集成。

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

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

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

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

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

性能效率清单

请参阅完整的一组建议。