Dela via


Distribuera dataflöde mellan partitioner i Azure Cosmos DB för NoSQL

Som standard sprider Azure Cosmos DB etablerat dataflöde jämnt över alla fysiska partitioner. Men om din arbetsbelastning är skev– till exempel när vissa partitioner konsekvent behöver mer dataflöde på grund av frekventa nycklar eller ojämn trafik – kan du omdistribuera dataflödet för att optimera prestanda. Den här funktionen är tillgänglig för databaser och containrar med etablerat dataflöde (manuell eller autoskalning) och kan hanteras med hjälp av Azure Cosmos DB PowerShell- eller Azure CLI-kommandon.

Om du till exempel partitionerar data genom StoreId i ett detaljhandelsprogram kan vissa butiker ha högre aktivitet än andra. Om du märker frekvent hastighetsbegränsning (429 fel) för de upptagna butikerna kan du genom att omdistribuera dataflödet allokera fler resurser till de frekventa partitionerna, vilket förbättrar prestandan utan att öka det totala dataflödet.

Anmärkning

För närvarande är genomströmningserbjudandepolicy som standard inställd på "Lika". När dataflödet har omdistribueras med den här funktionen ställs principen nu in på "Anpassad", vilket bara gör att du kan ändra ditt dataflödeserbjudande via det här API:et. Ändring av dataflöde via Azure-portalen blockeras, men kunderna kan ändra tillbaka principen till "Lika" (se nedan) för att undvika detta.

Förutsättningar

  • Ett befintligt Azure Cosmos DB-konto
  • Senaste versionen av Azure CLI

    • cosmosdb-preview tillägget har installerats

      az extension add --name cosmosdb-preview
      
  • Senaste versionen av Azure PowerShell

    • Az.CosmosDB modul med förhandsversionsfunktioner aktiverade

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

Identifiera frekventa partitioner med hjälp av Azure Monitor-mått

Om du vill identifiera frekventa partitioner i Azure Cosmos DB med hjälp av Azure Monitor-mått undersöker du den normaliserade RU-förbrukningen för varje fysisk partition för att hitta partitionerna med oproportionerligt hög användning.

  1. Logga in på Azure Portal (https://portal.azure.com).

  2. Gå till avsnittet Insikter för Azure Cosmos DB-kontot i Azure-portalen.

  3. Välj Genomströmning.

  4. Öppna Normaliserad RU-förbrukning (%) av PartitionKeyRangeID.

  5. Filtrera efter din specifika databas och container.

  6. Granska diagrammet för varje PartitionKeyRangeId, som mappar till en fysisk partition.

  7. Identifiera alla PartitionKeyRangeId som konsekvent visar högre normaliserad RU-förbrukning än andra. Om ett värde till exempel alltid är 100 procent och andra ligger på 30 procent eller mindre, anger det här mönstret en frekvent partition.

    Skärmbild av diagrammet Normaliserad RU-förbrukning efter PartitionKeyRangeId som visar en frekvent partition med högre användning.

Identifiera heta partitioner med hjälp av diagnostikloggar

Använd informationen från CDBPartitionKeyRUConsumption i kontots diagnostikloggar för att lära dig vilka logiska partitionsnycklar och fysiska partitioner som förbrukar mest RU/s på sekundnivå.

  1. Gå till avsnittet Diagnostikloggar för Azure Cosmos DB-kontot.

  2. Hitta den fysiska partition (PartitionKeyRangeId) som förbrukar flest RU/s över tid med hjälp av den här frågan.

    CDBPartitionKeyRUConsumption 
    | where TimeGenerated >= ago(24hr)
    | where DatabaseName == "MyDB" and CollectionName == "MyCollection" // Replace with your database and collection name
    | where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId)
    | summarize sum(RequestCharge) by bin(TimeGenerated, 1s), PartitionKeyRangeId
    | render timechart
    
  3. För en fysisk partition hittar du de 10 viktigaste logiska partitionsnycklarna som förbrukar flest RU/s varje timme med hjälp av den här frågan.

    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 your PartitionKeyRangeId
    | summarize sum(RequestCharge) by bin(TimeGenerated, 1hour), PartitionKey
    | order by sum_RequestCharge desc | take 10
    

Tips/Råd

Dessa exempelfrågor använder 24 timmar som illustration, men det är bäst att använda minst sju dagars historik för att se användningsmönster.

Fastställa aktuellt dataflöde för varje fysisk partition

Om du vill kontrollera nuvarande RU/s för varje fysisk partition använder du Azure Monitor-måttet PhysicalPartitionThroughput och filtrerar efter PhysicalPartitionId. Om dataflödet per partition aldrig ändrades beräknar du RU/s per partition genom att dividera det totala antalet RU/s med antalet fysiska partitioner.

Läs aktuella RU/s på varje fysisk partition med hjälp az cosmosdb sql container retrieve-partition-throughputav .

// Container with dedicated RU/s - some partitions
az cosmosdb sql container retrieve-partition-throughput \
    --resource-group "<resource-group-name>" \
    --account-name "<cosmos-account-name>" \
    --database-name "<cosmos-database-name>" \
    --name "<cosmos-container-name>" \
    --physical-partition-ids "<space-separated-list-of-physical-partition-ids>"

// Container with dedicated RU/s - all partitions
az cosmosdb sql container retrieve-partition-throughput \
    --resource-group "<resource-group-name>" \
    --account-name "<cosmos-account-name>" \
    --database-name "<cosmos-database-name>" \
    --name "<cosmos-container-name>"
    --all-partitions

Använd Get-AzCosmosDBSqlContainerPerPartitionThroughput- eller Get-AzCosmosDBSqlDatabasePerPartitionThroughput-kommandot för att läsa de aktuella RU/s på varje fysisk partition.

# Container with dedicated RU/s - some partitions
$containerParams = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    Name = "<cosmos-container-name>"
    PhysicalPartitionIds = @("<PartitionId>", "<PartitionId>")
}
$somePartitionsDedicatedRUContainer = Get-AzCosmosDBSqlContainerPerPartitionThroughput @containerParams

# Container with dedicated RU/s - all partitions
$containerAllParams = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    Name = "<cosmos-container-name>"
    AllPartitions = $true
}
$allPartitionsDedicatedRUContainer = Get-AzCosmosDBSqlContainerPerPartitionThroughput @containerAllParams

# Database with shared RU/s - some partitions
$databaseParams = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    PhysicalPartitionIds = @("<PartitionId>", "<PartitionId>")
}
$somePartitionsSharedThroughputDatabase = Get-AzCosmosDBSqlDatabasePerPartitionThroughput @databaseParams

# Database with shared RU/s - all partitions
$databaseAllParams = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    AllPartitions = $true
}
$allPartitionsSharedThroughputDatabase = Get-AzCosmosDBSqlDatabasePerPartitionThroughput @databaseAllParams

Anmärkning

Mer information om hur du hittar antalet partitioner finns i metodtips för skalning av etablerat dataflöde (RU/s).

Beräkna dataflöde för målpartition

Nu ska vi bestämma hur många RU/s som ska ges till den hetaste fysiska partitionen. Anropa den här inställningen för målpartitionen.

Tänk på följande punkter innan du anger genomströmning på dina målpartitioner:

  • Du kan antingen minska eller öka dataflödet på partitionen.

  • Fysiska partitioner kan bara innehålla upp till 10 000 RU/s.

  • Användare kan ange dataflödet för en målpartition till ett maximalt värde på 20 000 RU/s.

    • Om partitionen anges till ett dataflödesvärde som är större än 10 000 RU/s resulterar det i partitionsdelningen, vilket kan ta lite tid.
  • Om du anger en partitions RU/s över 10 000 får den först 10 000 RU/s. Sedan delar Azure Cosmos DB automatiskt partitionen och distribuerar det angivna dataflödet jämnt över de nya partitionerna.

    • Om en fysisk partition använder 5 000 RU/s och du anger dess dataflöde till 15 000 RU/s tilldelar Azure Cosmos DB först 10 000 RU/s till den ursprungliga partitionen. Sedan delas partitionen automatiskt upp i två, var och en med upp till 7 500 RU/s.
  • Om den slutliga genomströmningen för alla partitioner inte är lika med den aktuella totala erbjudandets genomströmning, uppdaterar den här åtgärden erbjudandets genomströmning därefter.

Rätt metod beror på dina arbetsbelastningskrav. Allmänna metoder är:

  • Öka RU/s med en procentandel, mät frekvensen för 429 svar och upprepa tills du når önskat dataflöde.

    • Om du inte är säker på rätt procentandel, börja med 10% för att vara konservativ.

    • Om du vet att den här fysiska partitionen behöver det mesta av dataflödet börjar du med att justera RU/s. Dubbla RU/s eller öka dem till högst 10 000 RU/s, beroende på vilket som är lägre.

  • Öka RU/s till Total consumed RU/s of the physical partition + (Number of 429 responses per second * Average RU charge per request to the partition).

    • Den här metoden beräknar vad den "verkliga" RU/s-förbrukningen skulle vara om begärandena inte var hastighetsbegränsade.

Ändra dataflödet programmatiskt mellan partitioner

Du kan använda PowerShell-kommandot Update-AzCosmosDBSqlContainerPerPartitionThroughput för att omdistribuera dataflödet. Nu ska vi titta på ett exempel med en container som har totalt 6 000 RU/s (antingen 6 000 manuella RU/s eller autoskalning av 6 000 RU/s) och tre fysiska partitioner. I det här exemplet vill vi ha följande dataflödesdistribution:

Fysisk partition RU/s tilldelat
0 2 000
1 4,000
2 1,000

