El balanceador de MongoDB es un proceso en segundo plano que monitorea la cantidad de datos en cada Fragmento para cada colección fragmentada. Cuando la cantidad de datos de una colección fragmentada en un fragmento determinado alcanza umbrales de migración específicos, el balanceador intenta migrar automáticamente los datos entre fragmentos y alcanzar una cantidad uniforme de datos por fragmento, respetando las zonas. De forma predeterminada, el proceso del balanceador siempre está habilitado.
El procedimiento de equilibrio para clústeres fragmentados es completamente transparente para la capa de usuario y de aplicación, aunque puede haber algún impacto en el rendimiento mientras se lleva a cabo el procedimiento.
El equilibrador se ejecuta en el servidor principal del conjunto de réplicas del servidor de configuración (CSRS).
Componentes internos del equilibrador
Las migraciones de rangos conllevan cierta sobrecarga en términos de ancho de banda y carga de trabajo, lo cual puede afectar el rendimiento de la base de datos. El balanceador intenta minimizar el impacto mediante:
Restringir un fragmento a una sola migración a la vez. En concreto, un fragmento no puede participar en varias migraciones de datos simultáneamente. El balanceador migra los rangos uno a uno.
MongoDB puede realizar migraciones de datos en paralelo, pero cada fragmento puede participar en una sola migración a la vez. Para un clúster fragmentado con n fragmentos, MongoDB puede realizar un máximo de n/2 (redondeado hacia abajo) migraciones simultáneas.
Consultetambién Limpieza de migración de rango asincrónica.
Seinicia una ronda de equilibrio solo cuando la diferencia en la cantidad de datos entre el fragmento con la mayor cantidad de datos para una colección fragmentada y el fragmento con la menor cantidad de datos para esa colección alcanza el umbral de migración.
Puede deshabilitar el balanceador temporalmente para realizar tareas de mantenimiento, pero dejarlo deshabilitado durante períodos prolongados puede reducir el rendimiento del clúster. Para obtener más información, consulte Deshabilitar el balanceador.
También puede limitar el periodo de ejecución del balanceador para evitar que afecte al tráfico de producción.Consulte "Programar el periodo de balanceo" para obtener más información.
Nota
La especificación de la ventana de equilibrio es relativa a la zona horaria local del servidor principal del conjunto de réplicas del servidor de configuración.
Agregar y eliminar fragmentos del clúster
Añadir un fragmento a un clúster crea un desequilibrio, ya que el nuevo fragmento no contiene datos. Aunque MongoDB comienza a migrar datos al nuevo fragmento inmediatamente, el clúster puede tardar un tiempo en equilibrarse. Consulta el tutorial "Añadir fragmentos a un clúster" para obtener instrucciones sobre cómo añadir un fragmento a un clúster.
Eliminar un fragmento de un clúster crea un desequilibrio similar, ya que los datos que residen en él deben redistribuirse por todo el clúster. Si bien MongoDB comienza a drenar un fragmento eliminado inmediatamente, el clúster puede tardar un tiempo en equilibrarse. No apague los servidores asociados al fragmento eliminado durante este proceso.
Cuando se elimina un fragmento en un clúster con una distribución de fragmentos desigual, el equilibrador primero elimina los fragmentos del fragmento de drenaje y luego equilibra la distribución de fragmentos desigual restante.
Consulta el tutorial Eliminar fragmentos de un clúster para obtener instrucciones sobre cómo eliminar de forma segura un fragmento de un clúster.
Procedimiento de migración de rango
Todas las migraciones de rango utilizan el siguiente procedimiento:
El proceso del balanceador envía el comando al fragmento de
moveRangeorigen.El origen inicia la migración al recibir un
moveRangecomando interno. Durante el proceso de migración, las operaciones en el rango se envían al fragmento de origen. Este es responsable de las operaciones de escritura entrantes en el rango.El fragmento de destino crea cualquier índice requerido por el origen que no exista en el destino.
El fragmento de destino empieza a solicitar documentos en el rango y a recibir copias de los datos. Consulte también Migración y replicación de rangos.
Después de recibir el documento final en el rango, el fragmento de destino inicia un proceso de sincronización para garantizar que tenga los cambios en los documentos migrados que ocurrieron durante la migración.
Cuando está completamente sincronizado, el fragmento de origen se conecta a la base de datos de configuración y actualiza los metadatos del clúster con la nueva ubicación del rango.
Una vez que el fragmento de origen completa la actualización de los metadatos, y una vez que no hay cursores abiertos en el rango, el fragmento de origen elimina su copia de los documentos.
Nota
Si el balanceador necesita realizar migraciones de fragmentos adicionales desde el fragmento de origen, puede iniciar la siguiente migración sin esperar a que el proceso de migración actual finalice este paso de eliminación.Consulte Limpieza de migración de rango asincrónica.
Advertencia
Las lecturas secundarias en un clúster fragmentado con migraciones pueden perder documentos
Las lecturas secundarias de larga duración en un clúster fragmentado pueden perder documentos si se están produciendo migraciones.
Antes de eliminar un fragmento durante la migración, MongoDB espera orphanCleanupDelaySecs o que las consultas en curso que involucran al fragmento se completen en el nodo principal del fragmento, lo que sea más largo. Las consultas que se ejecutaron inicialmente en un nodo principal, pero que continúan después de que este se haya reducido a un nodo secundario, se tratarán como si se hubieran ejecutado inicialmente en un nodo secundario. Es decir, el servidor solo espera orphanDelayCleanupSecs si no hay consultas dirigidas al fragmento en el nodo principal actual.
Las consultas que tienen como objetivo el fragmento y se ejecutan en recursos secundarios pueden perder documentos si estas consultas tardan más de orphanCleanupDelaySecs.
Umbrales de migración
Para minimizar el impacto del equilibrio en el clúster, el equilibrador solo comienza a equilibrar después de que la distribución de datos de una colección fragmentada haya alcanzado ciertos umbrales.
Una colección se considera equilibrada si la diferencia de datos entre los fragmentos (para esa colección) es menor que tres veces el tamaño del rango configurado para la colección. Para el tamaño de rango predeterminado 128MB de, dos fragmentos deben tener una diferencia de tamaño de datos de al menos 384MB para que se produzca una migración.
Limpieza de migración de rango asincrónica
Para migrar datos desde un fragmento, el balanceador migra los datos rango por rango. Sin embargo, no espera a que finalice la fase de eliminación de la migración actual para iniciar la siguiente migración de rango.Consulte Migración de rango para conocer el proceso de migración de rango y la fase de eliminación.
Este comportamiento de puesta en cola permite que los fragmentos descarguen datos más rápidamente en casos de clústeres muy desequilibrados, como cuando se realizan cargas de datos iniciales sin división previa y cuando se agregan nuevos fragmentos.
Este comportamiento también afecta al moveRange comando y los scripts de migración que utilizan el moveRange comando pueden avanzar más rápidamente.
En algunos casos, las fases de eliminación pueden persistir durante más tiempo. Las migraciones de rango se han optimizado para ser más resilientes en caso de una conmutación por error durante la fase de eliminación. Los documentos huérfanos se limpian incluso si el servidor principal de un conjunto de réplicas falla o se reinicia durante esta fase.
Importante
Cuando _waitForDelete se configura el campo, MongoDB no espera el retraso antes de eliminar el rango. Si usa orphanCleanupDelaySecs el _waitForDelete parámetro y realiza operaciones de lectura en los secundarios, es posible que la lectura omita documentos debido a la fase de eliminación de la migración.
Para más información, consulte Esperar para borrar.
Nota
La eliminación de rango es una operación que consume muchos recursos y que puede generar un estrés significativo en la memoria caché y en E/S a medida que el clúster elimina los documentos.
Si planea mover una gran cantidad de datos, como al añadir fragmentos a un clúster o durante la distribución inicial de una colección fragmentada entre varios fragmentos, considere volver a fragmentar la colección. Las operaciones de refragmentación no requieren limpieza de rangos, lo que las hace mucho menos estresantes para el clúster.
Para obtener más información, consulte Repartir una colección.
Migración y replicación de rangos
Durante la migración de rango, el valor _secondaryThrottle determina cuándo continúa la migración con el siguiente documento en el rango.
En la config.settings colección:
Si la
_secondaryThrottleconfiguración para el balanceador está establecida en una preocupación de escritura, cada documento movido durante la migración de rango debe recibir el reconocimiento solicitado antes de continuar con el siguiente documento.Si la configuración
_secondaryThrottleno está establecida, el proceso de migración no espera la replicación a un documento secundario y, en su lugar, continúa con el siguiente documento.
Para actualizar el _secondaryThrottle parámetro del balanceador, consulte Acelerador secundario para ver un ejemplo.
Independientemente de cualquier configuración _secondaryThrottle, ciertas fases de la migración por rangos tienen la siguiente política de replicación:
MongoDB pausa brevemente todas las lecturas y escrituras de la aplicación en la colección migrada en el fragmento de origen antes de actualizar los servidores de configuración con la ubicación del rango. MongoDB reanuda las lecturas y escrituras de la aplicación después de la actualización. El traslado del rango requiere que todas las escrituras sean confirmadas por la mayoría de los miembros del conjunto de réplicas, tanto antes como después de confirmar el traslado del rango en los servidores de configuración.
Cuando finaliza una migración saliente y se produce una limpieza, todas las escrituras se deben replicar en la mayoría de los servidores antes de que se pueda realizar una limpieza adicional (de otras migraciones salientes) o se puedan realizar nuevas migraciones entrantes.
Para actualizar la configuración de _secondaryThrottle en la colección config.settings, ver secundario Throttle para un ejemplo.
Cantidad máxima de documentos por rango para migrar
Por defecto, MongoDB no puede mover un rango si el número de documentos en el rango es mayor que 2 veces el resultado de dividir el tamaño del rango configurado por el tamaño promedio de los documentos. Si MongoDB puede mover un subrango de un fragmento y reducir su tamaño a menos de eso, el balanceador lo hace migrando un rango. db.collection.stats() incluye el campo avgObjSize, que representa el tamaño medio de los documentos en la colección.
Para fragmentos que son demasiado grandes para migrar:
La configuración del balanceador
attemptToBalanceJumboChunkspermite que el balanceador migre fragmentos demasiado grandes para mover, siempre que los fragmentos no estén etiquetados como jumbo. Consulte los rangos de balance que exceden el límite de tamaño para obtener más detalles.Al emitir los comandos
moveRangeymoveChunk, es posible especificar la opción forceJumbo para permitir la migración de rangos que son demasiado grandes para moverse. Los rangos pueden o no estar etiquetados como jumbo.
Ajuste del rendimiento de la eliminación de rango
Puede ajustar el impacto en el rendimiento de la eliminación de rangos con los parámetros y. Por rangeDeleterBatchSize rangeDeleterBatchDelayMS ejemplo:
Para limitar la cantidad de documentos eliminados por lote, puede establecer en un valor
rangeDeleterBatchSizepequeño,32como.Para agregar un retraso adicional entre eliminaciones por lotes, puede establecer por encima del
rangeDeleterBatchDelayMSvalor20predeterminado actual de milisegundos.
Nota
Si hay operaciones de lectura en curso o cursores abiertos en la colección destinada a las eliminaciones, es posible que los procesos de eliminación de rango no puedan continuar.
Change Streams y documentos huérfanos
A partir de MongoDB,5.3 durante la migración de rango, no se generan eventos de flujode cambio para las actualizaciones de documentos huérfanos.
Tamaño del fragmento
De forma predeterminada, MongoDB intenta llenar todo el espacio de disco disponible con datos en cada fragmento a medida que crece el conjunto de datos. Para garantizar que el clúster siempre tenga la capacidad de gestionar el crecimiento de datos, monitoree el uso del disco y otras métricas de rendimiento.
Consulte el tutorial Cambiar el tamaño máximo de almacenamiento para un fragmento determinado para obtener instrucciones sobre cómo configurar el tamaño máximo de un fragmento.