自动放大/缩小Cosmos DB RU

时间:2018-02-06 23:35:26

标签: azure-cosmosdb

由于一段时间内高流量的爆发,我们遇到了限制(429)。为了缓解这个问题,我们目前增加了天蓝色门户中的RU,并在以后减少它。

我想根据指标扩展/缩小,但是,它不会公开为文档数据库容器创建的物理分区数。

  • 如何获取文档数据库容器的物理分区数?
  • 如果这个群体中有人解决了自动缩放问题,我很想知道怎么做?

5 个答案:

答案 0 :(得分:5)

所需的RU限制的基础

我根本不会进入物理分区级别,因为无论如何负载可能不会均匀地分布在分区上。我假设您可能不关心平均分区吞吐量,但需要处理最糟糕的分区吞吐量。

因此,如果您需要完全自动缩放,那么我将专注于跟踪限制事件(事后发生)或监视总RU使用(分区魔术)。这两条路径都可以变得非常复杂,以实现真正的自动缩放,并且可能需要这些路径的组合。虽然升级似乎是可以实现的,然后决定何时回归到什么级别是更棘手的。

在事情发生之前很难预料到意外事件会对事情做出可靠反应。与简单的解决方案相比,绝对可以考虑在您的方案中是否值得。

基于日历的RU限制基线

更简单的解决方案是在平均峰值负荷趋势之后将RU限制设定为准备好的时间表(即工作日+时间)。

这不会因意外的峰值或跌落而自动调整,并且需要进行一些监控以适应意外情况,但无论如何你都有,对吗? 这样简单的解决方案将为您提供灵活的吞吐量限制和平均日的可预测成本,而且工作量极小。

更改RU限制

一旦你知道在任何给定时间你想要什么RU限制,那么执行它很容易。可以编程增加 - 减少或RU限制,例如,通过Azure functions。实际更改限制的C#示例将是:

var offer = client.CreateOfferQuery()
    .Where(r => r.ResourceLink == collection.SelfLink).Single();
offer = new OfferV2(offer, newthroughput);
client.ReplaceOfferAsync(offer);

您的Azure功能可能会定期打勾,并根据您配置的计划或收集的事件相应地调整newthroughput

注意事项

无论您实施何种自动缩放解决方案,都要考虑为您愿意花多少钱设置合理的硬限制。否则,如果发生意外或恶意活动(DDOS),您可能会收到来自Azure的意外账单。在某些时候节流是更好的。

答案 1 :(得分:2)

https://github.com/giorgited/CosmosScale

我写了这个库来帮助自动缩放。我们使用azure函数在早上进行缩放,而在晚上进行缩放,但意识到这种方法不那么有效。

上述库将按比例增加到用户提供的所需RU的最大值,并在不活动时按比例减小。它对批量操作的处理方式与对单个操作的处理方式有所不同,有关完整信息(包括基准统计信息),请参见github。

免责声明:我是该图书馆的作者。

答案 2 :(得分:1)

这是使用 Azure Function 2.0

来增加/减少RU的实现
Restaurant.find()
.populate('menu')
.then(result =>{
    console.log(result);
    res.status(200).json({
        message: "Fetched",
        restaurants: result
    });
});  

答案 3 :(得分:1)

现在有一个最新的答案(截至2019-11-19):“自动驾驶”功能(当前在“预览”中)将自动执行放大和缩小。

在撰写本文时,可以在Azure门户上Cosmos DB帐户的“预览功能”刀片中找到它。一旦退出预览,它显然将移动。最新的说明应该在这里找到:https://docs.microsoft.com/en-us/azure/cosmos-db/provision-throughput-autopilot

答案 4 :(得分:0)

Autoscale现在可以在GA中使用无服务器预览。更多详细信息:https://devblogs.microsoft.com/cosmosdb/autoscale-serverless-offers/