Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Balanceador

Gestionar balanceador de clúster fragmentado

Cambiado en la 3.4 versión: El proceso de balanceo se ha movido del mongos instancias al miembro principal del conjunto de réplicas del servidor de configuración.

Esta página describe los procedimientos administrativos comunes relacionados con el balance. Para obtener una introducción al equilibrio, consulta Balanceador de clústeres. Para obtener información de bajo nivel sobre el balanceo, consulta clúster balanceador.

sh.getBalancerState() verifica si el balanceador está habilitado (es decir, que el balanceador tiene permiso para ejecutarse). sh.getBalancerState() no comprueba si el equilibrador está equilibrando activamente los fragmentos.

Para ver si el balanceador está habilitado en tu clúster, ejecuta el siguiente comando, que retorna un valor booleano:

sh.getBalancerState()

También puedes ver si el balanceador está habilitado usando sh.status(). El campo currently-enabled indica si el balanceador está habilitado, y el campo currently-running indica si el balanceador está actualmente en funcionamiento.

Para ver si el proceso del balanceador está activo en su clúster:

  1. Conéctese a cualquier en el mongos mongo clúster utilizando el shell.

  2. Utilice la siguiente operación para determinar si el balanceador está ejecutándose:

    sh.isBalancerRunning()

El tamaño de fragmento predeterminado para un clúster fragmentado es de 64 megabytes. En la mayoría de los casos, este tamaño es adecuado para dividir y migrar fragmentos. Para obtener información sobre cómo el tamaño de fragmento afecta las implementaciones, consulte "Tamaño de fragmento".

Cambiar el tamaño de fragmento por defecto afecta a los fragmentos que se procesan durante las migraciones y las divisiones automáticas, pero no afecta retroactivamente a todos los fragmentos.

Para configurar el tamaño de fragmento predeterminado, consulta Modificar el tamaño de fragmento en un clúster.

En algunas situaciones, especialmente cuando su conjunto de datos crece lentamente y una migración puede afectar el rendimiento, es útil asegurarse de que el balanceador esté activo solo en ciertos momentos. El siguiente procedimiento especifica el activeWindow, que es el periodo de tiempo durante el cual el balanceador podrá migrar fragmentos:

1

Puede conectarse a cualquier del mongos clúster.

2

Emite el siguiente comando para cambiar a la base de datos de configuración.

use config
3

El balanceador no se activará en el stopped estado. Para garantizar que el balanceador no esté en el estado,stopped sh.startBalancer()utilice, como se muestra a continuación:

sh.startBalancer()

El balanceador no se iniciará si usted está fuera del plazo activeWindow.

A partir de MongoDB 4.2, sh.startBalancer() también permite la división automática para el clúster fragmentado.

4

Configura el activeWindow usando updateOne(), como en el siguiente ejemplo:

db.settings.updateOne(
{ _id: "balancer" },
{ $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } },
{ upsert: true }
)

Reemplaza <start-time> y <end-time> con valores horarios usando horas y minutos de dos cifras (por ejemplo, HH:MM) que especifican los límites de inicio y fin de la ventana de balanceo.

  • Para valores HH, utilice valores de hora entre 00 y 23.

  • Para el valor MM, use valores de minutos que van desde 00 hasta 59.

Para los clústeres particionados autogestionados o on-premises, MongoDB evalúa los tiempos de inicio y parada relativos a la zona horaria del miembro primario en el set de réplicas del servidor de configuración.

Para los clústeres Atlas, MongoDB evalúa las horas de inicio y finalización en relación con la zona horaria UTC.

Nota

La ventana del balanceador debe ser suficiente para terminar la migración de todos los datos insertados durante el día.

Dado que las tasas de inserción de datos pueden cambiar en función de la actividad y los patrones de uso, es importante garantizar que la ventana de balanceo que seleccione sea suficiente para respaldar las necesidades de su implementación.

Si ha configurado la ventana de balanceo y desea remover el cronograma para que el balanceador esté siempre en funcionamiento, utilice $unset para borrar el activeWindow, como se muestra a continuación:

use config
db.settings.updateOne( { _id : "balancer" }, { $unset : { activeWindow : true } } )

Importante

Dejar el balanceador deshabilitado durante períodos prolongados puede llevar a tener particiones desequilibradas, lo que degrada el rendimiento del clúster. Desactive el balanceador solo si es necesario y asegúrese de reactivar el balanceador cuando se complete el mantenimiento.

Por defecto, el equilibrador puede ejecutarse en cualquier momento y sólo mueve los fragmentos según sea necesario. Para desactivar el balanceador por un corto periodo de tiempo y evitar toda migración, utiliza el siguiente procedimiento:

  1. Conéctese a cualquier en el mongos mongo clúster utilizando el shell.

  2. Ejecute la siguiente operación para deshabilitar el balanceador:

    sh.stopBalancer()

    Si una migración está en progreso, el sistema completará la migración en curso antes de detenerse.

    A partir de MongoDB 4.2, también deshabilita la división automática para el clústersh.stopBalancer() fragmentado.

  3. Para verificar que el balanceador no se iniciará, ejecute el siguiente comando, que devuelve false si el balanceador está deshabilitado:

    sh.getBalancerState()

    Opcionalmente, para verificar que no haya migraciones en progreso después de la deshabilitación, ejecute la siguiente operación en el mongo shell:

    use config
    while( sh.isBalancerRunning() ) {
    print("waiting...");
    sleep(1000);
    }

Nota

Para desactivar el balanceador desde un controlador, utiliza el comando balancerStop en la base de datos admin, de la siguiente manera:

db.adminCommand( { balancerStop: 1 } )

Utilice este procedimiento si ha desactivado el balanceador y está listo para volver a activarlo:

  1. Conéctese a cualquier en el mongos mongo clúster utilizando el shell.

  2. Emita una de las siguientes operaciones para habilitar el equilibrador:

    Desde la shell mongo, ejecuta:

    sh.startBalancer()

    Nota

    Para habilitar el balanceador desde un controlador, utilice el comando balancerStart contra la admin base de datos, como se muestra a continuación:

    db.adminCommand( { balancerStart: 1 } )

    A partir de MongoDB 4.2, sh.startBalancer() también permite la división automática para el clúster fragmentado.

Nota

Deshabilitar el balanceador solo es necesario cuando se realizan copias de seguridad manualmente, ya sea llamando a o programando una tarea que llame mongodump a mongodump en un momento específico.

No es necesario desactivar el balanceador cuando se utilizan procesos coordinados de copia de seguridad y restauración:

Si MongoDB migra un fragmento durante una copia de seguridad, es posible que termines con una instantánea inconsistente de tu clúster fragmentado. No ejecute nunca una copia de seguridad mientras el equilibrador esté activo. Para garantizar que el balanceador esté inactivo durante su operación de copia de seguridad:

  • Configura la ventana de balanceo para que el balanceador esté inactivo durante la copia de seguridad. Asegúrate de que la copia de seguridad pueda completarse mientras tengas el equilibrador deshabilitado.

  • desactivar manualmente el balanceador durante la duración del procedimiento de copia de seguridad.

Si apagas el balanceador en medio de una ronda de equilibrado, el apagado no es instantáneo. El balanceador completa el movimiento de fragmento en curso y luego detiene todas las siguientes rondas de balanceo.

Antes de iniciar una copia de seguridad, confirme que el balanceador no esté activo. Puede usar el siguiente comando para determinar si el balanceador está activo:

!sh.getBalancerState() && !sh.isBalancerRunning()

Una vez finalizado el procedimiento de copia de seguridad, puede reactivar el proceso de equilibrado.

Puedes deshabilitar la equilibración de una colección específica con el método sh.disableBalancing(). Es posible que desee desactivar el balanceador para una colección específica para admitir operaciones de mantenimiento o cargas de trabajo atípicas, por ejemplo, durante la ingestión de datos o la exportación de datos.

Cuando desactivas el equilibrado en una colección, MongoDB no interrumpirá las migraciones en curso.

Para desactivar el balanceo en una colección, conéctate a un mongos con la mongo shell y llama al método sh.disableBalancing().

Por ejemplo:

sh.disableBalancing("students.grades")

El método acepta como sh.disableBalancing() parámetro el espacio de nombres completo de la colección.

Puede habilitar el equilibrio para una colección específica con el sh.enableBalancing() método.

Cuando habilitas el balanceo para una colección, MongoDB no comenzará a balancear los datos inmediatamente. Sin embargo, si los datos en tu colección particionada no están balanceados, MongoDB podrá empezar a distribuir los datos de manera más uniforme.

Para habilitar el balanceo en una colección, conéctate a un mongos con el mongo shell y llama al método sh.enableBalancing().

Por ejemplo:

sh.enableBalancing("students.grades")

El método acepta como sh.enableBalancing() parámetro el espacio de nombres completo de la colección.

Para confirmar si el balanceo de una colección está habilitado o deshabilitado, consulte la collections colección en la base de datos para encontrar el espacio de nombres config de la colección y verifique el noBalance campo. Por ejemplo:

db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

Esta operación devolverá un error nulo, true, false, o ninguna salida:

  • Un error nulo indica que el espacio de nombres de la colección es incorrecto.

  • Si el resultado es true, el balanceo está desactivado.

  • Si el resultado es false, el balanceo está habilitado actualmente pero se ha deshabilitado en el pasado para la colección. El balanceo de esta colección comenzará la próxima vez que se ejecute el balanceador.

  • Si la operación no devuelve ningún resultado, el balanceo está habilitado actualmente y nunca se ha deshabilitado para esta colección. El balanceo de esta colección comenzará la próxima vez que se ejecute el balanceador.

También puedes ver si el balanceador está habilitado usando sh.status(). El campo currently-enabled indica si el balanceador está habilitado.

Durante la migración de fragmentos, el valor _secondaryThrottle determina cuándo continúa la migración con el siguiente documento en el fragmento.

En la config.settings colección:

  • Si la opción _secondaryThrottle para el balanceador está configurada en nivel de confirmación de escritura (write concern), cada documento movido durante la migración de fragmentos debe recibir el acuse de recibo solicitado antes de proceder con el siguiente documento.

  • Si la configuración _secondaryThrottle no 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.

    Este es el comportamiento por defecto para WiredTiger.

Para cambiar la configuración de _secondaryThrottle, conéctate a una mongos instancia y actualiza directamente el valor de _secondaryThrottle en la settings colección de la base de datos de configuración. Por ejemplo, desde un mongo shell conectado a un mongos, emita el siguiente comando:

use config
db.settings.updateOne(
{ "_id" : "balancer" },
{ $set : { "_secondaryThrottle" : { "w": "majority" } } },
{ upsert : true }
)

Los efectos de cambiar la configuración _secondaryThrottle podrían no ser inmediatos. Para garantizar un efecto inmediato, detenga y reinicie el balanceador para habilitar el valor seleccionado de _secondaryThrottle.

Para obtener más información sobre el comportamiento de replicación durante los distintos pasos de la migración de fragmentos, consulte Migración y replicación de fragmentos.

Para el comando moveChunk, puede usar las opciones _secondaryThrottle y writeConcern del comando para especificar el comportamiento durante el comando. Para obtener más información, consulta el moveChunk comando.

El ajuste _waitForDelete del balanceador y el comando moveChunk afectan cómo el balanceador migra varios fragmentos desde una partición. De forma predeterminada, el balanceador no espera a que se complete la fase de eliminación de la migración en curso antes de iniciar la siguiente migración de fragmento. Para que la fase de eliminación bloquee el inicio de la siguiente migración de fragmentos, puedes establecer el _waitForDelete como verdadero.

Para obtener detalles sobre la migración de fragmentos, consulta Migración de fragmentos. Para obtener detalles sobre el comportamiento de encolamiento de la migración de fragmentos, consulta Limpieza asincrónica de la migración de fragmentos.

