在 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 分区机制中的相同常规原则也适用,下面介绍了一些特定于图形的优化。

Graph partitioning.

图形分区机制

以下指南介绍了 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 中的分区和缩放中详细了解如何创建适当的分区键。

  • 优化查询,以获取分区边界内的数据 。 最佳的分区策略与查询模式相符。 从单个分区获取数据的查询可提供最佳性能。

后续步骤

接下来可以继续阅读以下文章: