Redistribuir a taxa de transferência entre partições
APLICA-SE A: MongoDB
Por padrão, o Azure Cosmos DB distribui a taxa de transferência provisionada de um banco de dados ou contêiner igualmente em todas as partições físicas. No entanto, podem surgir cenários em que, devido a uma distorção na carga de trabalho ou à escolha da chave de partição, certas partições lógicas (e, portanto, físicas) precisam de mais taxa de transferência do que outras. Para esses cenários, o Azure Cosmos DB oferece a capacidade de redistribuir sua taxa de transferência provisionada entre partições físicas. Redistribuir a taxa de transferência entre partições ajuda você a obter um melhor desempenho sem ter que configurar sua taxa de transferência geral com base na partição mais quente.
O recurso de redistribuição de taxa de transferência se aplica a bancos de dados e contêineres que usam taxa de transferência provisionada (manual e dimensionamento automático) e não se aplica a contêineres sem servidor. Você pode alterar a taxa de transferência por partição física usando os comandos do Azure Cosmos DB PowerShell ou da CLI do Azure.
Quando usar esse recurso
Em geral, o uso desse recurso é recomendado para cenários em que as duas opções a seguir são verdadeiras:
- Você está constantemente vendo uma utilização 100% normalizada em poucas partições de uma coleção.
- Você está constantemente vendo latência maior do que aceitação.
Se você não estiver vendo 100% de consumo de RU e sua latência de ponta a ponta for aceitável, nenhuma ação para reconfigurar RU/s por partição será necessária.
Se você tiver uma carga de trabalho com tráfego consistente com picos imprevisíveis ocasionais em todas as partições, é recomendável usar o dimensionamento automático e a capacidade de intermitência. O dimensionamento automático e a capacidade de expansão garantirão que cumpre os requisitos de débito. Se você tiver uma pequena quantidade de RU/s por partição, também poderá usar a mesclagem de partições para reduzir o número de partições e garantir mais RU/s por partição para a mesma taxa de transferência total provisionada.
Cenário de exemplo
Suponhamos que temos uma carga de trabalho que acompanha as transações que ocorrem em lojas de varejo. Como a maioria das nossas consultas são por StoreId
, particionamos por StoreId
. No entanto, com o tempo, vemos que algumas lojas têm mais atividade do que outras e exigem mais taxa de transferência para atender suas cargas de trabalho. Estamos vendo um consumo de ru 100% normalizado para solicitações contra esses StoreIds. Enquanto isso, outras lojas são menos ativas e exigem menos rendimento. Vamos ver como podemos redistribuir nossa taxa de transferência para um melhor desempenho.
Etapa 1: Identificar quais partições físicas precisam de mais taxa de transferência
Há duas maneiras de identificar se há uma partição quente.
Opção 1: Usar métricas do Azure Monitor
Para verificar se há uma partição ativa, navegue até Consumo de RU normalizado de taxa de transferência>do Insights>(%) por PartitionKeyRangeID. Filtre para um banco de dados e contêiner específicos.
Cada PartitionKeyRangeId é mapeado para uma partição física. Procure um PartitionKeyRangeId que tenha consistentemente um consumo de RU normalizado mais alto do que outros. Por exemplo, um valor está consistentemente em 100%, mas outros estão em 30% ou menos. Um padrão como este pode indicar uma partição quente.
Opção 2: Usar logs de diagnóstico
Podemos usar as informações de CDBPartitionKeyRUConsumption em Logs de Diagnóstico para obter mais informações sobre as chaves de partição lógicas (e partições físicas correspondentes) que estão consumindo mais RU/s em um segundo nível de granularidade. Observe que as consultas de exemplo usam 24 horas apenas para fins ilustrativos - recomenda-se usar pelo menos sete dias de histórico para entender o padrão.
Encontre a partição física (PartitionKeyRangeId) que está consumindo mais RU/s ao longo do tempo
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
Para uma determinada partição física, encontre as 10 principais chaves de partição lógica que estão consumindo mais RU/s em cada hora
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
Etapa 2: Determinar o RU/s de destino para cada partição física
Determinar RU/s atuais para cada partição física
Primeiro, vamos determinar o RU/s atual para cada partição física. Você pode usar a métrica do Monitor do Azure PhysicalPartitionThroughput e dividir pela dimensão PhysicalPartitionId para ver quantos RU/s você tem por partição física.
Como alternativa, se você não tiver alterado sua taxa de transferência por partição antes, poderá usar a fórmula: Current RU/s per partition = Total RU/s / Number of physical partitions
Siga as orientações no artigo Práticas recomendadas para dimensionar a taxa de transferência provisionada (RU/s) para determinar o número de partições físicas.
Você também pode usar o PowerShell Get-AzCosmosDBSqlContainerPerPartitionThroughput
e Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput
os comandos para ler o RU/s atual em cada partição física.
Use Install-Module
para instalar o módulo Az.CosmosDB com recursos de pré-lançamento ativados.
$parameters = @{
Name = "Az.CosmosDB"
AllowPrerelease = $true
Force = $true
}
Install-Module @parameters
Use o Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput
comando para ler o RU/s atual em cada partição física.
// 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
Determinar RU/s para a partição de destino
Em seguida, vamos decidir quantos RU/s queremos dar à(s) partição(ões) física(s) mais quente(s). Vamos chamar isso de conjunto de nossas partições de destino. O maior número de RU/s que qualquer partição física pode conter é de 10.000 RU/s.
A abordagem certa depende dos seus requisitos de carga de trabalho. As abordagens gerais incluem:
- Aumentar o RU/s em 10% e repetir até que a taxa de transferência desejada seja alcançada.
- Se você não tem certeza da porcentagem certa, você pode começar com 10% para ser conservador.
- Se você já sabe que essa partição física requer a maior parte da taxa de transferência da carga de trabalho, você pode começar dobrando o RU/s ou aumentando-o para o máximo de 10.000 RU/s, o que for menor.
Determinar RU/s para a partição de origem
Finalmente, vamos decidir quantos RU/s queremos manter em nossas outras partições físicas. Essa seleção determinará as partições das quais a partição física de destino obtém a taxa de transferência.
Nas APIs do PowerShell, devemos especificar pelo menos uma partição de origem a partir da qual redistribuir RU/s. Também podemos especificar uma taxa de transferência mínima personalizada que cada partição física deve ter após a redistribuição. Se não for especificado, por padrão, o Azure Cosmos DB garantirá que cada partição física tenha pelo menos 100 RU/s após a redistribuição. Recomenda-se especificar explicitamente a taxa de transferência mínima.
A abordagem certa depende dos seus requisitos de carga de trabalho. As abordagens gerais incluem:
- Tomar RU/s igualmente de todas as partições de origem (funciona melhor quando há <= 10 partições)
- Calcule a quantidade que precisamos para compensar cada partição física de origem.
Offset = Total desired RU/s of target partition(s) - total current RU/s of target partition(s)) / (Total physical partitions - number of target partitions)
- Atribuir a taxa de transferência mínima para cada partição de origem =
Current RU/s of source partition - offset
- Calcule a quantidade que precisamos para compensar cada partição física de origem.
- Tirar RU/s da(s) partição(ões) menos ativa(s)
- Use as métricas do Azure Monitor e os Logs de Diagnóstico para determinar quais partições físicas têm o menor volume de tráfego/solicitação
- Calcule a quantidade que precisamos para compensar cada partição física de origem.
Offset = Total desired RU/s of target partition(s) - total current RU/s of target partition) / Number of source physical partitions
- Atribuir a taxa de transferência mínima para cada partição de origem =
Current RU/s of source partition - offset
Etapa 3: 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.
Para entender o exemplo abaixo, vamos dar um exemplo em que temos um contêiner que tem 6000 RU/s no total (6000 RU/s manuais ou 6000 RU/s em escala automática) e 3 partições físicas. Com base na nossa análise, queremos um layout onde:
- Partição física 0: 1000 RU/s
- Partição física 1: 4000 RU/s
- Partição física 2: 1000 RU/s
Especificamos as partições 0 e 2 como nossas partições de origem e especificamos que, após a redistribuição, elas devem ter um mínimo de RU/s de 1000 RU/s. A partição 1 está fora da partição de destino, que especificamos que deve ter 4000 RU/s.
Use o Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput
comando for collections with dedicated RU/s ou o Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput
comando for databases with shared RU/s para redistribuir a taxa de transferência entre partições físicas. Em bancos de dados de taxa de transferência compartilhados, as Ids das partições físicas são representadas por uma cadeia de caracteres GUID.
$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
Depois de concluir a redistribuição, você pode verificar a alteração exibindo a métrica PhysicalPartitionThroughput no Azure Monitor. Divida pela dimensão PhysicalPartitionId para ver quantos RU/s você tem por partição física.
Se necessário, você também pode redefinir o RU/s por partição física para que o RU/s do seu contêiner seja distribuído uniformemente em todas as partições físicas.
Use o Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput
comando para coleções com RU/s dedicado ou o Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput
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.
// 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
Passo 4: Verificar e monitorizar o seu consumo de RU/s
Depois de concluir a redistribuição, você pode verificar a alteração exibindo a métrica PhysicalPartitionThroughput no Azure Monitor. Divida pela dimensão PhysicalPartitionId para ver quantos RU/s você tem por partição física.
Recomenda-se monitorar seu consumo de ru normalizado por partição. Para obter mais informações, consulte a Etapa 1 para validar que você alcançou o desempenho esperado.
Após as alterações, supondo que sua carga de trabalho geral não tenha mudado, você provavelmente verá que as partições físicas de destino e de origem têm maior consumo de RU normalizado do que anteriormente. Um maior consumo normalizado de RU é um comportamento esperado. Essencialmente, você alocou RU/s mais perto do que cada partição realmente precisa consumir, portanto, maior consumo normalizado de RU significa que cada partição está utilizando totalmente seu RU/s alocado. Você também deve esperar ver uma taxa geral mais baixa de 429 exceções, já que as partições quentes agora têm mais RU/s para atender solicitações.
Limitações
Pré-visualizar critérios de elegibilidade
Para usar a visualização, sua conta do Azure Cosmos DB deve atender a todos os seguintes critérios:
- Sua conta do Azure Cosmos DB está usando a API para MongoDB.
- A versão deve ser >= 3.6.
- A conta do Azure Cosmos DB está a utilizar o débito aprovisionado (manual ou dimensionamento automático). A distribuição da taxa de transferência entre partições não se aplica a contas sem servidor.
Não é necessário inscrever-se para utilizar a pré-visualização. Para usar o recurso, use os comandos PowerShell ou CLI do Azure para redistribuir a taxa de transferência entre as partições físicas de seus recursos.
Próximos passos
Saiba mais sobre como usar a taxa de transferência provisionada com os seguintes artigos:
- Saiba mais sobre a taxa de transferência provisionada.
- Saiba mais sobre as unidades de solicitação.
- Precisa monitorar partições quentes? Consulte as unidades de solicitação de monitoramento.
- Quer aprender as melhores práticas? Consulte as práticas recomendadas para dimensionar a taxa de transferência provisionada.
- Saiba mais sobre Erros de limitação de taxa