Partilhar via


Redistribuir a taxa de transferência entre partições no Azure Cosmos DB para NoSQL

Por padrão, o Azure Cosmos DB distribui a taxa de transferência provisionada uniformemente em todas as partições físicas. No entanto, se sua carga de trabalho estiver distorcida, como quando certas partições precisam consistentemente de mais taxa de transferência devido a teclas de atalho ou tráfego irregular, você poderá redistribuir a taxa de transferência para otimizar o desempenho. Esse recurso está disponível para bancos de dados e contêineres que usam a taxa de transferência provisionada (manual ou dimensionamento automático) e pode ser gerenciado usando os comandos do Azure Cosmos DB PowerShell ou da CLI do Azure.

Por exemplo, se você particionar dados por StoreId em um aplicativo de varejo, algumas lojas poderão ter maior atividade do que outras. Se você notar um limite de taxa frequente (429 erros) para esses armazenamentos ocupados, a redistribuição da taxa de transferência permite alocar mais recursos para as partições ativas, melhorando o desempenho sem aumentar a taxa de transferência geral.

Pré-requisitos

  • Uma conta existente do Azure Cosmos DB
  • Versão mais recente da CLI do Azure

    • cosmosdb-preview extensão instalada

      az extension add --name cosmosdb-preview
      
  • Versão mais recente do Azure PowerShell

    • Az.CosmosDB módulo com recursos de pré-lançamento ativados

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

Identificar partições ativas usando métricas do Azure Monitor

