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

多租户解决方案中的 Azure 资源组织

Azure
Microsoft Entra ID

Azure 提供了许多用于组织你的资源的选项。 在多租户解决方案中,有一些在规划资源组织策略时要考虑的特定权衡因素。 在本文中,我们回顾了用于组织 Azure 资源的两个核心元素:租户隔离和跨多个资源横向扩展。 我们还介绍了如何使用 Azure 的资源限制和配额,以及如何超越这些限制来缩放解决方案。

关键考虑因素和要求

租户隔离要求

在 Azure 中部署多租户解决方案时,需要确定是将资源专用于每个租户还是在多个租户之间共享资源。 在本系列的多租户方法和服务特定指南部分中,我们介绍了许多类别的资源的选项和权衡因素。 一般而言,租户隔离有一系列选项。 请查看可考虑用于多租户解决方案的租户模型,以获取有关如何决定隔离模型的更多指导。

缩放

大多数 Azure 资源以及资源组和订阅都施加了可能会影响缩放能力的限制。 你可能需要考虑“横向扩展”或“装箱”,以满足计划的租户数或计划的系统负载。

如果确定不会增长到大量租户或很高的负载,请不要过度设计你的横向扩展计划。 但是,如果是为要增长的解决方案进行计划,请仔细考虑你的横向扩展计划。 请确保按照本文中的指导设计架构以便于进行缩放。

如果你有自动化部署过程,并且需要跨资源进行缩放,请确定如何在多个资源实例之间部署和分配租户。 例如,如何检测到你即将接近可分配给特定资源的租户数上限? 是否计划在需要新资源时实时部署新资源? 或者,你是否会提前部署一个资源池,以便这些资源在你需要时可供使用?

提示

在设计和开发的早期阶段,你可能不会选择实现自动化横向扩展过程。 你仍应考虑并清晰记录在增长时进行缩放所需的过程。

此外,请务必避免在代码和配置中做出假设,这可能会限制缩放能力。 例如,可能需要横向扩展到多个存储帐户。 请确保应用程序层不假定它仅连接到用于所有租户的单个存储帐户。

要考虑的方法和模式

租户隔离

Azure 资源是通过层次结构进行部署和管理的。 大多数资源都部署到包含在订阅中的资源组内。 管理组在逻辑上将订阅分组在一起。 所有这些有关层次结构的层都与 Microsoft Entra 租户相关联。

确定如何为每个租户部署资源时,可能会在层次结构中的不同级别进行隔离。 每个选项都对某些类型的多租户解决方案有效,并具有相应的优势和劣势。 将多种方法组合起来,对解决方案的不同组件使用不同的隔离模型也很常见。

共享资源中的隔离

你可能会选择在多个租户之间共享 Azure 资源,并在单个实例上运行其所有工作负载。 请查看你使用的 Azure 服务的服务特定指南,以了解任何可能很重要的特定注意事项或选项。

运行资源的单个实例时,需要考虑在缩放时可能达到的任何服务限制、订阅限制或配额。 例如,Azure Kubernetes 服务 (AKS) 群集支持的节点数有上限,存储帐户支持的每秒事务数也有上限。 请考虑在接近这些限制时如何扩展到多个共享资源

还需要确保你的应用程序代码完全了解多租户,并且它限制了对特定租户的数据的访问。

作为共享资源方法的说明,假设 Contoso 正在构建一个多租户 SaaS 应用程序,其中包括一个 Web 应用程序、一个数据库和一个存储帐户。 他们可能决定部署共享资源,并且会使用这些资源为其所有客户提供服务。 在下图中,所有客户共享一组资源。

Diagram that shows a single set of resources that are shared by all the customers.

将资源分隔到资源组中

还可以为每个租户部署专用资源。 你可能会为单个租户部署解决方案的整个副本。 也可能会在租户之间共享某些组件,并部署专用于特定租户的其他组件。

建议使用资源组来管理具有相同生命周期的资源。 在某些多租户系统中,将多个租户的资源部署到单个资源组或一组资源组是很有意义的。

请务必考虑如何部署和管理这些资源,包括是由部署管道还是由应用程序启动特定于租户的资源部署。 还需要确定如何明确标识特定资源与特定租户相关。 请考虑使用明确的命名约定策略资源标记或租户目录数据库。

对在多个租户之间共享的资源和为单个租户部署的资源使用不同的资源组,是一种很好的做法。 但是,对于某些资源,Azure 会限制可部署到资源组的单个类型的资源数。 此限制意味着在增长时可能需要跨多个资源组进行扩展

假设 Contoso 有三个客户:Adventure Works、Fabrikam 和 Tailwind。 他们可能会选择在三个客户之间共享 Web 应用程序和存储帐户,然后为每个租户部署单独的数据库。 在下图中,每个客户都分配有一个包含共享资源的资源组,以及一个包含数据库的资源组。

Diagram showing a resource group that contains shared resources, and another resource group that contains a database for each customer.

将资源组分隔到订阅中

