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

多租户和 Azure Cosmos DB

本页上介绍了 Azure Cosmos DB 的一些功能,这些功能在使用多租户系统时非常有用。 还提供了有关如何在多租户解决方案中使用 Azure Cosmos DB 的指南和示例的链接。

支持多租户的 Azure Cosmos DB 功能

分区

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

建议探索使用分层分区键来改善多租户解决方案的性能。 分层分区键允许创建包含多个值的分区键。 例如,可以使用包括租户标识符和已存储数据类型的分层分区键。 此方法允许扩展到每个分区键值 20 GB 的逻辑分区限制之外。

详细信息:

管理请求单位

Azure Cosmos DB 的定价模型基于预配或使用的请求单位数。 请求单位是数据库操作或查询成本的逻辑抽象。 通常,会为工作负载预配定义的每秒请求单位数,这称为吞吐量。 Azure Cosmos DB 提供了多个有关如何预配吞吐量的选项。 在多租户环境中,所做的选择会影响 Azure Cosmos DB 资源的性能和价格。

Azure Cosmos DB 的一个租户模型涉及在共享数据库中为每个租户部署单独的容器。 Azure Cosmos DB 使你可以为数据库预配请求单位,并且所有容器都共享请求单位。 如果租户工作负载通常不重叠,则此方法有助于降低运营成本。 但是,此方法容易受到近邻干扰问题的影响,因为单个租户的容器可能会消耗不相称的共享预配请求单位。 若要缓解此问题,首先要确定干扰租户。 然后,可以选择在特定容器上设置已预配的吞吐量。 数据库中的其他容器会继续共享其吞吐量,但干扰租户会使用自己的专用吞吐量。

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

注意

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

为了监视和管理与每个租户关联的成本,使用 Azure Cosmos DB API 的每个操作都包含使用的请求单位。 可以使用此信息聚合和比较每个租户使用的实际请求单位,随后可以标识具有不同性能特征的租户。

详细信息:

客户管理的密钥

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

详细信息:

隔离模型

在处理使用 Azure Cosmos DB 的多租户系统时,需要在你想要使用的隔离级别方面做出决策。 企业对企业 (B2B) 指的是向企业销售。 企业对消费者 (B2C) 是指直接向使用产品或服务的个人客户销售。 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 Cosmos DB 的分区支持。 通过对每个租户使用单独分区键,可以轻松查询单个租户的数据。 还可以跨多个租户进行查询,即使它们处于单独分区中也是如此。 但是,跨分区查询的请求单位 (RU) 成本要高于单分区查询。

为每个租户存储的数据量较小时,此方法往往效果良好。 对于构建包含免费层的定价模型,以及对于企业对消费者 (B2C) 解决方案,这可能是不错的选择。 一般而言,使用共享容器可实现最高租户密度,因此每个租户的价格最低。

考虑容器的吞吐量会十分重要。 所有租户都会共享容器的吞吐量,因此如果租户的工作负载较高或重叠,则近邻干扰问题可能会导致性能难题。 有时可以通过将租户子集分组到不同的容器中,并确保每个租户组具有兼容的使用模式来缓解此问题。 或者,可以考虑多租户和单租户混合模型。 将较小的租户分组到共享分区容器中,并为大客户提供专用容器。 此外,在按分区对租户建模时,还有一些功能可帮助控制近邻干扰问题,例如 Java SDK 中的吞吐量重新分配突发容量吞吐量控制

还必须考虑存储在每个逻辑分区中的数据量。 Azure Cosmos DB 允许每个逻辑分区增长到最多 20 GB。 如果你有单个租户需要存储 20 GB 以上的数据,请考虑跨多个逻辑分区分布数据。 例如,可以通过为租户创建多个分区键(Contoso1Contoso2 等)来为分区键加盐,而不是使用单个分区键 Contoso。 查询租户的数据时,可以使用 WHERE IN 子句匹配所有分区键。 分层分区键还可用于支持存储大于 20 GB 的大型租户,而无需为每个租户使用合成分区键或多个分区键值。

请考虑解决方案的操作方面以及租户生命周期的不同阶段。 例如,当租户移到专用定价层时,可能需要将数据移到其他容器。 撤销租户时,需要对容器运行删除查询以移除数据,对于大型租户,此查询在执行期间可能会消耗大量吞吐量。

每个租户具有容器

可以为每个租户预配专用容器。 为租户存储的数据可以合并到单个容器中时,专用容器效果良好。 与上述“每租户分区键”模型相比,此模型可提供更高的性能隔离,并且还通过 Azure RBAC 提供更高的数据访问安全隔离。

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

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

如果租户数据模型需要多个实体,只要所有实体可以共享同一分区键,它们就可以并置在同一容器中。 但是,如果租户数据模型更为复杂,并且需要不共享同一分区键的实体,请考虑下面的“每租户数据库”或“每租户数据库帐户”模型。 请参阅了解如何使用实际示例对 Azure Cosmos DB 上的数据进行建模和分区一文,获取更多指导。

当容器专用于租户时,生命周期管理通常更简单。 可以在共享与专用吞吐量模型之间轻松迁移动租户,并且在撤销租户时,可以快速删除容器。

每个租户一个数据库

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

与下面的“每租户帐户”模型一样,此方法提供最高级别的性能隔离,但它提供的租户密度最低。 然而,当每个租户需要比在“每租户容器”模型中可行的更为复杂的数据模型时,此选项是最佳选择。 或者,如果要求快速创建新租户,并且/或避免产生任何预先创建租户帐户的开销时,应遵循此方法。 还可能出现的情况是,对于使用的特定软件开发框架,“每租户数据库”是在该框架中识别的唯一性能隔离级别。 实体(容器)级别的隔离和实体共置通常在此类框架中不受本机支持。

每个租户具有数据库帐户

Azure Cosmos DB 使你可以为每个租户预配单独的数据库帐户,这可提供最高隔离级别,但密度最低。 与上面的“每租户容器”和“每租户数据库”模型一样,此模型提供的性能隔离比“每租户分区键”密钥模型更高。 它还通过 Azure RBAC 提供增强的数据访问安全隔离。 此外,此模型通过客户管理的密钥在租户级别提供数据库加密安全隔离。

单个数据库帐户专用于租户,这意味着它们不受近邻干扰问题的影响。 可以根据租户的要求配置数据库帐户的位置。 还可以优化 Azure Cosmos DB 功能(例如异地复制和客户管理的加密密钥)的配置,以满足每个租户的要求。 对每个租户使用专用 Azure Cosmos DB 帐户时,请考虑每个 Azure 订阅的最大 Azure Cosmos DB 帐户数

如果使用此模型,应考虑应用程序生成新租户所需的速度。 在 Azure Cosmos DB 中创建帐户可能需要几分钟时间,因此可能需要预先创建帐户。 如果此方法不可行,请考虑“每租户数据库”模型。

如果允许租户从共享帐户迁移到专用 Azure Cosmos DB 帐户,请考虑用于在旧帐户与新帐户之间移动租户数据的迁移方法。

混合方法

可以考虑上述方法的组合,以满足不同租户的要求和定价模型。 例如:

  • 在共享容器中预配所有免费试用版客户,并使用租户 ID 或合成键分区键
  • 提供付费青铜层,该层对每个租户部署专用容器,但在数据库上共享吞吐量
  • 提供更高的白银层,该层为租户的容器预配专用吞吐量。
  • 提供最高的黄金层,并为租户提供专用数据库帐户,这还允许租户为其部署选择地理位置。

作者

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

主要作者:

其他参与者:

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

后续步骤

查看多租户的存储和数据方法

了解多租户和 Azure Cosmos DB:

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