Mover uma coleção
A partir do MongoDB 8.0, você pode mover uma coleção não fragmentada para um fragmento diferente usando o comando moveCollection
.
Sobre esta tarefa
moveCollection
só pode ser executado em clusters fragmentados.moveCollection
só pode mover collections não fragmentadas.moveCollection
só pode mover uma única collection por vez.moveCollection
tem uma duração mínima de 5 minutos.Os índices do Atlas Search precisam ser reconstruídos após
moveCollection
execuções.Você não pode fazer alterações na topologia , como adicionar ou remover fragmentos ou transição entre servidores de configuração incorporados e dedicados, até que a
moveCollection
seja concluída.Não é possível executar as seguintes operações na collection que está sendo movida enquanto
moveCollection
estiver em andamento:Você não pode executar as seguintes operações no cluster enquanto o
moveCollection
estiver em andamento:As compilações de índice que ocorrem enquanto
moveCollection
está em andamento podem falhar silenciosamente.Não crie índices enquanto
moveCollection
estiver em andamento.Não chame
moveCollection
se houver construções de índice em andamento.
Controle de acesso
Se seu sistema tiver o controle de acesso ativado, a função enableSharding
concederá a você acesso para executar o comando moveCollection
.
Antes de começar
Antes de mover sua collection, certifique-se de atender aos seguintes requisitos:
Seu aplicação pode tolerar um período de dois segundos em que a collection afetada bloqueia as gravações. Durante o período em que as gravações são bloqueadas, seu aplicação experimenta um aumento na latência.
Seu banco de dados atende aos seguintes requisitos de recursos:
Verifique se o fragmento para o qual você está movendo a collection tem espaço de armazenamento suficiente para a collection e seus índices. O fragmento de destino exige pelo menos
( Collection storage size + Index Size ) * 2
bytes disponíveis.Certifique-se de que sua capacidade de E/S esteja abaixo de 50%.
Certifique-se de que a carga da CPU esteja abaixo de 80%.
Importante
Esses requisitos não são exigidos pelo banco de dados. Uma falha na alocação de recursos suficientes pode resultar em:
o banco de dados ficar sem espaço e desligando
redução do desempenho
a operação demora mais que o esperado
Se o seu aplicação tiver períodos com menos tráfego, execute esta operação na coleção durante esse período, se possível.
Passos
Mova a collection.
Para mover uma coleção não fragmentada denominada inventory
no banco de banco de dados do app
para o fragmento do shard02
, execute moveCollection
:
db.adminCommand( { moveCollection: "app.inventory", toShard: "shard02" } )
Para obter uma lista dos IDs de shard disponíveis, execute sh.status()
. Para obter detalhes, consulte sh.status() Saída.
Monitore o progresso da operação moveCollection.
Monitore o tempo restante.
Para monitorar o tempo restante para a operação
moveCollection
, use o estágio de pipeline$currentOp
.Este exemplo mostra como verificar o progresso de
moveCollection
na collectionapp.inventory
:db.getSiblingDB("admin").aggregate( [ { $currentOp: { allUsers: true, localOps: false } }, { $match: { type: "op", "originatingCommand.reshardCollection": "app.inventory" } } ] ) Observação
Para ver os valores atualizados, você precisa executar continuamente o pipeline anterior.
As saídas do pipeline
$currentOp
:totalOperationTimeElapsedSecs
: tempo de operação decorrido em segundosremainingOperationTimeEstimatedSecs
: tempo restante estimado para a operaçãomoveCollection
atual. É retornado como-1
quando uma nova operaçãomoveCollection
é iniciada.
Observaçã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
- o tempo real da fase de recuperação é relativamente curto.
Esse estágio do pipeline tem uma saída semelhante a esta:
[ { 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>, ... }, ... ] Monitore o número de bytes transferidos.
Para monitorar o número de bytes transferidos, use
shardingStatistics.resharding.active.bytesCopied
e compare com o número de bytes na collection.
Confirme que a coleção foi movida.
Para confirmar se a coleção foi movida para o fragmento esperado, use o estágio de pipeline $collStats
.
Este exemplo mostra como confirmar que a coleção app.inventory
existe no fragmento esperado:
db.inventory.aggregate( [ { $collStats: {} }, { $project: { "shard": 1 } } ] )
Esse estágio do pipeline tem uma saída semelhante a esta:
[ { shard: 'shard02' } ]