为每个租户部署一组资源时,请考虑使用特定于租户的专用资源组。 例如,遵循“部署缩放单元”模式时,应将每个缩放单元部署到其自己的资源组中。 可以考虑将多个特定于租户的资源组部署到一个共享 Azure 订阅中,这样就可以轻松配置策略和访问控制规则。

你可能会选择为每个租户创建一组资源组,并且还为任何共享资源创建共享资源组。

将特定于租户的资源组部署到共享订阅时,请注意每个订阅中的资源组数量上限,以及适用于所部署资源的其他订阅级限制。 接近这些限制时,可能需要跨多个订阅进行扩展

在我们的示例中,Contoso 可以选择为其每个客户部署一个缩放单元,并将缩放单元放在单个订阅中的专用资源组中。 在下图中,为每个客户都创建了一个包含三个资源组的订阅。

Diagram showing a subscription that contains three resource groups, each of which is a complete set of resources for a specific customer.

单独的订阅

通过部署特定于租户的订阅,可以完全隔离特定于租户的资源。 此外,由于大多数配额和限制都适用于单个订阅,因此每个租户使用单独的订阅可确保每个租户都可以完全使用任何适用的配额。 对于某些 Azure 计费帐户类型,可以采用编程方式创建订阅。 还可以跨订阅使用 Azure 预留适用于计算的 Azure 节省计划

请留意你可以创建的订阅数量。 订阅数量上限可能会有所不同,具体取决于你与 Microsoft 或 Microsoft 合作伙伴的商业关系,例如,你是否有企业协议

但是,跨大量订阅工作时,请求增加配额可能更加困难。 配额 API 为某些资源类型提供编程接口。 但是,对于许多资源类型,必须通过启动支持案例来请求增加配额。 使用许多订阅时,使用 Azure 支持协议和支持案例也可能很困难。

请考虑将特定于租户的订阅分组到管理组层次结构中,以便轻松管理访问控制规则和策略。

例如,假设 Contoso 决定为其三个客户中的每一个都创建一个单独的 Azure 订阅,如下图所示。 每个订阅都包含一个资源组,其中包含该客户的一整组资源。

Diagram showing three customer-specific subscriptions. Each subscription contains a resource group, with the complete set of resources for that customer.

每个订阅都包含一个资源组,其中包含该客户的一整组资源。

他们使用管理组来简化对订阅的管理。 通过在管理组的名称中包含“生产”,他们可以清晰地区分任何生产租户与非生产租户或测试租户。 非生产租户将应用不同的 Azure 访问控制规则和策略。

所有其 Azure 订阅都与单个 Microsoft Entra 租户相关联。 使用单个 Microsoft Entra 租户意味着 Contoso 团队的标识(包括用户和服务主体)可以在其整个 Azure 资产中使用。

将订阅隔离到单独的 Microsoft Entra 租户中

还可以手动为每个租户创建单个 Microsoft Entra 租户,或者将资源部署到客户的 Microsoft Entra 租户内的订阅中。 但是,使用多个 Microsoft Entra 租户会更加难以进行身份验证、管理角色分配、应用全局策略和执行许多其他管理操作。

警告

对于大多数多租户解决方案,我们都建议不要创建多个 Microsoft Entra 租户。 跨 Microsoft Entra 租户工作引入了额外的复杂性,并且降低了缩放和管理资源的能力。 通常,此方法仅适用于托管服务提供商 (MSP),这些提供商代表其客户操作 Azure 环境。

单个 Microsoft Entra 租户可由多个单独的订阅和 Azure 资源使用。 在努力部署多个 Microsoft Entra 租户之前,请考虑是否有其他方法可以实现你的目的

如果需要在绑定到多个 Microsoft Entra 租户的订阅中管理 Azure 资源,请考虑使用 Azure Lighthouse 来帮助跨 Microsoft Entra 租户管理资源。

例如,Contoso 可以为其每个客户创建单独的 Microsoft Entra 租户和单独的 Azure 订阅,如下图所示。

Diagram showing a Microsoft Entra tenant for each of Contoso's tenants, which contains a subscription and the resources required. Azure Lighthouse is connected to each Microsoft Entra tenant.

已为 Contoso 的每个租户配置了一个 Microsoft Entra 租户,其中包含一个订阅和所需的资源。 Azure Lighthouse 已连接到每个 Microsoft Entra 租户。

装箱

无论资源隔离模型如何,请务必考虑解决方案何时以及如何跨多个资源横向扩展。 随着系统上的负载增加,或者随着租户数量增长,你可能需要扩展资源。 请考虑“装箱”,以便针对你的需求部署最佳数量的资源。

提示

在许多解决方案中,可以更轻松地将整组资源一起缩放,而不是逐个缩放资源。 请考虑遵循“部署缩放单元”模式

资源限制

Azure 资源具有在解决方案规划中必须考虑的限制和配额。 例如,资源可能支持一个并发请求数量上限或特定于租户的配置设置。

