Freigeben über


Neuverteilung des Durchsatzes zwischen Partitionen

GILT FÜR: MongoDB

Standardmäßig verteilt Azure Cosmos DB den bereitgestellten Durchsatz einer Datenbank oder eines Containers gleichmäßig zwischen allen physischen Partitionen. Es können jedoch Szenarios auftreten, in denen bestimmte logische (und daher physische) Partitionen aufgrund einer Schiefe in der Workload oder wegen des ausgewählten Partitionsschlüssels mehr Durchsatz benötigen als andere. In diesen Szenarios können Sie den bereitgestellten Durchsatz mit Azure Cosmos DB zwischen physischen Partitionen neu verteilen. Durch die Neuverteilung von Durchsatz zwischen Partitionen können Sie bessere Leistungen erzielen, ohne den Gesamtdurchsatz auf Grundlage der am stärksten ausgelasteten Partition konfigurieren zu müssen.

Das Feature zum Neuverteilen des Durchsatzes ist auf Datenbanken und Container anwendbar, in denen (manuell und automatisch skalierter) bereitgestellter Durchsatz verwendet wird. Es kann jedoch nicht auf serverlose Container angewendet werden. Sie können den Durchsatz pro physischer Partition mit den PowerShell- oder Azure CLI-Befehlen für Azure Cosmos DB ändern.

Verwendung dieses Features

Im Allgemeinen wird die Verwendung dieses Features für Szenarios empfohlen, in denen Folgendes zutrifft:

  • Bei einigen Partitionen einer Sammlung sehen Sie immer 100 % normalisierte Auslastung.
  • Sie sehen immer eine höhere Latenz als die Akzeptanz.

Wenn der RU-Verbrauch nicht bei 100 % liegt und Ihre End-zu-End-Wartezeit akzeptabel ist, sind keine Maßnahmen zur Neukonfiguration der RU/Sek. für die einzelnen Partitionen erforderlich.
Wenn Sie über eine Workload mit konstantem Datenverkehr und gelegentlichen unvorhersehbaren Spitzen in allen Partitionen verfügen, wird empfohlen, Autoskalierung und Burstkapazität zu verwenden. Durch die Autoskalierung und die Burstkapazität wird sichergestellt, dass Sie Ihre Durchsatzanforderungen erfüllen können. Wenn Sie über eine geringe Anzahl von RU/Sek. pro Partition verfügen, können Sie auch die Partitionszusammenführung verwenden, um die Anzahl der Partitionen zu verringern und mehr RU/Sek. pro Partition für denselben bereitgestellten Gesamtdurchsatz sicherzustellen.

Beispielszenario

Angenommen, wir haben eine Workload, mit der Transaktionen in Einzelhandelsgeschäften nachverfolgt werden. Da die meisten unserer Abfragen nach der StoreId erfolgen, partitionieren wir nach der StoreId. Im Laufe der Zeit wird jedoch deutlich, dass in einigen Geschäften mehr Aktivitäten zu verzeichnen sind als in anderen und mehr Durchsatz zur Verarbeitung der Workloads erforderlich ist. Wir sehen einen normalisierten RU-Verbrauch von 100% für Anforderungen gegen diese StoreIds. Außerdem sind andere Geschäfte weniger aktiv und erfordern weniger Durchsatz. Sehen wir uns an, wie wir unseren Durchsatz neu verteilen können, um die Leistung zu verbessern.

Schritt 1: Ermitteln, welche physischen Partitionen mehr Durchsatz benötigen

Wir können auf zwei Arten ermitteln, ob eine Partition stark ausgelastet ist.

Option 1: Verwenden von Azure Monitor-Metriken

Um zu überprüfen, ob eine heiße Partition vorliegt, wechseln Sie zu Erkenntnisse>Durchsatz>Normalisierter RU-Verbrauch (%) nach PartitionKeyRangeID. Filtern Sie nach einer bestimmten Datenbank und einem bestimmten Container.

Jede PartitionKeyRangeId ist einer physischen Partition zugeordnet. Suchen Sie nach einer PartitionKeyRangeId, die durchgängig einen höheren normalisierten RU-Verbrauch aufweist als andere. Ein Wert liegt beispielsweise durchgängig bei 100 %, andere liegen jedoch bei 30 % oder weniger. Ein Muster wie dieses kann auf eine stark ausgelastete Partition hindeuten.

Screenshot von „Normalisierter RU-Verbrauch nach PartitionKeyRangeId“ mit heißer Partition.

