Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 instaladaaz 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.
Entre no portal do Azure (https://portal.azure.com).
Navegue até a seção Insights da conta do Azure Cosmos DB no portal do Azure.
Selecione Taxa de transferência.
Abra o consumo normalizado de RU (%) por PartitionKeyRangeID.
Filtre o seu banco de dados e contêiner específicos.
Analise o gráfico de cada
PartitionKeyRangeId
, que mapeia para uma partição física.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.
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.
Navegue até a seção Logs de Diagnóstico da conta do Azure Cosmos DB.
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
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:
Navegue até a seção Métricas da sua conta do Azure Cosmos DB no portal do Azure.
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.
Monitore sua taxa geral de 429 respostas e consumo de RU/s.
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.
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.