Freigeben über


Neuverteilen von Durchsatz zwischen Partitionen (Vorschau)

GILT FÜR: NoSQL 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:

  • Sie verzeichnen durchgängig eine Gesamtrate von mehr als 1–5 % bei 429 Antworten.
  • Sie verfügen über eine konsistente, vorhersagbare und stark ausgelastete Partition.

Wenn Sie keine 429 Antworten erhalten und Ihre durchgängige Latenz 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, die Autoskalierung und die Burstkapazität (Vorschau) 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/s pro Partition verfügen, können Sie auch die Partitionszusammenführung (Vorschau) verwenden, um die Anzahl der Partitionen zu verringern und mehr RU/s 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. Es gibt eine Ratenbegrenzung (429) für Anforderungen für diese StoreIds, und unsere Gesamtrate von 429 Antworten ist größer als 1–5 %. 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, 1s), 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-AzCosmosDBSqlContainerPerPartitionThroughput oder Get-AzCosmosDBSqlDatabasePerPartitionThroughput, um die aktuellen RU/s für jede physische Partition zu lesen.


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

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

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

$allPartitionsSharedThroughputDatabase = Get-AzCosmosDBSqlDatabasePerPartitionThroughput `
                    -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 einen Prozentsatz, messen Sie die Rate der 429 Antworten, und wiederholen Sie den Vorgang, bis der gewünschte Durchsatz erreicht ist.
    • 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.
  • Erhöhen der RU/Sek. auf Total consumed RU/s of the physical partition + (Number of 429 responses per second * Average RU charge per request to the partition)
    • Bei diesem Ansatz wird abgeschätzt, wie hoch der „tatsächliche“ Verbrauch an RU/Sek. gewesen wäre, wenn die Anforderungen nicht ratenbegrenzt gewesen wären.

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-AzCosmosDBSqlContainerPerPartitionThroughput für Container mit dedizierten RU/s oder den Befehl Update-AzCosmosDBSqlDatabasePerPartitionThroughput für Datenbanken mit freigegebenen RU/s, um den Durchsatz auf physische Partitionen 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

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

// Database with shared RU/s
Update-AzCosmosDBSqlDatabasePerPartitionThroughput `
    -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-AzCosmosDBSqlContainerPerPartitionThroughput für Container mit dedizierten RU/s oder den Befehl Update-AzCosmosDBSqlDatabasePerPartitionThroughput für Datenbanken mit gemeinsam genutzten RU/s mit dem Parameter -EqualDistributionPolicy, um die RU/s über alle physischen Partitionen hinweg neu zu verteilen.


// Container with dedicated RU/s
$resetPartitionsDedicatedRUContainer = Update-AzCosmosDBSqlContainerPerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -Name "<cosmos-container-name>" `
                    -EqualDistributionPolicy

// Database with dedicated RU/s
$resetPartitionsSharedThroughputDatabase = Update-AzCosmosDBSqlDatabasePerPartitionThroughput `
                    -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, die Gesamtrate der 429 Antworten und den Verbrauch der RU/Sek. 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 NoSQL oder die API für MongoDB.
    • Wenn Sie die API für MongoDB verwenden, muss die Version >= 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: