【问题标题】:When do physical partitions get created?什么时候创建物理分区?
【发布时间】:2018-05-14 11:12:29
【问题描述】:

我有一个使用 5 位成员代码作为其分区键的分区集合。集合中可能有数千个分区键。

我在其中插入了大约 32K 文档。使用Partition Stats 示例:

Summary:
        partitions: 1
        documentsCount: 32,190
        documentsSize: 0.045 GB

但是只有一个物理分区!如果我使用门户指标,我会看到类似的情况:

这是否意味着我的所有查询都针对单个物理分区? Cosmos 什么时候添加更多物理分区?

我问的原因是因为我看到性能非常差,当我加载测试时会严重恶化。例如,这种简单的计数方法在轻量级测试中开始很快,然后在系统处于压力下时需要几秒钟(忽略handler 的东西):

    private async Task<int> RetrieveDigitalMembershipRefreshItemsCount(string code, string correlationId)
    {
        var error = "";
        double cost = 0;
        var handler = HandlersFactory.GetProfilerHandler(_loggerService, _settingService);
        handler.Start(LOG_TAG, "RetrieveDigitalMembershipRefreshItemsCount", correlationId);

        try
        {
            if (this._docDbClient == null)
                throw new Exception("No singleton DocDb client!");

            // Check to see if there is a URL
            if (string.IsNullOrEmpty(_docDbDigitalMembershipsCollectionName))
                throw new Exception("No Digital Memberships collection defined!");

            FeedOptions queryOptions = new FeedOptions { MaxItemCount = 1, PartitionKey = new Microsoft.Azure.Documents.PartitionKey(code.ToUpper()) };

            return await _docDbClient.CreateDocumentQuery<DigitalMembershipDeviceRegistrationItem>(
                        UriFactory.CreateDocumentCollectionUri(_docDbDatabaseName, _docDbDigitalMembershipsCollectionName), queryOptions)
                        .Where(e => e.CollectionType == DigitalMembershipCollectionTypes.RefreshItem && e.Code.ToUpper() == code.ToUpper())
                        .CountAsync();
        }
        catch (Exception ex)
        {
            error = ex.Message;
            throw new Exception(error);
        }
        finally
        {
            handler.Stop(error, cost, new
            {
                Code = code
            });
        }
    }

这是此方法的日志,因为测试按最长持续时间排序。最初只需要几毫秒:

我尝试了大多数性能技巧,即直接模式、相同区域、单例。任何帮助将非常感激。

谢谢。

【问题讨论】:

    标签: azure azure-cosmosdb


    【解决方案1】:

    Partition Key 用于逻辑分区,跨物理分区分布数据。物理分区管理由 Azure Cosmos DB 管理。

    只要初始容器的吞吐量至少为 1000 RU/s 并且指定了分区键,就可以实现物理分区的自动拆分。拆分主要是将一个物理分区中的逻辑分区分配给不同的物理分区。而且这个过程对我们来说是透明的。

    物理分区的两种场景:

    • 配置吞吐量高于设置值,Azure Cosmos DB 会拆分一个或多个物理分区以支持更高的吞吐量。
    • 物理分区p 达到其存储限制,Azure Cosmos DB 将p 无缝拆分为两个新的物理分区。如果p 内部只有一个逻辑分区,则不会发生拆分。

    因此,如果不满足这些条件,则您只有一个物理分区。但是查询是针对使用分区键的指定逻辑分区进行的。

    更多详情请参考Azure Cosmos DB partition

    【讨论】:

    • 感谢您的解释。我从 Cosmos 获得了非常糟糕的性能......当我运行负载测试时,一些查询需要几秒钟的时间,其中多个线程访问 API(在应用服务中运行,而应用服务又访问 Cosmos)并且我看到 API 服务器上的 CPU 使用率很高.当它运行时,一切似乎都很好。但它在压力下严重弯曲。所以我认为这与物理分区有关。我尝试了我发现的大多数性能技巧。门户指标中没有 429...我在分区集合上使用 1000 吞吐量。你有什么我可以尝试的指示吗?谢谢。
    • 我添加了代码示例并将日志记录到原始帖子中,这样您就可以看到我在做什么。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 2012-03-25
    • 2012-08-05
    • 2019-06-13
    • 2014-02-07
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多