Option 2: Verwenden von Diagnoseprotokollen

Wir können die Informationen aus CDBPartitionKeyRUConsumption in den Diagnoseprotokollen verwenden, um weitere Informationen zu logischen Partitionsschlüsseln (und den zugehörigen physischen Partitionen) zu erhalten, die die meisten RU/Sek. auf der zweiten Ebene der Granularität verbrauchen. Beachten Sie, dass die Beispielabfragen zur Veranschaulichung 24 Stunden verwenden. Es wird empfohlen, einen Verlauf von sieben Tagen zu nutzen, um das Muster zu verstehen.

Suchen Sie die physische Partition (PartitionKeyRangeId), die im Laufe der Zeit die meisten RU/Sek. verbraucht.

CDBPartitionKeyRUConsumption 
| where TimeGenerated >= ago(24hr)
| where DatabaseName == "MyDB" and CollectionName == "MyCollection" // Replace with database and collection name
| where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId)
| summarize sum(RequestCharge) by bin(TimeGenerated, 1m), PartitionKeyRangeId
| render timechart

Ermitteln Sie für eine bestimmte physische Partition die zehn wichtigsten logischen Partitionsschlüssel, die stündlich die meisten RU/Sek. verbrauchen.

CDBPartitionKeyRUConsumption 
| where TimeGenerated >= ago(24hour)
| where DatabaseName == "MyDB" and CollectionName == "MyCollection" // Replace with database and collection name
| where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId)
| where PartitionKeyRangeId == 0 // Replace with PartitionKeyRangeId 
| summarize sum(RequestCharge) by bin(TimeGenerated, 1hour), PartitionKey
| order by sum_RequestCharge desc | take 10

Schritt 2: Ermitteln der Ziel-RU/Sek. für jede physische Partition

Ermitteln der RU/Sek. für jede physische Partition

Bestimmen wir zunächst die aktuellen RU/Sek. für jede physische Partition. Sie können die Azure Monitor-Metrik PhysicalPartitionThroughput verwenden und durch die Dimension PhysicalPartitionId teilen, um zu ermitteln, wie viele RU/s für jede physische Partition zur Verfügung stehen.

Alternativ können Sie die folgende Formel verwenden, wenn Sie den Durchsatz pro Partition noch nicht geändert haben: Current RU/s per partition = Total RU/s / Number of physical partitions.

Befolgen Sie die Anweisungen im Artikel Bewährte Methoden zum Skalieren von bereitgestelltem Durchsatz (RU/Sek.), um die Anzahl der physischen Partitionen zu bestimmen.

Sie können auch die PowerShell-Befehle Get-AzCosmosDBSqlContainerPerPartitionThroughput und Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput verwenden, um die aktuellen RU/Sek. für die einzelnen physischen Partitionen zu lesen.

Verwenden Sie Install-Module, um das Modul Az.CosmosDB mit aktivierten Vorabfeatures zu installieren.

$parameters = @{
    Name = "Az.CosmosDB"
    AllowPrerelease = $true
    Force = $true
}
Install-Module @parameters

Verwenden Sie den Befehl Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput, um die aktuellen RU/s für jede physische Partition zu lesen.

// Container with dedicated RU/s
$somePartitionsDedicatedRUContainer = Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -Name "<cosmos-collection-name>" `
                    -PhysicalPartitionIds ("<PartitionId>", "<PartitionId">, ...)

$allPartitionsDedicatedRUContainer = Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -Name "<cosmos-collection-name>" `
                    -AllPartitions

// Database with shared RU/s
$somePartitionsSharedThroughputDatabase = Get-AzCosmosDBMongoDBDatabasePerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -PhysicalPartitionIds ("<PartitionId>", "<PartitionId">)

$allPartitionsSharedThroughputDatabase = Get-AzCosmosDBMongoDBDatabasePerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -AllPartitions

Ermitteln der RU/Sek. für die Zielpartition

Als Nächstes entscheiden wir, wie viele RU/Sek. wir den am stärksten ausgelasteten physischen Partitionen zur Verfügung stellen möchten. Wir bezeichnen diese Gruppe als unsere Zielpartition(en). Eine physische Partition kann maximal 10.000 RU/Sek. enthalten.

Welcher Ansatz der richtige ist, hängt von den Anforderungen an die Workload ab. Zu den allgemeinen Ansätzen gehören:

  • Erhöhen Sie die RU/Sek. um 10 Prozent, und wiederholen Sie dies, bis der gewünschte Durchsatz erreicht wird.
    • Wenn Sie nicht sicher sind, welcher Prozentsatz der richtige ist, können Sie vorsichtig mit 10 % beginnen.
    • Wenn Sie bereits wissen, dass diese physische Partition den größten Teil des Durchsatzes der Workload benötigt, können Sie die RU/Sek. verdoppeln oder sie auf das Maximum von 10.000 RU/Sek. erhöhen, je nachdem, welcher Wert niedriger ist.

Ermitteln der RU/Sek. für die Quellpartition

Schließlich müssen wir entscheiden, wie viele RU/Sek. wir für die anderen physischen Partitionen einplanen möchten. Diese Auswahl bestimmt die Partitionen, von denen die physische Zielpartition Durchsatz übernimmt.

In den PowerShell-APIs müssen wir mindestens eine Quellpartition angeben, von der die RU/Sek. neu verteilt werden sollen. Wir können auch einen benutzerdefinierten Mindestdurchsatz angeben, den jede physische Partition nach der Neuverteilung haben soll. Wenn keine Angaben gemacht werden, stellt Azure Cosmos DB standardmäßig sicher, dass jede physische Partition nach der Neuverteilung über mindestens 100 RU/Sek. verfügt. Es wird empfohlen, den Mindestdurchsatz explizit anzugeben.

Welcher Ansatz der richtige ist, hängt von den Anforderungen an die Workload ab. Zu den allgemeinen Ansätzen gehören:

  • Gleichmäßige Nutzung der RU/Sek. aus allen Quellpartitionen (funktioniert am besten, wenn es <= 10 Partitionen gibt)
    • Berechnen Sie die Menge, um die wir jede physische Quellpartition ausgleichen müssen. Offset = Total desired RU/s of target partition(s) - total current RU/s of target partition(s)) / (Total physical partitions - number of target partitions)
    • Weisen Sie den Mindestdurchsatz für jede Quellpartition = Current RU/s of source partition - offset zu.
  • Nutzung der RU/Sek. aus den am wenigsten aktiven Partitionen
    • Verwenden Sie die Azure Monitor-Metriken und die Diagnoseprotokolle, um zu ermitteln, welche physischen Partitionen das geringste Datenverkehrs- bzw. Anforderungsvolumen aufweisen.
    • Berechnen Sie die Menge, um die wir jede physische Quellpartition ausgleichen müssen. Offset = Total desired RU/s of target partition(s) - total current RU/s of target partition) / Number of source physical partitions
    • Weisen Sie den Mindestdurchsatz für jede Quellpartition = Current RU/s of source partition - offset zu.

Schritt 3: Programmgesteuertes Ändern des Durchsatzes in Partitionen

Sie können den PowerShell-Befehl Update-AzCosmosDBSqlContainerPerPartitionThroughput verwenden, um den Durchsatz neu zu verteilen.

Um das folgende Beispiel zu verstehen, gehen wir von einem Container mit insgesamt 6000 RU/Sek. (entweder 6000 manuell skalierte RU/Sek. oder 6000 automatisch skalierte RU/Sek.) und drei physischen Partitionen aus. Ausgehend von unserer Analyse benötigen wir das folgende Layout:

  • Physische Partition 0: 1000 RU/Sek.
  • Physische Partition 1: 4000 RU/Sek.
  • Physische Partition 2: 1000 RU/Sek.

Wir geben die Partitionen 0 und 2 als Quellpartitionen an, und bestimmen, dass sie nach der Neuverteilung über mindestens 1000 RU/Sek. verfügen sollten. Partition 1 ist unsere Zielpartition, für die wir angeben, dass sie über 4000 RU/Sek. verfügen soll.

Verwenden Sie Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput für Sammlungen mit dedizierten RU/s oder den Befehl Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput für Datenbanken mit gemeinsam genutzten RU/s, um den Durchsatz über physische Partitionen hinweg neu zu verteilen. In Datenbanken mit gemeinsam genutztem Durchsatz werden die IDs der physischen Partitionen durch eine GUID-Zeichenfolge dargestellt.

$SourcePhysicalPartitionObjects =  @()
$SourcePhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "0" -Throughput 1000
$SourcePhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "2" -Throughput 1000

$TargetPhysicalPartitionObjects =  @()
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "1" -Throughput 4000

// Collection with dedicated RU/s
Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput `
    -ResourceGroupName "<resource-group-name>" `
    -AccountName "<cosmos-account-name>" `
    -DatabaseName "<cosmos-database-name>" `
    -Name "<cosmos-collection-name>" `
    -SourcePhysicalPartitionThroughputObject $SourcePhysicalPartitionObjects `
    -TargetPhysicalPartitionThroughputObject $TargetPhysicalPartitionObjects

// Database with shared RU/s
Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput `
    -ResourceGroupName "<resource-group-name>" `
    -AccountName "<cosmos-account-name>" `
    -DatabaseName "<cosmos-database-name>" `
    -SourcePhysicalPartitionThroughputObject $SourcePhysicalPartitionObjects `
    -TargetPhysicalPartitionThroughputObject $TargetPhysicalPartitionObjects

Nach der Neuverteilung können Sie die Änderung überprüfen, indem Sie die Metrik PhysicalPartitionThroughput in Azure Monitor anzeigen. Teilen Sie die Dimension PhysicalPartitionId, um zu ermitteln, wie viele RU/Sek. pro physischer Partition vorhanden sind.

Falls erforderlich, können Sie auch die RU/Sek. pro physische Partition zurücksetzen, damit die RU/Sek. Ihres Containers gleichmäßig auf alle physischen Partitionen verteilt werden.

Verwenden Sie den Befehl Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput für Sammlungen mit dedizierten RU/s oder den Befehl Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput für Datenbanken mit gemeinsam genutzten RU/s mit dem Parameter -EqualDistributionPolicy, um die RU/s über alle physischen Partitionen hinweg neu zu verteilen.

// Collection with dedicated RU/s
Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput `
    -ResourceGroupName "<resource-group-name>" `
    -AccountName "<cosmos-account-name>" `
    -DatabaseName "<cosmos-database-name>" `
    -Name "<cosmos-collection-name>" `
    -EqualDistributionPolicy

// Database with shared RU/s
Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput `
    -ResourceGroupName "<resource-group-name>" `
    -AccountName "<cosmos-account-name>" `
    -DatabaseName "<cosmos-database-name>" `
    -EqualDistributionPolicy

Schritt 4: Überprüfen und Überwachen des Verbrauchs der RU/Sek.

Nach der Neuverteilung können Sie die Änderung überprüfen, indem Sie die Metrik PhysicalPartitionThroughput in Azure Monitor anzeigen. Teilen Sie die Dimension PhysicalPartitionId, um zu ermitteln, wie viele RU/Sek. pro physischer Partition vorhanden sind.

Es wird empfohlen, Ihren normalisierten RU-Verbrauch pro Partition zu überwachen. Weitere Informationen dazu, wie Sie überprüfen können, ob die erwartete Leistung erreicht wurde, finden Sie in Schritt 1.

Nach den Änderungen und unter der Voraussetzung, dass sich Ihre gesamte Workload nicht geändert hat, werden Sie wahrscheinlich feststellen, dass sowohl die physischen Ziel- als auch die Quellpartitionen einen höheren normalisierten RU-Verbrauch als zuvor haben. Ein höherer normalisierter RU-Verbrauch ist zu erwarten. Im Wesentlichen haben Sie RU/Sek. zugewiesen, die dem tatsächlichen Bedarf jeder Partition eher entsprechen, so dass ein höherer normalisierter RU-Verbrauch bedeutet, dass jede Partition die ihr zugewiesenen RU/Sek. voll ausschöpft. Außerdem ist zu erwarten, dass die Gesamtzahl der 429 Ausnahmen sinkt, da den stark ausgelasteten Partitionen nun mehr RU/Sek. für die Verarbeitung von Anforderungen zur Verfügung stehen.

Einschränkungen

Vorschauberechtigungskriterien

Zum Verwenden der Vorschau muss Ihr Azure Cosmos DB-Konto alle der folgenden Kriterien erfüllen:

  • Ihr Azure Cosmos DB-Konto verwendet die API für MongoDB.
    • Die Version muss >=3.6 sein.
  • Das Azure Cosmos DB-Konto verwendet den bereitgestellten Durchsatz (manuelle oder Autoskalierung). Die Verteilung des Durchsatzes auf Partitionen gilt nicht für serverlose Konten.

Sie müssen sich nicht registrieren, um die Vorschau verwenden zu können. Verwenden Sie zur Nutzung des Features die PowerShell- oder Azure CLI-Befehle, um den Durchsatz auf die physischen Partitionen Ihrer Ressourcen neu zu verteilen.

Nächste Schritte

In den folgenden Artikeln erfahren Sie, wie Sie den bereitgestellten Durchsatz verwenden können: