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.writeConcernMajorityJournalDefaultdeve sertrue.Para mover uma coleção que tenha uma restrição de exclusividade, o novo Ãndice deve satisfazer os requisitos de Ãndice únicos para quaisquer Ãndices únicos existentes.
Se a coleção que está sendo movida usar o MongoDB Search, seus Ãndices de pesquisa ficarão indisponÃveis após a conclusão do
moveCollection. Você deve reconstruir manualmente os Ãndices de pesquisa.Se a coleção que você está movendo for arquivada em Atlas Online Archives, os arquivos do Online Archive serão marcados como
Orphanedassim que a operação de movimentação for concluÃda. Você pode criar outro Online Archive para o mesmo banco de dados, coleção e campos que o arquivo órfão, desde que não haja outro arquivo para a mesma combinação no estadoActive.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' } ]