Partilhar via


Redistribuir a taxa de transferência entre partições (visualização)

APLICA-SE A: NoSQL 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á consistentemente vendo uma taxa geral superior a 1-5% de 429 respostas
  • Você tem uma partição quente consistente e previsível

Se não vir respostas 429 e a latência ponto a ponto for aceitável, não é necessária qualquer ação para reconfigurar as RU/s por partição. Se tiver uma carga de trabalho consistente com picos ocasionais imprevisíveis em todas as partições, recomenda-se a utilização do dimensionamento automático e da capacidade de expansão (pré-visualização). 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 (visualização) 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 limite de taxa (429) para solicitações contra esses StoreIds, e nossa taxa geral de 429 respostas é superior a 1-5%. 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.

Captura de tela do gráfico Consumo normalizado de RU por PartitionKeyRangeId com 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, 1s), 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-AzCosmosDBSqlContainerPerPartitionThroughput comando ou Get-AzCosmosDBSqlDatabasePerPartitionThroughput para ler o RU/s atual em cada partição física.


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

Determinar RU/s para a partição de destino

Em seguida, vamos decidir quantos RU/s queremos dar à(s) nossa(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 uma porcentagem, medir a taxa de 429 respostas 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.
  • Aumentar as 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)
    • Esta abordagem tenta estimar qual teria sido o consumo "real" de RU/s se os pedidos não tivessem sido limitados à taxa.

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
  • 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-AzCosmosDBSqlContainerPerPartitionThroughput comando for containers with dedicated RU/s ou o Update-AzCosmosDBSqlDatabasePerPartitionThroughput para 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

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

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

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 sua taxa geral de 429 respostas e consumo de RU/s. 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 API para NoSQL ou API para MongoDB.
    • Se você estiver 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: