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

多租户和 Azure Cosmos DB

本文介绍可用于多租户系统的 Azure Cosmos DB 的功能。 它提供有关如何在多租户解决方案中使用 Azure Cosmos DB 的指导和示例。

多租户要求

规划多租户解决方案时,需要满足两个关键要求:

  • 帮助确保租户之间的强隔离,并满足对需要这些租户的用户的严格安全要求。
  • 维护每个租户的低成本。 作为提供程序,请确保运行应用程序的成本在扩展时保持可持续。

这两种需求通常相互冲突,并引入权衡,其中必须优先处理一个需求。 本文中的指南可帮助你更好地了解为满足这些需求而必须做出的权衡。 本文可帮助你导航这些注意事项,以便在设计多租户解决方案时做出明智的决策。

隔离模型

确定租户之间所需的隔离级别。 Azure Cosmos DB 支持一系列隔离模型,但对于大多数解决方案,我们建议使用以下策略之一:

  • 每个租户的分区键通常用于完全多租户解决方案,例如企业间软件即服务(B2C SaaS)解决方案。
  • 每个租户的数据库帐户通常用于企业到企业 (B2B) SaaS 解决方案。

若要选择最合适的隔离模型,请考虑业务模型和租户的要求。 例如,对于某些 B2C 模型,如果企业直接向单个客户销售产品或服务,则强性能隔离可能不是优先级。 但是,B2B 模型可能会优先考虑强大的安全性和性能隔离,并且可能要求租户有自己的预配数据库帐户。

还可以组合多个模型以满足不同的客户需求。 例如,假设你构建了一个向企业客户销售的 B2B SaaS 解决方案,并为潜在新客户提供免费试用版。 你可以为需要强大的安全性和隔离保证的付费企业租户部署单独的数据库帐户。 你可以共享数据库帐户并使用分区键来隔离试用客户。

每个租户的分区键模型和每个租户的数据库帐户模型是多租户解决方案最常见的隔离模型。 这些模型在租户隔离和成本效益之间提供最佳平衡。

每个租户的分区键模型

如果按分区键隔离租户,吞吐量将跨租户共享并在同一容器中进行管理。

注意

请求单位(RU)是数据库操作或查询成本的逻辑抽象。 通常,为工作负荷预配定义的每秒请求单位数(RU/秒),这称为 吞吐量

好处

  • 成本效益: 将所有租户放置在一个容器中,该容器按租户 ID 进行分区。 此方法只有一个可计费资源,用于在多个租户之间预配和共享 RU。 与为每个租户创建单独的帐户相比,此模型通常更具成本效益且更易于管理。

  • 简化管理: 要管理的 Azure Cosmos DB 帐户更少。

权衡

  • 资源争用: 同一容器中的租户之间的共享吞吐量(RU/秒)可能会导致高峰期争用。 如果租户的工作负荷较高或重叠,则此争用可能会产生 干扰性邻居问题和 性能挑战。 将此隔离模型用于需要单个租户上有保证 RU 的工作负荷,并且可以共享吞吐量。

  • 有限隔离:此方法提供逻辑隔离,而不是物理隔离。 从性能或安全角度来说,它可能不符合严格的隔离要求。

  • 灵活性较低: 如果按分区键或数据库或容器隔离,则无法为每个租户自定义帐户级功能,例如异地复制、时间点还原和客户管理的密钥。