Para identificar partições quentes no Azure Cosmos DB usando métricas do Azure Monitor, examine o consumo normalizado de RU de cada partição física para localizar as partições com uso desproporcionalmente alto.

  1. Entre no portal do Azure (https://portal.azure.com).

  2. Navegue até a seção Insights da conta do Azure Cosmos DB no portal do Azure.

  3. Selecione Taxa de transferência.

  4. Abra o consumo normalizado de RU (%) por PartitionKeyRangeID.

  5. Filtre o seu banco de dados e contêiner específicos.

  6. Analise o gráfico de cada PartitionKeyRangeId, que mapeia para uma partição física.

  7. Identifique qualquer um PartitionKeyRangeId que mostre consistentemente maior consumo normalizado de RU do que outros. Por exemplo, se um valor estiver sempre em 100% e outros estiverem em 30% ou menos, esse padrão indica uma partição quente.

    Captura de ecrã do gráfico Consumo de RU normalizado por PartitionKeyRangeId que mostra uma partição quente que apresenta uma utilização mais elevada.

Identificar partições quentes usando logs de diagnóstico

Use as informações de CDBPartitionKeyRUConsumption nos logs de diagnóstico da conta para saber quais chaves de partição lógica e partições físicas consomem mais RU/s em uma granularidade de segundo nível.

  1. Navegue até a seção Logs de Diagnóstico da conta do Azure Cosmos DB.

  2. Encontre a partição física (PartitionKeyRangeId) que consome mais RU/s ao longo do tempo usando esta consulta.

    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. Para uma partição física, encontre as 10 principais chaves de partição lógica que consomem mais RU/s a cada hora usando essa consulta.

    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
    

Sugestão

Essas consultas de exemplo usam 24 horas para ilustração, mas é melhor usar pelo menos sete dias de histórico para ver os padrões de uso.

Determinar a taxa de transferência atual para cada partição física

Para verificar o RU/s atual para cada partição física, use a métrica do Monitor do Azure PhysicalPartitionThroughput e divida por PhysicalPartitionId. Se a taxa de transferência por partição nunca foi alterada, estime o RU/s por partição dividindo o total de RU/s pelo número de partições físicas.

Leia o RU/s atual em cada partição física usando az cosmosdb sql container retrieve-partition-throughput.

// 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

Use o comando Get-AzCosmosDBSqlContainerPerPartitionThroughput ou o Get-AzCosmosDBSqlDatabasePerPartitionThroughput para ler o RU/s atual em cada partição física.

# 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

Observação

Para obter mais informações sobre como localizar o número de partições, consulte Práticas recomendadas para dimensionar a taxa de transferência provisionada (RU/s).

Calcular a taxa de transferência para a partição de destino

Em seguida, vamos decidir quantos RU/s dar à partição física mais quente. Chame isso de definir a partição de destino.

Tenha em mente os seguintes pontos antes de definir a taxa de transferência em suas partições de destino:

  • Você pode diminuir ou aumentar a taxa de transferência na partição.

  • As partições físicas só podem conter até 10.000 RU/s.

  • Os usuários podem definir a taxa de transferência de uma partição de destino para um valor máximo de 20.000 RU/s.

    • Definir a partição para um valor de taxa de transferência maior que 10.000 RU/s resulta na divisão da partição, o que pode levar algum tempo.
  • Se você definir o RU/s de uma partição acima de 10.000, ela receberá primeiro 10.000 RU/s. Em seguida, o Azure Cosmos DB divide automaticamente a partição e distribui uniformemente a taxa de transferência especificada entre as novas partições.

    • Se uma partição física estiver usando 5.000 RU/s e você definir sua taxa de transferência para 15.000 RU/s, o Azure Cosmos DB primeiro atribuirá 10.000 RU/s à partição original. Em seguida, ele divide automaticamente a partição em duas, cada uma com até 7.500 RU/s.
  • Se a soma final da taxa de transferência em todas as partições não for igual à taxa de transferência total da oferta atual, esta operação atualizará a taxa de transferência da oferta de acordo.

A abordagem certa depende dos seus requisitos de carga de trabalho. As abordagens gerais incluem:

  • Aumente o RU/s em uma porcentagem, meça a taxa de 429 respostas e repita até atingir a taxa de transferência desejada.

    • Se você não tem certeza sobre a porcentagem certa, comece com 10% para ser conservador.

    • Se você sabe que essa partição física precisa da maior parte da taxa de transferência, comece ajustando o RU/s. Duplique as RU/s ou aumente-as até ao máximo de 10 000 RU/s, consoante o que for inferior.

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

    • Essa abordagem estima qual o consumo de RU/s "real" seria se as solicitações não fossem com restrição de taxa.

Alterar programaticamente a taxa de transferência entre partições

Você pode usar o comando Update-AzCosmosDBSqlContainerPerPartitionThroughput PowerShell para redistribuir a taxa de transferência. Vejamos um exemplo com um contêiner que tem um total de 6.000 RU/s (6.000 RU/s manuais ou 6.000 RU/s dimensionados automaticamente) e três partições físicas. Neste exemplo, queremos a seguinte distribuição de taxa de transferência:

Partição física RU/s Atribuído
0 2,000
1 4,000
2 1,000

Após a redistribuição, a capacidade total de throughput da oferta será atualizada de 6.000 RU/s para 7.000 RU/s.

Atualize o RU/s em cada partição física usando az cosmosdb sql container redistribute-partition-throughput.

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...>"

Use o comando Update-AzCosmosDBSqlContainerPerPartitionThroughput para contentores com RU/s dedicados ou o comando Update-AzCosmosDBSqlDatabasePerPartitionThroughput para bases de dados com RU/s partilhados para redistribuir a taxa de transferência entre partições físicas. Em bancos de dados de taxa de transferência compartilhados, uma cadeia de caracteres GUID representa os identificadores exclusivos das partições físicas.

$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

Verificar o desempenho após a redistribuição

Depois de concluir a redistribuição da taxa de transferência, verifique a métrica PhysicalPartitionThroughput no Azure Monitor. Divida pela dimensão PhysicalPartitionId para ver quantos RU/s cada partição física tem. Se necessário, redefina o RU/s por partição física para distribuir uniformemente a taxa de transferência em todas as partições físicas.

Atualize o RU/s em cada partição física usando az cosmosdb sql container redistribute-partition-throughput com o parâmetro --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 

Use o Update-AzCosmosDBSqlContainerPerPartitionThroughput comando para contêineres com RU/s dedicados ou o Update-AzCosmosDBSqlDatabasePerPartitionThroughput comando para bancos de dados com RU/s compartilhados com parâmetro -EqualDistributionPolicy para distribuir RU/s uniformemente em todas as partições físicas.

# 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

Verificar e monitorizar o consumo da taxa de transferência

Depois de concluir a redistribuição da taxa de transferência, verifique e monitore o consumo de RU/s para garantir o desempenho ideal. Siga estes passos:

  1. Navegue até a seção Métricas da sua conta do Azure Cosmos DB no portal do Azure.

  2. Verifique a métrica PhysicalPartitionThroughput no Azure Monitor. Dividir pela dimensão PhysicalPartitionId para visualizar RU/s atribuídas a cada partição física.

  3. Monitore sua taxa geral de 429 respostas e consumo de RU/s.

  4. Analise o consumo de RU normalizado para cada partição.

    Observação

    Espera-se um maior consumo normalizado de RU após a redistribuição, uma vez que os RU/s são alocados mais perto das necessidades de cada partição. Para obter mais informações, consulte Consumo normalizado de RU.

  5. Confirme que a taxa global de 429 exceções diminuiu. As partições quentes agora devem ter mais RU/s, reduzindo o limite de taxa e melhorando o desempenho.

Limitações

Enquanto esse recurso estiver em previe, sua conta do Azure Cosmos DB deve atender a todos os seguintes critérios:

  • Sua conta do Azure Cosmos DB usa API para NoSQL ou API para MongoDB.

    • Se você estiver usando a API para MongoDB, a versão deverá ser maior ou igual a 3.6.
  • A sua conta do Azure Cosmos DB usa uma largura de banda previamente determinada (manual ou com dimensionamento automático). A distribuição da taxa de transferência entre partições não se aplica a contas sem servidor.

Importante

Atualmente, não há suporte para bancos de dados de taxa de transferência compartilhados.