共用方式為

在 Azure Cosmos DB 中使用分区图

重要

你是否正在寻找一种数据库解决方案,以应对需要高扩展性、99.999% 可用性服务级别协议(SLA)、即时自动扩展和跨多个区域的自动故障转移的场景? 请考虑 Azure Cosmos DB for NoSQL

Azure Cosmos DB 中 Gremlin API 的主要功能之一是能够通过水平缩放处理大规模图形。 容器可以在存储和吞吐量方面独立缩放。 可以在 Azure Cosmos DB 中创建可自动缩放以存储图形数据的容器。 数据根据指定的 分区键自动均衡。

如果容器的大小应超过 20 GB,或者想要每秒分配超过 10,000 个请求单位(RU),则分区将在内部完成。 数据根据指定的分区键自动分区。 从 Azure 门户或使用 3.x 或更高版本的 Gremlin 驱动程序创建图形容器时,分区键是必需的。 如果使用 2.x 或更低版本的 Gremlin 驱动程序,则不需要分区键。

Azure Cosmos DB 分区机制中的相同一般原则适用于下面所述的一些特定于图形的优化。

图形分区。

图形分区机制

以下指南介绍了 Azure Cosmos DB 中的分区策略如何运行:

  • 顶点和边缘都存储为 JSON 文档

  • 顶点需要分区键。 此键将确定顶点将通过哈希算法存储在哪个分区中。 创建新容器时定义分区键属性名称,其格式如下: /partitioning-key-name

  • 边缘将与其源顶点一起存储。 换句话说,对于每个顶点,其分区键定义它们的存储位置及其传出边缘。 此优化是为了避免在图形查询中使用 out() 基数时进行跨分区查询。

  • 边缘包含指向其顶点的引用。 所有边缘都存储有它们指向的顶点的分区键和 ID。 此计算使所有 out() 方向查询始终是范围分区查询,而不是盲目的跨分区查询。

  • 图形查询需要指定分区键。 若要充分利用 Azure Cosmos DB 中的水平分区,应尽可能选择单个顶点时指定分区键。 下面是在分区图中选择一个或多个顶点的查询:

    • /id/label 不能作为容器的分区键在 API for Gremlin 中使用。

    • 按 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 的分区和缩放中创建适当的分区键。

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