Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ /

Refragmentação para adicionar e remover fragmentos

Você pode usar a refragmentação para distribuir suas collections fragmentadas para novos shards. Você também pode usá-lo para remover fragmentos mais rápido do que migrações de blocos.

A operação de refragmentação executa estas fases na ordem:

  1. A fase do clonagem duplica os dados da collection atual.

  2. A fase de construção de índices cria índices na collection refragmentada.

  3. A fase de atualização aplica quaisquer operações de gravação pendentes à collection refragmentada.

  4. A fase de confirmação renomeia a collection temporária e descarta a collection antiga para executar um cutover.

Antes de fazer a refragmentação, você deve calcular os Requisitos de armazenamento, osRequisitos de latência e quaisquer Requisitos de recursos adicionais.

Calcule o espaço de armazenamento necessário para a operação de refragmentação adicionando o tamanho da collection e o tamanho do índice, presumindo uma oplog window mínima de 24 horas usando esta fórmula:

Available storage required on each shard = [(collection size + index size) *2 ] / number of shards the collection will be distributed across.

Por exemplo, uma collection de 2TB e 400GB de índices distribuídos em 4 fragmentos precisará de um mínimo de 1.2TB de armazenamento disponível por fragmento:

[ (2 TB + 400GB) * 2 ] / 4 shards = 1.2 TB / shard

Você deve confirmar que tem o espaço de armazenamento disponível no seu cluster.

Se não houver espaço suficiente ou espaço de E/S disponível, você deverá aumentar o tamanho do armazenamento. Se não houver espaço suficiente para a CPU, você deverá escalar o cluster selecionando um tamanho de instância maior.

Dica

Se o MongoDB cluster estiver hospedado no Atlas, você poderá usar a UI do Atlas para analisar as métricas de armazenamento, CPU e espaço de E/S.

Você deve garantir que seu aplicação possa tolerar dois segundos em que a collection que está sendo refragmentada bloqueia as gravações. Quando as gravações são bloqueadas, seu aplicação experimenta um aumento na latência. Se seu volume de trabalho não tolerar esse requisito, use migrações de chunks para equilibrar o cluster.

Seu cluster deve atender a estes requisitos adicionais:

  • Uma oplog window mínima de 24 horas.

  • Capacidade de E/S abaixo de 50%.

  • Carga da CPU abaixo de 80%.

1

Para adicionar shards ao seu cluster, consulte Adicionar shards a um cluster. Para remover fragmentos do seu cluster, consulte Remover fragmentos de um cluster fragmentado.

2

Utilize o comando reshardCollection com a opção forceRedistribution para redistribuir dados pelo cluster.

db.adminCommand(
{
reshardCollection: "<db>.<collection>",
key: { "<shardkey>" },
forceRedistribution: true
}
)

A refragmentação com forceRedistribution: true reescreve os dados em todos os shards no cluster que não estão em um estado de drenagem . Por padrão, a refragmentação usa numInitialChunks: 90. A refragmentação cria pelo menos numInitialChunks - 1 blocos em um cluster. Se você tiver mais de 90 shards, especifique um número maior de numInitialChunks no comando reshardCollection.

3

Para monitorar a operação de refragmentação, você pode usar o estágio de pipeline$currentOp:

db.getSiblingDB("admin").aggregate(
[
{ $currentOp: { allUsers: true, localOps: false } },
{
$match: {
type: "op",
"originatingCommand.reshardCollection": "<database>.<collection>"
}
}
]
)

Observação

Para ver os valores atualizados, você precisa executar continuamente o pipeline.

As saídas do pipeline $currentOp:

  • totalOperationTimeElapsedSecs: tempo de operação decorrido em segundos

  • remainingOperationTimeEstimatedSecs: tempo restante estimado em segundos para a operação de refragmentação atual. É retornado como -1 quando uma nova operação de refragmentação é iniciada.

    A partir do MongoDB 7.0, remainingOperationTimeEstimatedSecs também está disponível no coordenador durante uma operação de refragmentação.

    remainingOperationTimeEstimatedSecs está definido para uma estimativa de tempo pessimista:

    • A estimativa de tempo da fase de recuperação é definida como o tempo da fase de clonagem, que é um tempo relativamente longo.

    • Na prática, se houver apenas algumas operações de escrita pendentes, o tempo de fase de recuperação real é relativamente curto.

[
{
shard: '<shard>',
type: 'op',
desc: 'ReshardingRecipientService | ReshardingDonorService | ReshardingCoordinatorService <reshardingUUID>',
op: 'command',
ns: '<database>.<collection>',
originatingCommand: {
reshardCollection: '<database>.<collection>',
key: <shardkey>,
unique: <boolean>,
collation: { locale: 'simple' }
},
totalOperationTimeElapsedSecs: <number>,
remainingOperationTimeEstimatedSecs: <number>,
...
},
...
]

A refragmentação com forceRedistribution: true reescreve os dados da collection em todos os shards relevantes e descarta a collection antiga. É o método mais rápido para mover dados em um cluster.

Voltar

Refragmentar uma collection de volta para a mesma chave de shard