选择分区键

已完成

请记住,JSON 文档中的数据存储在容器内的 Azure Cosmos DB 数据库中,这些容器依次分布在物理分区中,而数据则根据分区键的值路由到相应的物理分区。

显示 Azure Cosmos DB 中的物理分区的图示。

分区键是必需的文档属性,可确保将具有相同分区键值的文档路由到特定物理分区并存储在该分区中。 物理分区支持固定的最大存储量和吞吐量 (RU/秒)。 Azure Cosmos DB 会自动将逻辑分区分布到可用的物理分区,并再次以可预测的方式使用分区键值。

在本单元中,你将详细了解逻辑分区以及如何避免热分区。 此信息有助于为方案中的客户数据选择合适的分区键。

在 Azure Cosmos DB 中,可添加更多用于访问和存储数据的物理分区来增加存储和吞吐量。 物理分区的最大存储大小为 50 GB,最大吞吐量为 10,000 RU/秒。

Azure Cosmos DB 中的逻辑分区

逻辑分区是基础物理分区之上的抽象概念。 多个逻辑分区可以存储在单个物理分区中。 容器可以具有无限数量的逻辑分区。 单个逻辑分区在大小增长时移动到新的物理分区,以确保最佳的存储利用率和增长。 将逻辑分区作为一个单元进行移动可确保其中的所有文档都位于同一个物理分区中。 逻辑分区的最大大小为 20 GB。 使用具有高基数的分区键,可以通过将数据分散到大量逻辑分区来避免达到 20 GB 的限制。 还可以使用分层分区键来组织层次结构中的分区键值,以避免此限制。 这些内容在另一个学习路径中介绍。

显示物理和逻辑分区之间的关系的关系图。

分区键可为逻辑分区路由数据。 它是一种存在于容器内每个文档中的用于路由数据的属性。 容器是另一种抽象,适用于使用相同分区键存储的所有数据。 分区键是在创建容器时定义的。

在下例中,容器的分区键为 /username

该图显示了分区键为用户名的示例。

不要使用热分区

对 Azure Cosmos DB 的数据进行建模时,所选分区键必须能够将数据和请求在容器内的物理分区的逻辑和扩展方面均匀分布。 当容器增大并且物理分区数量增加时,尤其如此。

如果开发期间未在加载负载的情况下对数据库的设计进行测试,则当应用程序在生产中且已写入大量数据时,可能会发现分区键选择不当。

如果未将数据正确分区,则可能导致出现热分区。 热分区会阻止应用程序工作负载进行缩放,存储和吞吐量上都可能发生这种情况。

存储热分区

使用可产生高度非对称存储模式的分区键时,存储上会出现热分区。 例如,假设一个多租户应用程序使用 TenantId 作为分区键,且包含六个租户:A 到 F。租户 B、C、E 和 F 非常小,租户 D 具有较多的数据。 但租户 A 非常大,并且很快会达到其分区的 20 GB 限制。 在这种情况下,我们需要选择其他分区键来将存储分布到更多的逻辑分区。

显示存储分布倾斜的关系图。

吞吐量热分区

当大多数或所有请求进入同一逻辑分区时,吞吐量会受到热分区的影响。

必须了解应用程序的访问模式,确保请求尽可能均匀地分布到分区键值中。 在 Azure Cosmos DB 中为容器预配吞吐量时,它将平均分布到容器内的所有物理分区中。

例如,如果你有一个容器具有 30,000 RU/秒,则该工作负载会分布到上述 6 个租户的 3 个物理分区中。 因此每个物理分区获得 10,000 RU/秒。 如果租户 D 使用了其全部 10,000 RU/秒,则将受速率限制,因为它无法使用分配给其他分区的吞吐量。 这会导致租户 C 和 D 的性能不佳,并导致其他物理分区和剩余租户中的计算容量空闲。 最终,此分区键会产生应用程序工作负载无法缩放的数据库设计。

该图显示了吞吐量热分区。

数据和请求均匀分布时,数据库的增长方式确保充分利用存储和吞吐量。 这将实现最佳的性能和最高的效率。 简而言之,数据库设计将可缩放。

该图显示了数据和请求均匀分布在各个分区中。

注意读取与写入

选择分区键时,还需要考虑数据是读取量大还是写入量大。 应使用基数高的分区键来分布写入量大的请求。

对于读取量大的工作负载,应确保查询由一个或有限数量的分区处理,其方法是在分区键上包含带有相等筛选器的 WHERE 子句,或在查询中的分区键值的子集上包含 IN 运算符。

如果应用程序工作负载的写入量和读取量都大,也有一个解决方案。 我们将在下一模块进行探讨。

下图显示了一个按用户名分区的容器。 该查询将仅命中一个逻辑分区,因此其性能将始终良好。

该图显示了用户名的分区查询。

按其他属性(例如 favoriteColor)进行筛选的查询会“扇出”到容器中的所有分区。 这又称为跨分区查询。 当容器很小且只占用一个分区时,这样的查询将按预期执行。 但随着容器增大,物理分区增多,此查询的速度将变慢,成本将变高,因为它需要检查每个分区才能获取结果,无论物理分区是否包含与查询相关的数据。

该图显示了针对首选颜色的跨分区查询。

为客户选择分区键

现在你已了解 Azure Cosmos DB 中的分区,接下来可决定客户数据的分区键。 如前所述,我们对客户执行 3 项操作:创建客户、更新客户和检索客户。 在这种情况下,我们将按客户 ID 检索客户。由于该操作的调用次数最多,因此将客户 ID 设置为容器的分区键是有意义的。

该图将客户分区键显示为 ID。

你可能会担心,将 ID 设置为分区键意味着我们拥有的逻辑分区将与客户人数一样多,每个逻辑分区只包含一个文档。 数以百万计的客户将产生数以百万计的逻辑分区。

但这完全没问题! 逻辑分区是一个虚拟概念,可拥有的逻辑分区数没有限制。 Azure Cosmos DB 会将多个逻辑分区分配到同一物理分区。 随着逻辑分区的数量或大小增加,Cosmos DB 会在需要时将其移动到新的物理分区。