Efter omfördelningen uppdateras det totala erbjudandets kapacitet från 6 000 RU/s till 7 000 RU/s.

Uppdatera RU/s på varje fysisk partition med hjälp az cosmosdb sql container redistribute-partition-throughputav .

az cosmosdb sql container redistribute-partition-throughput \
    --resource-group "<resource-group-name>" \
    --account-name "<cosmos-account-name>" \
    --database-name "<cosmos-database-name>" \
    --name "<cosmos-container-name>" \
    --target-partition-info "<PartitionId3=Throughput PartitionId4=Throughput...>"

Update-AzCosmosDBSqlContainerPerPartitionThroughput Använd för containrar med dedikerade RU/s eller Update-AzCosmosDBSqlDatabasePerPartitionThroughput kommandot för databaser med delade RU/s för att omdistribuera dataflöde mellan fysiska partitioner. I databaser med delat dataflöde representerar en GUID-sträng de unika identifierarna för de fysiska partitionerna.

$TargetPhysicalPartitionObjects =  @()
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "0" -Throughput 2000
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "1" -Throughput 4000
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "2" -Throughput 1000

# Container with dedicated RU/s
$containerParams = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    Name = "<cosmos-container-name>"
    TargetPhysicalPartitionThroughputObject = $TargetPhysicalPartitionObjects
}
Update-AzCosmosDBSqlContainerPerPartitionThroughput @containerParams

Kontrollera genomströmningen efter omdistributionen

När du har distribuerat dataflödet kontrollerar du måttet PhysicalPartitionThroughput i Azure Monitor. Dela upp med dimensionen PhysicalPartitionId för att se hur många RU/s varje fysisk partition har. Om det behövs återställer du RU/s per fysisk partition för att fördela dataflödet jämnt över alla fysiska partitioner.

Viktigt!

När dataflödet har distribuerats om kan erbjudanden bara ändras med samma omdistribueringskommando. Om du vill distribuera dataflödet jämnt över alla partitioner använder du kommandot nedan.

Uppdatera RU/s på varje fysisk partition med hjälp az cosmosdb sql container redistribute-partition-throughput av parametern --evenly-distribute.

az cosmosdb sql container redistribute-partition-throughput \
    --resource-group "<resource-group-name>" \
    --account-name "<cosmos-account-name>" \
    --database-name "<cosmos-database-name>" \
    --name "<cosmos-container-name>" \
    --evenly-distribute 

Update-AzCosmosDBSqlContainerPerPartitionThroughput Använd kommandot för containrar med dedikerade RU/s eller Update-AzCosmosDBSqlDatabasePerPartitionThroughput kommandot för databaser med delade RU/s med parameter -EqualDistributionPolicy för att fördela RU/s jämnt över alla fysiska partitioner.

# Container with dedicated RU/s
$containerParams = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    Name = "<cosmos-container-name>"
    EqualDistributionPolicy = $true
}
$resetPartitionsDedicatedRUContainer = Update-AzCosmosDBSqlContainerPerPartitionThroughput @containerParams

# Database with dedicated RU/s
$databaseParams = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    EqualDistributionPolicy = $true
}
$resetPartitionsSharedThroughputDatabase = Update-AzCosmosDBSqlDatabasePerPartitionThroughput @databaseParams

Verifiera och övervaka dataflödesförbrukning

När du är klar med omdistribueringen av dataflödet kontrollerar och övervakar du ru/s-förbrukningen för att säkerställa optimala prestanda. Följ de här stegen:

  1. Gå till Mått-avsnittet i ditt Azure Cosmos DB-konto på Azure-portalen.

  2. Kontrollera måttet PhysicalPartitionThroughput i Azure Monitor. Dela upp efter dimensionen PhysicalPartitionId för att se RU/s tilldelade till varje fysisk partition.

  3. Övervaka din totala frekvens på 429 svar och RU/s-förbrukning.

  4. Granska normaliserad RU-förbrukning för varje partition.

    Anmärkning

    Högre normaliserad RU-förbrukning förväntas efter omfördelningen, eftersom RU/s allokeras närmare varje partitions behov. Mer information finns i normaliserad RU-förbrukning.

  5. Bekräfta att den totala frekvensen på 429 undantag har minskat. Frekventa partitioner bör nu ha fler RU/s, vilket minskar hastighetsbegränsningen och förbättrar prestandan.

Begränsningar

Även om den här funktionen är i förhandsprogrammet måste ditt Azure Cosmos DB-konto uppfylla följande kriterier:

  • Ditt Azure Cosmos DB-konto använder API för NoSQL eller API för MongoDB.

    • Om du använder API för MongoDB måste versionen vara större än eller lika med 3.6.
  • Ditt Azure Cosmos DB-konto använder etablerat dataflöde (manuell eller autoskalning). Distribution av dataflöde mellan partitioner gäller inte för serverlösa konton.