Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Desfragmentar colecciones particionadas

La fragmentación se produce cuando los datos de una colección particionada se dividen en una cantidad innecesariamente grande de fragmentos pequeños. Esto puede aumentar los tiempos de las operaciones CRUD que se ejecutan en esa colección. La desfragmentación reduce el número de fragmentos al combinar fragmentos más pequeños en otros más grandes, lo que resulta en tiempos de operación CRUD más bajos.

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 combinan automáticamente. Las mejoras de rendimiento derivadas de la desfragmentación de una colección en MongoDB 7.0 son menores en comparación con MongoDB 6.0. Normalmente, no necesitas desfragmentar colecciones a partir de MongoDB 7.0.

MongoDB 6.0 y versiones anteriores a 7.0

Desfragmente las colecciones solo si experimenta retrasos en las operaciones CRUD cuando el balanceador migra fragmentos o se inicia un nodo.

A partir de MongoDB 6.0, un alto tráfico de escritura no debería causar fragmentación. Las migraciones de fragmentos causan fragmentación.

Anterior a MongoDB 6.0

Desfrágmente las colecciones solo si experimenta tiempos más largos de operaciones CRUD durante las actualizaciones de metadatos. Para las versiones de MongoDB anteriores a la 6.0, una colección particionada se fragmenta cuando el tamaño de la colección crece significativamente debido a múltiples operaciones de inserción o actualización.

Para desfragmentar una colección particionada, utilice el La opción defragmentCollection del comando configureCollectionBalancing. La opción está disponible a partir de MongoDB 6.0.

Considere estos problemas antes de desfragmentar las colecciones:

  • La desfragmentación podría provocar muchas actualizaciones de metadatos en las particiones. Si tus operaciones CRUD ya están tardando más de lo habitual durante las migraciones, solo deberías ejecutar la desfragmentación durante una ventana de equilibrio de particiones para reducir la carga de trabajo del sistema.

  • Si la desfragmentación está afectando la carga de trabajo y la latencia de CRUD en el clúster, puedes reducir el impacto utilizando el parámetro chunkDefragmentationThrottlingMS.

  • Los fragmentos fusionados pierden su historial de colocación.

    • Esto significa que, mientras se ejecuta la desfragmentación, las lecturas de snapshot y, de forma indirecta, las transacciones podrían fallar con errores de historial de fragmentos obsoletos.

    • El historial de colocación registra las particiones en las que se almacenó un fragmento. La desfragmentación borra el historial de ubicaciones y algunas operaciones podrían fallar, pero normalmente se resolverán después de aproximadamente cinco minutos.

  • La desfragmentación afecta la localidad de los documentos en una colección al mover los datos entre las particiones. Si una colección tiene intervalos de datos a los que se accede con frecuencia, después de desfragmentar la colección, es posible que los datos a los que se accede con frecuencia estén en una sola partición. Esto podría disminuir el rendimiento de las operaciones CRUD al colocar la carga de trabajo en una sola partición en lugar de en varias particiones.

Nota

Por lo general, deberías usar una ventana de balanceo de particiones para especificar cuándo se ejecuta el balanceador en lugar de iniciar y detener manualmente la desfragmentación.

Esta sección describe detalles adicionales relacionados con la desfragmentación de colecciones fragmentadas.

El campo defragmentCollection devuelto por el comando configureCollectionBalancing solo se considera true cuando se está ejecutando la desfragmentación.

Después de la desfragmentación finalice automáticamente o si detiene manualmente la desfragmentación, el campo defragmentCollection se elimina del documento devuelto.

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.

Para obtener detalles sobre el balanceador de MongoDB, consulte Balanceador de clúster fragmentado.

Para obtener una introducción a chunkSize, consulta Modificar el tamaño del rango en un clúster fragmentado.

Cuando los datos de la colección compartidos entre dos particiones difieren en tres o más veces la configuración de chunkSize, el equilibrador migra los fragmentos entre las particiones.

Por ejemplo, si chunkSize tiene 128 MB y los datos de colección difieren en 384 MB o más, el balanceador migra los fragmentos entre las particiones.

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 para la actualización de metadatos de la partición es proporcional al tamaño de la tabla de enrutamiento. Las operaciones CRUD sobre la colección se bloquean temporalmente mientras se actualiza la metadatos de las particiones, y una tabla de enrutamiento más pequeña significa demoras más cortas en las operaciones CRUD.

Desfragmentar una colección reduce el número de fragmentos y el tiempo para actualizar los metadatos del fragmento.

Para reducir la carga de trabajo del sistema, configura el balanceador para que funcione solo en un tiempo específico utilizando una ventana de equilibrio de particiones. La desfragmentación se ejecuta durante el período de tiempo de la ventana de balanceo.

Puede utilizar el parámetro chunkDefragmentationThrottlingMS para limitar la velocidad de los comandos de división y fusión ejecutados por el balanceador.

Puedes iniciar y detener la desfragmentación en cualquier momento.

También puedes establecer una zona de particiones. Una zona de particiones se basa en la clave de partición, y se puede asociar cada zona con una o más particiones en un clúster.

Un clúster particionado solo divide fragmentos cuando es necesario migrarlos. Esto significa que el tamaño del fragmento puede superar chunkSize. Los fragmentos más grandes reducen el número de fragmentos en una partición y mejoran el rendimiento al reducir el tiempo necesario para actualizar los metadatos de la partición. Por ejemplo, es posible que se vea un fragmento de 1 TB en una partición aunque hayas configurado chunkSize en 256 MB.

chunkSize afecta a lo siguiente:

  • Cantidad máxima de datos que el balanceador intenta migrar entre dos particiones en una única operación de migración de fragmentos.

  • Cantidad de datos migrados durante la desfragmentación.

  • Introducción al particionado, consulte Particionado

  • Particionar los datos con fragmentos, ver Particionamiento de datos con Chunks

  • Configure el equilibrio de la colección, consulte configureCollectionBalancing

  • Examinar el estado de la colección de balanceadores, ver balancerCollectionStatus

  • Configura las ventanas de equilibrado de particiones, consulta Establecer el horario de la ventana de equilibrio

  • Supervise las particiones usando MongoDB Atlas, consulte Revisar los clústeres sharded

Volver

Config Database

En esta página