Puedes desfragmentar una colección fragmentada con el
unshardCollection comando. Cuando se desfragmenta una colección, esta no puede particionarse en múltiples particiones y la clave de partición se elimina.
De forma predeterminada, al desfragmentar una colección, MongoDB mueve los datos de la colección al fragmento con la menor cantidad de datos. También puede especificar en qué fragmento colocar los datos.
Acerca de esta tarea
Compatibilidad
Puedes realizar esta tarea en las implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Esta tarea no está disponible en los niveles gratuitos o flexibles de MongoDB Atlas.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Restricciones
unshardCollectionSólo se puede ejecutar en clústeres fragmentados.unshardCollectionsolo puede operar en colecciones fragmentadas.unshardCollectionsolo puede operar en una única colección a la vez.unshardCollectiontiene una duración mínima de 5 minutos.Debe reconstruir los índices de búsqueda de MongoDB Search después de ejecutar
unshardCollection.No puede realizar cambios de topología, como añadir o remover particiones o pasar de servidores de configuración dedicados a embebidos, hasta que
unshardCollectionse complete.No puedes ejecutar las siguientes operaciones en la colección que se está desfragmentando mientras
unshardCollectionestá en curso:No se pueden ejecutar las siguientes operaciones en el clúster mientras
unshardCollectionesté en progreso:Las creaciones de índices que ocurran mientras
unshardCollectionesté en curso podrían fallar silenciosamente.No cree índices mientras
unshardCollectionesté en progreso.No llame a
unshardCollectionsi hay creaciones de índices en curso.
Para evitar errores, MongoDB descarta automáticamente las zonas de tu colección cuando ejecutas
unshardCollection.
Control de acceso
Si tu implementación tiene control de acceso habilitado, el rol enableSharding te otorga acceso para ejecutar el comando unshardCollection.
Antes de comenzar
Antes de desfragmentar tu colección, asegúrate de cumplir los siguientes requisitos:
Su aplicación puede tolerar un periodo de dos segundos en el que la colección afectada bloquea las escrituras. Durante este periodo, la aplicación experimenta un aumento de latencia.
Su base de datos cumple con estos requisitos de recursos:
Asegúrate de que la partición a la que mueves la colección tenga suficiente espacio de almacenamiento para la colección y sus índices. La partición de destino requiere al menos
( Collection storage size + Index Size ) * 2bytes disponibles.Asegúrate de que tu capacidad de E/S esté por debajo de 50%.
Asegúrate de que la carga de tu CPU esté por debajo del 80%.
Pasos
(Opcional) Lista de nombres de fragmentos
Si deseas colocar los datos de tu colección particionada en una partición específica, necesitas el nombre de la partición objetivo.
Para ver la lista de nombres de particiones en tu clúster, utiliza el comando listShards:
db.adminCommand( { listShards: 1 } )
El campo shards._id lista el nombre de cada partición.
Desfragmentar la colección
Para desfragmentar una colección, ejecuta el comando unshardCollection. El siguiente ejemplo desfragmenta una colección llamada us_accounts en la base de datos sales:
db.adminCommand( { unshardCollection: "sales.us_accounts", toShard: "shard1" } )
Una vez completada la operación de desfragmentación, los datos de la colección us_accounts se ubican en shard1. Si se omite el campo toShard, los datos se colocan en el fragmento con la menor cantidad de datos.
Confirmar que la colección no tiene particiones
Para confirmar que la colección no tiene fragmentación, utiliza la etapa $shardedDataDistribution e intenta hacer coincidir con el namespace no particionado:
db.aggregate( [ { $shardedDataDistribution: { } }, { $match: { "ns": "sales.us_accounts" } } ] )
Si la agregación no devuelve ningún dato, la colección no está particionada.