配置和使用每个资源的方式也会影响该资源的可伸缩性。 例如,在有一定数量的计算资源的前提下,你的应用程序每秒可以成功响应已定义数量的事务。 超出这个点,便可能需要横向扩展。性能测试可帮助你确定资源不再满足要求的点。

注意

即使你使用支持多个实例的服务,扩展到多个资源的原则也适用。

例如,Azure 应用服务支持横向扩展计划的实例数,但对单个计划的扩展范围有限制。 在大规模多租户应用中,可能会超出这些限制,并需要部署额外的应用服务资源以匹配增长情况。

在租户之间共享某些资源时,应该首先确定资源支持的租户数量(如果已根据你的要求配置了该数量)。 然后,根据你需要为其提供服务的租户总数来部署所需数量的资源。

例如,假设你要部署一个 Azure 应用程序网关,作为多租户 SaaS 解决方案的一部分。 你查看应用程序设计,在负载下测试应用程序网关的性能,并查看其配置。 然后,确定单个应用程序网关资源可以在 100 个客户之间共享。 根据组织的增长计划,你预计第一年加入 150 个客户,因此你需要计划部署多个应用程序网关来为预期负载提供服务。

Diagram showing two application gateways. The first gateway is dedicated to customers 1 through 100, and the second is dedicated to customers 101 through 200.

在上图中,有两个应用程序网关。 第一个网关专用于第 1 到第 100 个客户,第二个网关专用于第 101 到第 200 个客户。

资源组和订阅限制

无论是使用共享资源还是专用资源,请务必考虑到限制。 Azure 限制了可部署到资源组和可部署到 Azure 订阅的资源数。 接近这些限制时,需要计划跨多个资源组或订阅进行扩展。

例如,假设为每个客户将一个专用应用程序网关部署到一个共享资源组中。 对于某些资源,Azure 支持将最多 800 个相同类型的资源部署到单个资源组中。 因此,达到此限制时,需要将任何新的应用程序网关都部署到另一个资源组中。 在下图中,有两个资源组。 每个资源组包含 800 个应用程序网关。

Diagram that shows two resource groups. Each resource group contains 800 application gateways.

跨资源组和订阅将租户装箱

还可以跨资源、资源组和订阅应用装箱概念。 例如,当你拥有少量的租户时,你可能能够部署单个资源并在所有租户之间共享它。 下图显示了装箱到单个资源中。

Diagram that shows bin packing into a single resource.

随着你的增长,你可能会接近单个资源的容量限制,并横向扩展到多个(R 个)资源。 下图显示了跨多个资源装箱。

Diagram that shows bin packing across multiple resources.

随着时间的推移,你可能会达到单个资源组中资源数的限制,然后你会将多个(R 个)资源部署到多个(G 个)资源组。 下图显示了在多个资源组中跨多个资源装箱。

Diagram that shows bin packing across multiple resources, in multiple resource groups.

随着你的进一步增长,可以跨多个(S 个)订阅进行部署,每个订阅包含具有多个(R 个)资源的多个(G 个)资源组。 下图显示了在多个资源组和订阅中跨多个资源装箱。

Diagram that shows bin packing across multiple resources, in multiple resource groups and subscriptions.

通过规划横向扩展策略,可以扩展到海量的租户并保持较高的负载水平。

标记

使用资源标记可将自定义元数据添加到 Azure 资源,这对于管理和跟踪成本非常有用。 有关详细信息,请参阅使用资源标记分配成本

要避免的反模式

  • 未针对扩展进行计划。 请确保清楚地了解要部署的资源的限制,以及随着负载或租户数的增加,哪些限制可能变得重要。 计划在你进行扩展时如何部署其他资源,并测试该计划。
  • 未计划装箱。 即使不需要立即增长,也应计划随着时间的推移而跨多个资源、资源组和订阅扩展 Azure 资源。 避免在应用程序代码中做出假设,例如在将来可能需要扩展到多个资源时只有单个资源。
  • 扩展许多单个资源。 如果有复杂的资源拓扑,则很难逐个缩放各个组件。 按照“部署缩放单元”模式将解决方案作为一个单元进行缩放通常会更简单。
  • 在不必要时为每个租户部署独立资源。 在许多解决方案中,为多个租户部署共享资源更具成本效益且更高效。
  • 使用单独的 Microsoft Entra 租户。 一般来说,预配多个 Microsoft Entra 租户是不明智的。 跨 Microsoft Entra 租户管理资源很复杂。 跨已链接到单个 Microsoft Entra 租户的多个订阅进行缩放更简单。
  • 在不需要扩展时设计复杂的扩展架构。 在某些解决方案中,你确切地知道规模永远不会超过特定的级别。 在这些方案中,无需构建复杂的扩展逻辑。 但是,如果你的组织计划增长,则你需要准备好进行扩展(可能会是一接到通知就要进行扩展)。

作者

本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。

主要作者:

  • John Downs | FastTrack for Azure 首席客户工程师

其他参与者:

若要查看非公开领英个人资料,请登录领英。

后续步骤

查看成本管理和分配方法。