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
moveCollectionsó pode ser executado em clusters fragmentados.moveCollectionsó pode mover collections não fragmentadas.moveCollectionsó pode mover uma única collection por vez.moveCollectiontem uma duração mínima de 5 minutos.Os índices do Atlas Search precisam ser reconstruídos após
moveCollectionexecuçõ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
moveCollectionseja concluída.Não é possível executar as seguintes operações na collection que está sendo movida enquanto
moveCollectionestiver em andamento:Você não pode executar as seguintes operações no cluster enquanto o
moveCollectionestiver em andamento:As compilações de índice que ocorrem enquanto
moveCollectionestá em andamento podem falhar silenciosamente.Não crie índices enquanto
moveCollectionestiver em andamento.Não chame
moveCollectionse 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 ) * 2bytes 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
moveCollectionna 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çãomoveCollectionatual. É retornado como-1quando uma nova operaçãomoveCollectioné iniciada.
Observação
remainingOperationTimeEstimatedSecsestá 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.bytesCopiede 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' } ]