用于多租户的 Azure Cosmos DB 功能

  • 控制吞吐量: 探索在使用分区键隔离租户时有助于控制干扰邻居问题的功能。 在 Java SDK 中使用吞吐量重新分配突发容量吞吐量控制等功能。

  • 分层分区键: 使用 Azure Cosmos DB,使每个逻辑分区的大小可以增加到 20 GB。 如果你有单个租户需要存储 20 GB 以上的数据,请考虑跨多个逻辑分区分布数据。 例如,你可以通过为租户创建多个分区键(例如和ContosoContoso1来分配分区键,而不是具有单个Contoso2分区键。

    查询租户的数据时,可以使用子 WHERE IN 句匹配所有分区键。 如果租户基数较高,还可以使用 分层分区键 为大型租户提供大于 20 GB 的存储。 对于此方法,无需为每个租户使用综合分区键或多个分区键值。

    假设你有一个按分区键隔离租户的工作负荷。 一个租户 Contoso 比其他租户更大且写入量更大,并且其大小继续增长。 为了避免无法为此租户引入更多数据的风险,你可以使用分层分区键。 指定 TenantID 为第一个级别键,然后添加第二个级别,例如 UserId。 如果预计 TenantIDUserID 组合生成超过 20 GB 限制的逻辑分区,则可以进一步分区到另一个级别,例如 SessionID。 指定任一 TenantID 或两者 TenantIDUserID 有效地路由到包含相关数据的物理分区的子集的查询,从而避免了完全扇出查询。 如果容器有 1,000 个物理分区,但特定 TenantId 值仅在五个物理分区上,则查询将路由到较小的相关物理分区。

    如果第一个级别没有足够的基数,并且你达到了分区键的 20 GB 逻辑分区限制,请考虑使用合成分区键而不是分层分区键。

Database-account-per-tenant 模型

如果按数据库帐户隔离租户,则每个租户都有自己的在数据库级别或容器级别预配的吞吐量。

好处

  • 高隔离: 此方法避免争用或干扰,因为专用的 Azure Cosmos DB 帐户和容器为每个唯一租户预配了 RU。

  • 自定义服务级别协议(SLA): 每个租户都有自己的帐户,因此你可以提供特定的定制资源、面向客户的 SLA 和保证,因为可以独立优化每个租户的数据库帐户以获取吞吐量。

  • 增强安全性: 物理数据隔离有助于确保可靠的安全性,因为客户可以在每个租户的帐户级别启用客户管理的密钥。 每个租户的数据都按帐户隔离,而不是位于同一容器中。

  • 灵活性: 租户可以根据需要启用帐户级功能,例如异地复制、时间点还原和客户管理的密钥。

权衡

  • 提高管理: 此方法更为复杂,因为管理多个 Azure Cosmos DB 帐户。

  • 更高的成本: 更多的帐户意味着必须在每个租户的帐户内为每个资源(例如数据库或容器)预配吞吐量。 每次资源预配 RU 时,Azure Cosmos DB 成本都会增加。

  • 查询限制: 所有租户位于不同的帐户中,因此查询多个租户的应用程序需要在应用程序的逻辑中多次调用。

用于多租户的 Azure Cosmos DB 功能

  • 安全功能: 此模型通过 Azure RBAC 提供更高的数据访问安全隔离。 此模型还通过 客户管理的密钥在租户级别提供数据库加密安全隔离。

  • 自定义配置:可以根据租户的要求配置数据库帐户的位置。 还可以优化 Azure Cosmos DB 功能(例如异地复制和客户管理的加密密钥)的配置,以满足每个租户的要求。

使用每个租户的专用 Azure Cosmos DB 帐户时,请考虑 每个 Azure 订阅的最大 Azure Cosmos DB 帐户数。

隔离模型的完整列表

工作负荷需求 每租户分区键(推荐) 每个租户的容器(共享吞吐量) 每个租户的容器(专用吞吐量) 每个租户一个数据库 每个租户具有数据库帐户(推荐)
跨租户查询 容易(容器充当查询的边界) 硬色调 硬色调 硬色调 硬色调
租户密度 高(每个租户的成本最低) 中等
租户数据删除 简单 容易(租户离开时删除容器) 容易(租户离开时删除容器) 容易(租户离开时删除数据库) 容易(租户离开时删除数据库)
数据访问安全隔离 需要在应用程序中实现 容器 RBAC 容器 RBAC 数据库 RBAC RBAC
异地复制 无法按租户异地复制 根据要求对数据库帐户中的租户进行分组 根据要求对数据库帐户中的租户进行分组 根据要求对数据库帐户中的租户进行分组 根据要求对数据库帐户中的租户进行分组
近邻干扰防护
新租户创建延迟 即时 快速 快速 中等
数据建模的优势 实体共置 实体共置 多个容器用于为租户实体建模 多个容器和数据库用于为租户建模
加密密钥 对所有租户相同 对所有租户相同 对所有租户相同 对所有租户相同 每个租户的客户管理的密钥
吞吐量要求 >每个租户 0 RU >每个租户 100 RU 每个租户 >100 RU(仅限自动缩放,否则每个租户 >400 RU) >每个租户 400 RU >每个租户 400 RU
示例用例 B2C 应用 适用于 B2B 应用的标准套餐 适用于 B2B 应用的高级套餐 适用于 B2B 应用的高级套餐 适用于 B2B 应用的高级套餐

每个租户的容器模型

可以为每个租户预配专用容器。 当可以将租户存储的数据合并到单个容器中时,专用容器可以正常工作。 此模型提供的性能隔离比每个租户的分区键模型更高的性能隔离。 它还通过 Azure RBAC 提供增强的数据访问安全隔离。

对每个租户使用容器时,请考虑通过预配数据库级别的吞吐量与其他租户共享吞吐量。 考虑数据库最小 RU 数的限制和限制,以及数据库中的最大容器数。 另请考虑租户是否需要有保证的性能级别,以及它们是否容易受到干扰邻居问题的影响。 在数据库级别共享吞吐量时,所有容器中的工作负载或存储应相对统一。 否则,如果你有一个或多个大型租户,则可能遇到干扰邻居问题。 如有必要,请计划将这些租户分组到基于工作负载模式的不同数据库中。

或者,可以为每个容器预配专用吞吐量。 此方法适用于大型租户和面临干扰邻居问题风险的租户。 但每个租户的基线吞吐量更高,因此请考虑此模型的最低要求和成本影响。

如果租户数据模型需要多个实体,并且所有实体都可以共享相同的分区键,则可以将它们并置在同一容器中。 但是,如果租户数据模型更为复杂,并且需要无法共享相同分区键的实体,请考虑每个租户的数据库或每个租户的数据库帐户模型。 有关详细信息,请参阅 Azure Cosmos DB 上的模型和分区数据。

将容器奉献给租户时,生命周期管理通常更简单。 可以轻松地 在共享和专用吞吐量模型之间移动租户。 取消预配租户时,可以快速删除容器。

每个租户的数据库模型

可以为同一数据库帐户中的每个租户预配数据库。 与每个租户的容器模型一样,此模型提供的性能隔离比每个租户的分区键模型更高的性能隔离。 它还通过 Azure RBAC 提供增强的数据访问安全隔离。

与每个租户的帐户模型类似,此方法提供最高级别的性能隔离,但它提供最低的租户密度。 如果每个租户需要比每个租户容器模型中可行的更复杂的数据模型,请使用此选项。 或者,如果新租户创建必须快速或无需任何开销,请遵循此方法。 对于某些软件开发框架,每个租户的数据库模型可能是框架支持的唯一性能隔离级别。 此类框架通常不支持实体(容器)级别隔离和实体并置。

支持多租户的 Azure Cosmos DB 功能

分区

将分区与 Azure Cosmos DB 容器配合使用,创建多个租户共享的容器。 通常使用租户标识符作为分区键,但你可能还会考虑对单个租户使用多个分区键。 精心规划的分区策略可有效地实现分片模式。 拥有大型容器时,Azure Cosmos DB 将租户分散到多个物理节点,以实现高度缩放。

考虑 分层分区键 来帮助提高多租户解决方案的性能。 使用分层分区键创建包含多个值的分区键。 例如,你可以使用包含租户标识符的分层分区键(如高基数 GUID)来实现几乎不受限制的扩展。 或者,可以指定包含经常使用的属性的分层分区键。 此方法可帮助你避免跨分区查询。 使用分层分区键可超出每个分区键值 20 GB 的逻辑分区限制,并限制昂贵的扇出查询。

有关更多信息,请参阅以下资源:

管理 RU

Azure Cosmos DB 定价模型基于预配或使用的 RU/秒数。 Azure Cosmos DB 提供了多个用于预配吞吐量的选项。 在多租户环境中,选择会影响 Azure Cosmos DB 资源的性能和价格。

对于需要保证性能和安全隔离的租户,我们建议你按数据库帐户隔离租户,并将 RU 分配给租户。 对于要求不太严格的租户,我们建议按分区键隔离租户。 使用此模型在租户之间共享 RU 并优化每个租户的成本。

Azure Cosmos DB 的备用租户模型涉及在共享数据库中为每个租户部署单独的容器。 使用 Azure Cosmos DB 为数据库预配 RU,以便所有容器共享 RU。 如果租户工作负载通常不重叠,则此方法有助于降低运营成本。 但这种方法很容易遇到 干扰邻居问题 ,因为单个租户的容器可能会消耗过多的共享预配 RU。 若要缓解此问题,请先识别干扰租户。 然后,可以选择在特定容器上设置已预配的吞吐量。 数据库中的其他容器会继续共享其吞吐量,但干扰租户会使用自己的专用吞吐量。

Azure Cosmos DB 还提供无服务器层,适合具有间歇性或不可预知流量的工作负荷。 或者,可以使用自动缩放来配置指定预配吞吐量缩放的策略。 还可以利用 Azure Cosmos DB 突发容量来最大程度地利用预配的吞吐量容量,否则受速率限制的限制。 在多租户解决方案中,可以结合所有这些方法来支持不同类型的租户。

注意

规划 Azure Cosmos DB 配置时,请考虑 服务配额和限制

若要监视和管理与每个租户关联的成本,请记住,使用 Azure Cosmos DB API 的每个操作都包含消耗的 RU。 可以使用此信息聚合和比较每个租户使用的实际 RU。 然后,可以标识具有不同性能特征的租户。

有关更多信息,请参阅以下资源:

客户管理的密钥

某些租户可能需要使用自己的加密密钥。 Azure Cosmos DB 提供客户管理的密钥功能。 在 Azure Cosmos DB 帐户级别应用此功能。 因此,如果租户需要自己的加密密钥,则必须使用专用 Azure Cosmos DB 帐户来部署租户。

有关详细信息,请参阅通过 Azure 密钥保管库为 Azure Cosmos DB 帐户配置客户管理的密钥

作者

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

主要作者:

其他参与者:

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

后续步骤

了解多租户和 Azure Cosmos DB:

  • 使用 Azure Cosmos DB 大规模设计和生成多租户 SaaS 应用:Build 2024 的一个会话,指导你了解如何在 Azure Cosmos DB 上设计多租户,并学习来自实际独立软件供应商的最佳做法。
  • Azure Cosmos DB 和多租户系统:讨论如何构建使用 Azure Cosmos DB 的多租户系统的博客文章。
  • 视频:使用 Azure Cosmos DB 的多租户应用程序
  • 视频:使用 Azure Cosmos DB 和 Azure 构建多租户 SaaS:一个关于 Whally(多租户 SaaS 启动如何从头开始在 Azure Cosmos DB 和 Azure 上构建新式平台)的实际案例研究。 Whally 显示了它们做出的设计和实施决策,这些决策与分区、数据建模、安全多租户、性能和从更改源到 SignalR 的实时流式处理相关。 所有这些解决方案在 Azure App 服务 上使用 ASP.NET Core。

请参阅我们其他一些 Azure Cosmos DB 体系结构方案: