Você pode desfragmentar uma collection fragmentada com o comando unshardCollection . Ao desfragmentar uma collection, a collection não pode ser particionada em vários shards e a chave de shard é removida.
Por padrão, quando você desfragmenta uma collection, o MongoDB move os dados da collection para o shard com a menor quantidade de dados. Como alternativa, você pode especificar em qual fragmento colocar os dados.
Sobre esta tarefa
Compatibilidade
Você pode executar esta tarefa em implementações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Observação
Esta tarefa não está disponível nas camadas gratuitas ou flexíveis do MongoDB Atlas .
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Restrições
unshardCollectionsó pode ser executado em clusters fragmentados.unshardCollectionsó pode operar em collections fragmentadas.unshardCollectionsó pode operar em uma única collection por vez.unshardCollectiontem uma duração mínima de 5 minutos.É necessário reconstruir os índices do MongoDB Search após a execução de
unshardCollection.Você não pode fazer alterações na topologia , como adicionar ou remover fragmentos ou fazer a transição entre servidores de configuração incorporados e dedicados, até que
unshardCollectionseja concluído.Não é possível executar as seguintes operações na collection que está sendo desfragmentada enquanto
unshardCollectionestiver em andamento:Você não pode executar as seguintes operações no cluster enquanto o
unshardCollectionestiver em andamento:As compilações de índice que ocorrem enquanto
unshardCollectionestá em andamento podem falhar silenciosamente.Não crie índices enquanto
unshardCollectionestiver em andamento.Não chame
unshardCollectionse houver construções de índice em andamento.
Para evitar erros, o MongoDB descarta automaticamente as zonas da sua coleção quando você executa o
unshardCollection.
Controle de acesso
Se seu sistema tiver o controle de acesso ativado, a função enableSharding concederá a você acesso para executar o comando unshardCollection .
Antes de começar
Antes de desfragmentar 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%.
Passos
(Opcional) Listar nomes de shards
Se quiser colocar os dados da sua coleção de fragmentos em um fragmento específico, você precisa do nome do fragmento de destino.
Para visualizar a lista de nomes de fragmentos em seu agrupamento, utilize o comando listShards :
db.adminCommand( { listShards: 1 } )
O campo shards._id lista o nome de cada shard.
Desfragmentar a collection
Para desfragmentar uma collection, execute o comando unshardCollection . O exemplo a seguir desfragmenta uma collection chamada us_accounts no banco de banco de dados sales :
db.adminCommand( { unshardCollection: "sales.us_accounts", toShard: "shard1" } )
Após a conclusão da operação de desfragmentação, os dados da collection us_accounts estarão em shard1. Se você omitir o campo toShard , os dados serão colocados no shard com a menor quantidade de dados.
Confirme que a collection não está fragmentada
Para confirmar que a collection não está fragmentada, use o estágio $shardedDataDistribution e tente fazer a correspondência no namespace não fragmentado:
db.aggregate( [ { $shardedDataDistribution: { } }, { $match: { "ns": "sales.us_accounts" } } ] )
Se a agregação não retornar quaisquer dados, a collection não será fragmentada.