在 Azure Cosmos DB 中使用分区图形
适用对象: Gremlin
Azure Cosmos DB 中 API for Gremlin 的重要功能之一是通过横向缩放处理大规模图形。 容器可以在存储和吞吐量方面独立缩放。 可以在 Azure Cosmos DB 中创建自动缩放的容器以存储图形数据。 数据根据指定的分区键自动均衡 。
如果预计容器的存储大小超过 20 GB,或者希望每秒分配超过 10,000 个请求单位 (RU),则需要进行内部分区。 根据指定的分区键自动对数据进行分区。 如果从 Azure 门户或 Gremlin 驱动程序的 3.x 或更高版本创建图形容器,则需要分区键。 如果使用 Gremlin 驱动程序的 2.x 或更低版本,则不需要分区键。
Azure Cosmos DB 分区机制中的相同常规原则也适用,下面介绍了一些特定于图形的优化。
图形分区机制
以下指南介绍了 Azure Cosmos DB 中分区策略的运作方式:
顶点和边缘作为 JSON 文档存储 。
顶点需要分区键。 此键通过哈希算法确定在哪个分区中存储顶点。 创建新容器时将定义分区键属性名称,其格式为
/partitioning-key-name
。边缘连同其源顶点一起存储。 换句话说,对于每个顶点,其分区键定义它们与其传出边缘一起存储的位置。 进行此优化是为了避免在图形查询中使用
out()
基数时出现跨分区查询。边缘包含对其指向的顶点的引用。 所有边缘在存储时,都有分区键以及边缘指向的顶点的 ID。 此计算使得所有
out()
方向查询始终是带范围的分区查询,而不是跨分区的盲查询。图形查询需要指定分区键。 若要充分利用 Azure Cosmos DB 中的水平分区,选择单个顶点时应尽量指定分区键。 下面是用于在分区图形中选择一个或多个顶点的查询:
在 API for Gremlin 中,不支持将
/id
和/label
作为容器的分区键。根据 ID 选择顶点,然后使用
.has()
步骤指定分区键属性:g.V('vertex_id').has('partitionKey', 'partitionKey_value')
通过指定包含分区键值和 ID 的元组选择顶点:
g.V(['partitionKey_value', 'vertex_id'])
选择一组带 ID 的顶点并指定分区键值列表:
g.V('vertex_id0', 'vertex_id1', 'vertex_id2', …).has('partitionKey', within('partitionKey_value0', 'partitionKey_value01', 'partitionKey_value02', …)
在查询开始时使用分区策略,并指定一个分区,用于 Gremlin 查询余下部分的范围:
g.withStrategies(PartitionStrategy.build().partitionKey('partitionKey').readPartitions('partitionKey_value').create()).V()
使用分区图形时的最佳做法
将分区图形用于无限制容器时,请使用以下指南以确保性能和可伸缩性:
查询顶点时始终指定分区键值。 从已知的分区获取顶点是一种实现性能的方法。 所有后续的邻接操作将始终局限于某个分区,因为边缘包含其目标顶点的引用 ID 和分区键。
查询边缘时尽量使用传出方向。 如上所述,边缘连同其源顶点一起朝传出方向存储。 在设计数据和查询时考虑了此模式时,则可以最大程度地减少出现跨分区查询的可能性。 相反,
in()
查询将始终是开销巨大的扇出查询。选择可将数据均匀分配到不同分区的分区键。 此决策在很大程度上取决于解决方案的数据模型。 请在 Azure Cosmos DB 中的分区和缩放中详细了解如何创建适当的分区键。
优化查询,以获取分区边界内的数据 。 最佳的分区策略与查询模式相符。 从单个分区获取数据的查询可提供最佳性能。
后续步骤
接下来可以继续阅读以下文章: