Azure cosmosdb 如何为多个租户使用documentDB collection实现性能平衡?

Azure cosmosdb 如何为多个租户使用documentDB collection实现性能平衡?,azure-cosmosdb,Azure Cosmosdb,假设我有: 我的数据存储在documetDB的所有租户集合中。(即多个租户) 我以这样的方式配置集合:我的所有数据都均匀分布在所有分区上 但是分区并不是由每个租户负责的。我使用了其他的方案 因此,特定租户的数据分布在多个分区中 以下是我的问题: 对于读写数据来说,这是实现最大性能的正确方法吗 如果我想查询某个特定租户,该怎么办?编写此查询时有哪些注意事项 还有什么需要考虑的吗? 您所描述的是一个合理的解决方案,可以很好地避免数据倾斜和分区间的负载平衡。由于特定租户的查询需要触及所有分区,请记住将

假设我有:

  • 我的数据存储在documetDB的所有租户集合中。(即多个租户)
  • 我以这样的方式配置集合:我的所有数据都均匀分布在所有分区上
  • 但是分区并不是由每个租户负责的。我使用了其他的方案
  • 因此,特定租户的数据分布在多个分区中
  • 以下是我的问题:

  • 对于读写数据来说,这是实现最大性能的正确方法吗
  • 如果我想查询某个特定租户,该怎么办?编写此查询时有哪些注意事项
  • 还有什么需要考虑的吗?
    您所描述的是一个合理的解决方案,可以很好地避免数据倾斜和分区间的负载平衡。由于特定租户的查询需要触及所有分区,请记住将FeedOptions.EnableCrossPartitionQuery设置为true(REST API中的x-ms-documentdb-query-enablecrosspartition)


    DocumentDB站点还提供了一篇关于分区集合的优秀文章,以及选择分区键的一般技巧

    我会避免跨分区查询,它们会带来相当大的成本(基本上是索引和解析成本与分区数相乘-默认值为25)。这很容易尝试

    我更喜欢一种可以查询特定分区的解决方案,通常是按租户ID进行分区


    请记住,对于分区集合,每个分区(10K RU和10GB)都有限制-我在这里已经写过了

    这取决于您的使用模式以及租户大小的变化

    通常,对于多租户系统,99%的操作都在单个租户内。如果将tenantID设置为分区键,那么这些操作将只涉及单个分区。这不会使单个操作更快(延迟),但在多个租户的负载下可以提供巨大的吞吐量增益。但是,如果您只有5个租户,并且其中一个租户比所有其他租户大10倍,那么使用租户作为密钥将导致系统非常不平衡


    我们使用tenantID作为系统的分区键,它似乎工作得很好。我们已经讨论过,如果它变得非常不平衡,我们会怎么做,其中一个想法是将分区键设为tenantID+,以分割大租户。虽然我们还没有做到这一点,所以我们还没有计算出所有这些细节,以了解这是否真的可行和性能,但我们认为这是可行的。

    但是多分区查询与单分区查询相比,其成本影响是什么?从每查询成本的角度来看,查询多个分区或单个分区没有什么区别,因为RU成本取决于检索的数据量,而不管它们是否存储在单个分区中。从性能成本的角度来看,将查询分散到多个分区实际上可以很好地实现负载平衡,应该可以提高查询的性能。最后,从总成本的角度来看,分区集合的成本确实高于单个分区集合,因为您在多个分区中保留了更多的吞吐量。