La fragmentación consiste en dividir los datos de una colección fragmentada en una cantidad innecesariamente grande de fragmentos pequeños. Esto puede aumentar la duración de las operaciones CRUD que se ejecutan en esa colección. La desfragmentación reduce la cantidad de fragmentos al fusionarlos en fragmentos más grandes, lo que resulta en tiempos de operación CRUD más cortos.
Si los tiempos de operación CRUD son aceptables, no es necesario desfragmentar las colecciones.
La siguiente tabla resume la información de desfragmentación para varias versiones de MongoDB.
Versión de MongoDB | Descripción |
|---|---|
MongoDB 7.0 y versiones posteriores | Los fragmentos se fusionan automáticamente. Las mejoras de rendimiento al desfragmentar una colección en MongoDB 7.0 son menores que en MongoDB 6.0. Normalmente, no es necesario desfragmentar colecciones a partir de MongoDB 7.0. |
MongoDB 6.0 y anteriores a 7.0 | Desfragmente las colecciones solo si experimenta demoras en la operación CRUD cuando el balanceador migra fragmentos o se inicia un nodo. A partir de MongoDB 6.0, el alto tráfico de escritura no debe causar fragmentación. Las migraciones de fragmentos causan fragmentación. |
Antes de MongoDB 6.0 | Desfragmente las colecciones solo si experimenta tiempos de operación CRUD más largos durante las actualizaciones de metadatos. En versiones de MongoDB anteriores a 6.0, una colección fragmentada se fragmenta cuando su tamaño aumenta significativamente debido a numerosas operaciones de inserción o actualización. |
Para desfragmentar una colección fragmentada, utilice el
OpciónconfigureCollectionBalancingdel comando. Esta opción está disponible a partir de MongoDB.defragmentCollection 6.0
Antes de comenzar
Tenga en cuenta estos aspectos antes de desfragmentar colecciones:
La desfragmentación podría provocar muchas actualizaciones de metadatos en los fragmentos. Si sus operaciones CRUD ya tardan más de lo habitual durante las migraciones, debería ejecutar la desfragmentación solo durante un periodo de equilibrio de fragmentos para reducir la carga de trabajo del sistema.
Si la desfragmentación afecta la carga de trabajo y la latencia CRUD en el clúster, puede reducir el impacto utilizando el
chunkDefragmentationThrottlingMSparámetro.Los fragmentos fusionados pierden su historial de ubicación.
Esto significa que mientras se ejecuta la desfragmentación, las lecturas de instantáneas e indirectamente, las transacciones, podrían fallar con errores de historial de fragmentos obsoletos.
El historial de ubicación registra los fragmentos donde se almacenó un fragmento. La desfragmentación borra el historial de ubicación y algunas operaciones podrían fallar, pero normalmente se resuelven después de unos cinco minutos.
La desfragmentación afecta la ubicación de los documentos de una colección al mover datos entre fragmentos. Si una colección tiene rangos de datos a los que se accede con frecuencia, tras desfragmentarla, es posible que estos datos se encuentren en un solo fragmento. Esto podría reducir el rendimiento de las operaciones CRUD al concentrar la carga de trabajo en un solo fragmento en lugar de en varios.
Tareas
Iniciar manualmente la desfragmentación de una colección fragmentada
Detener manualmente la desfragmentación de una colección fragmentada
Nota
Normalmente, debe utilizar una ventana de equilibrio de fragmentos para especificar cuándo se ejecuta el equilibrador en lugar de iniciar y detener manualmente la desfragmentación.
Detalles
Esta sección describe detalles adicionales relacionados con la desfragmentación de colecciones fragmentadas.
Configurar el estado de balance de la colección
El defragmentCollection campo devuelto por el comando solo configureCollectionBalancing es true cuando se ejecuta la desfragmentación.
Una vez que la desfragmentación finaliza automáticamente o usted la detiene manualmente, el campo defragmentCollection se elimina del documento devuelto.
Operaciones
Se permiten lecturas de nodos secundarios durante la desfragmentación, pero podrían tardar más en completarse hasta que las actualizaciones de metadatos en el nodo primario se repliquen a los nodos secundarios.
Tamaño de fragmentos, equilibrio y desfragmentación
Para obtener detalles sobre el equilibrador de MongoDB, consulte Equilibrador de clúster fragmentado.
Para obtener una introducción chunkSize a, consulte Modificar el tamaño del rango en un clúster fragmentado.
Cuando los datos de recopilación compartidos entre dos fragmentos difieren en tres o más veces el valor configurado chunkSize, el equilibrador migra fragmentos entre los fragmentos.
Por ejemplo, si chunkSize es 128 MB y los datos de recopilación difieren en 384 MB o más, el equilibrador migra fragmentos entre los fragmentos.
Cuando los fragmentos se mueven, se dividen o se fusionan, los metadatos de la partición se actualizan después de que la operación de fragmento es confirmada por un servidor de configuración. Las Particiones no involucradas en la operación de fragmentos también se actualizan con nuevos metadatos.
El tiempo de actualización de los metadatos del fragmento es proporcional al tamaño de la tabla de enrutamiento. Las operaciones CRUD en la colección se bloquean temporalmente mientras se actualizan los metadatos del fragmento, y una tabla de enrutamiento más pequeña implica menores retrasos en las operaciones CRUD.
Desfragmentar una colección reduce la cantidad de fragmentos y el tiempo necesario para actualizar los metadatos de cada fragmento.
Para reducir la carga de trabajo del sistema, configure el balanceador para que se ejecute solo en un horario específico mediante una ventana de balanceo de fragmentos. La desfragmentación se ejecuta durante esta ventana.
Puede utilizar el parámetro para limitar la velocidad de los comandos de división y fusión que ejecuta el chunkDefragmentationThrottlingMS balanceador.
Puede iniciar y detener la desfragmentación en cualquier momento.
También puedes configurar una zona de fragmentos. Una zona de fragmentos se basa en la clave de fragmento y puedes asociar cada zona con uno o más fragmentos de un clúster.
Un clúster fragmentado solo divide fragmentos cuando es necesario migrarlos. Esto significa que el tamaño del fragmento puede superar chunkSize. Los fragmentos más grandes reducen la cantidad de fragmentos en un fragmento y mejoran el rendimiento, ya que se reduce el tiempo de actualización de los metadatos. Por ejemplo, podría ver un fragmento de 1 TB en un fragmento aunque haya configurado chunkSize en 256 MB.
chunkSize Afecta lo siguiente:
Cantidad máxima de datos que el balanceador intenta migrar entre dos fragmentos en una sola operación de migración de fragmentos.
Cantidad de datos migrados durante la desfragmentación.
Obtén más información
Introducción a la fragmentación, consulte Fragmentación
Particionar datos con fragmentos, consulte Particionado de datos con fragmentos
Configurar el equilibrio de la colección, consulte
configureCollectionBalancingExaminar el estado de la colección del balanceador, ver
balancerCollectionStatusConfigurar ventanas de equilibrio de fragmentos, consulte Programar la ventana de equilibrio
Monitorear fragmentos usando MongoDB Atlas, ver Revisar clústeres fragmentados