El _waitForDelete es generalmente para fines de pruebas internas. Para cambiar el valor de _waitForDelete del balanceador:

  1. Conéctese a una instancia mongos.

  2. Actualiza el valor _waitForDelete en la settings colección de la base de datos de configuración. Por ejemplo:

    use config
    db.settings.updateOne(
    { "_id" : "balancer" },
    { $set : { "_waitForDelete" : true } },
    { upsert : true }
    )

Una vez configurado en true, para volver al comportamiento por defecto:

  1. Conéctese a una instancia mongos.

  2. Actualice o desactive el campo _waitForDelete en la colección settings de la base de datos de configuración:

    use config
    db.settings.updateOne(
    { "_id" : "balancer", "_waitForDelete": true },
    { $unset : { "_waitForDelete" : "" } }
    )

De forma predeterminada, MongoDB no puede mover un fragmento si la cantidad de documentos en el fragmento es mayor que 1.3 veces el resultado de dividir el tamaño del fragmento configurado por el tamaño promedio del documento.

Al especificar la configuración del balanceador attemptToBalanceJumboChunks en true, el balanceador puede migrar estos rangos grandes siempre y cuando no hayan sido etiquetados como jumbo.

Para configurar el ajuste attemptToBalanceJumboChunks del equilibrador, conéctate a una instancia de mongos e actualiza directamente la colección config.settings. Por ejemplo, desde un mongo shell conectado a una mongos instancia, emita el siguiente comando:

db.getSiblingDB("config").settings.updateOne(
{ _id: "balancer" },
{ $set: { attemptToBalanceJumboChunks : true } },
{ upsert: true }
)

Si el fragmento que desea mover está etiquetado como jumbo, puede borrar manualmente el indicador jumbo para que el balanceador intente migrar el fragmento.

Alternativamente, puedes utilizar el comando moveChunk con forceJumbo: true para migrar manualmente fragmentos que superen el límite de tamaño (con o sin la etiqueta jumbo). Sin embargo, cuando ejecutes moveChunk con forceJumbo: true, las operaciones de escritura en la colección pueden bloquearse durante un largo periodo de tiempo durante la migración.

Por defecto, las particiones no tienen restricciones en el tamaño de almacenamiento. Sin embargo, puedes establecer un tamaño máximo de almacenamiento para una partición determinada en el clúster particionado. Al seleccionar posibles particiones de destino, el balanceador ignora las particiones donde una migración superaría el tamaño máximo de almacenamiento configurado.

La colección shards en la base de datos de configuración almacena datos de configuración relacionados con las particiones.

{ "_id" : "shard0000", "host" : "shard1.example.com:27100" }
{ "_id" : "shard0001", "host" : "shard2.example.com:27200" }

Para limitar el tamaño de almacenamiento de una partición determinada, utiliza el método db.collection.updateOne() con el operador $set para crear el campo maxSize y asignarle un valor integer. El campo maxSize representa el tamaño máximo de almacenamiento para la partición en megabytes.

La siguiente operación establece un tamaño máximo en una partición de 1024 megabytes:

config = db.getSiblingDB("config")
config.shards.updateOne( { "_id" : "<shard>"}, { $set : { "maxSize" : 1024 } } )

Este valor incluye el tamaño mapeado de todos los archivos de datos en la partición, incluyendo las bases de datos local y admin.

Por defecto, maxSize no está especificado, permitiendo que las particiones consuman la cantidad total de espacio disponible en sus máquinas si es necesario.

También puedes configurar maxSize cuando añadas una partición.

Para establecer maxSize al agregar una partición, establecer el parámetro maxSize del comando addShard al tamaño máximo en megabytes. El siguiente comando ejecutado en el shell mongo agrega una partición con un tamaño máximo de 125 megabytes:

config = db.getSiblingDB("config")
config.runCommand( { addshard : "example.net:34008", maxSize : 125 } )

Volver

Balanceador