Esta página describe procedimientos administrativos comunes relacionados con el equilibrio. Para una introducción a la compensación, consulta Balanceador de clúster fragmentado. Para información de nivel inferior sobre el equilibrio, consulta Internals de Balanceador.
El proceso balanceador se ha trasladado del mongos instancias al miembro principal del conjunto de réplicas del servidor de configuración.
Verifica el estado de balanceador
sh.getBalancerState() comprueba si el balanceador está habilitado (es decir, si se permite que el balanceador se ejecute). sh.getBalancerState() no verifica si el balanceador está migrando datos activamente.
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.
Comprobar si el balanceador está funcionando
Para ver si el proceso del balanceador está activo en su clúster:
Configurar el tamaño del rango por defecto
El tamaño de rango por defecto para un clúster es de 128 megabytes. En la mayoría de situaciones, el tamaño por defecto es adecuado para dividir y migrar fragmentos. Para obtener información sobre cómo el tamaño del rango afecta a las implementaciones, consulte los detalles en Tamaño del rango.
Cambiar el tamaño por defecto del rango afecta los rangos que se procesan durante las migraciones y las divisiones automáticas, pero no afecta retroactivamente a todos los rangos.
Para configurar el tamaño del rango por defecto, consulta Modificar el tamaño del rango en un clúster.
Programar la ventana de Balanceo
En algunas situaciones, particularmente cuando tu conjunto de datos crece lentamente y una migración puede afectar el rendimiento, es útil garantizar que el balanceador esté activo solo en determinados momentos. Por defecto, el proceso balanceador siempre está habilitado y migrando fragmentos. El siguiente procedimiento especifica el activeWindow, que es el periodo durante el cual el Balanceador puede migrar fragmentos:
Cambie a la Base de datos de Configuración.
Emite el siguiente comando para cambiar a la base de datos de configuración.
use config
Asegura que el balanceador no esté stopped.
El balanceador no se activará en el estado stopped. Para asegurarse de que el balanceador no esté stopped, usa sh.startBalancer(), como en el siguiente caso:
sh.startBalancer()
El balanceador no se iniciará si usted está fuera del plazo activeWindow.
Modifica la ventana del balanceador.
Hay dos métodos para modificar la ventana activa del balanceador:
Establecer el parámetro
activeWindow.Usar
activeWindowhace que la ventana de balanceo sea la misma todos los días. Configura elactiveWindowusandoupdateOne():db.settings.updateOne( { _id: "balancer" }, { $set: { activeWindow : { start : "10:00", stop : "18:00" } } }, { 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 de
HH, utilice valores de hora con un rango de00a23.Para el valor
MM, use valores de minutos que van desde00hasta59.
Establecer el parámetro
activeWindowDOW.activeWindowDOWpermite especificar ventanas de balanceo para diferentes días de la semana. Configura elactiveWindowDOWusandoupdateOne().Por ejemplo, para configurar la ventana de equilibración de 9:00de la mañana a 5:00de la tarde de lunes a viernes, y todo el día sábado y domingo, deberías ejecutar lo siguiente:
db.settings.updateOne( { _id: "balancer" }, { $set: { activeWindowDOW : [ { day: "Monday", start : "09:00", stop : "17:00" }, { day: "Tuesday", start : "09:00", stop : "17:00" }, { day: "Wednesday", start : "09:00", stop : "17:00" }, { day: "Thursday", start : "09:00", stop : "17:00" }, { day: "Friday", start : "09:00", stop : "17:00" }, { day: "Saturday", start : "00:00", stop : "23:59" }, { day: "Sunday", start : "00:00", stop : "23:59" } ]}}, { upsert: true } ) Para configurar la ventana de equilibrio para que sea durante la noche desde 10:00pm hasta 6:00am todos los días, deberías configurar múltiples ventanas por día:
db.settings.updateOne( { _id: "balancer" }, { $set: { activeWindowDOW : [ { day: "Monday", start : "22:00", stop : "23:59" }, { day: "Tuesday", start : "00:00", stop : "06:00" }, { day: "Tuesday", start : "22:00", stop : "23:59" }, { day: "Wednesday", start : "00:00", stop : "06:00" }, { day: "Wednesday", start : "22:00", stop : "23:59" }, { day: "Thursday", start : "00:00", stop : "06:00" }, { day: "Thursday", start : "22:00", stop : "23:59" }, { day: "Friday", start : "00:00", stop : "06:00" }, { day: "Friday", start : "22:00", stop : "23:59" }, { day: "Saturday", start : "00:00", stop : "06:00" }, { day: "Saturday", start : "22:00", stop : "23:59" }, { day: "Sunday", start : "00:00", stop : "06:00" }, { day: "Sunday", start : "22:00", stop : "23:59" } ]}}, { upsert: true } ) Si estableces tanto
activeWindowcomoactiveWindowDOW, el equilibrador sólo estará activo para las ventanas configuradas usandoactiveWindowDOW. El balanceador ignoraactiveWindow.
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 clústeres de Atlas, MongoDB evalúa las horas de inicio y paro 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.
Ventana de balance de cheques
Para ver la ventana de balance actual, ejecute el siguiente comando:
use config db.settings.find( { _id: "balancer" } )
Remueva un cronograma de Ventana de Balanceo
Si has configurado la ventana de balanceo y deseas eliminar la programación para que el balanceador esté siempre en funcionamiento, usa $unset para borrar la programación.
Limpia el activeWindow ejecutando:
db.settings.updateOne( { _id : "balancer" }, { $unset : { activeWindow : true } } )
Limpia el activeWindowDOW ejecutando:
db.settings.updateOne( { _id : "balancer" }, { $unset : { activeWindowDOW : true } } )
Si tienes configurados tanto activeWindow como activeWindowDOW, debes desactivarlos individualmente usando $unset como se muestra arriba.
Desactivar el balanceador
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:
Conecta a cualquier en el
mongosmongoshclúster usando la shell a través de shell.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.
Para verificar que el balanceador no se iniciará, ejecute el siguiente comando, que devuelve
falsesi el balanceador está deshabilitado:sh.getBalancerState() Opcionalmente, para verificar que no hay migraciones en curso después de desactivar, ejecuta la siguiente operación en el
mongoshshell: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 } )
A partir de MongoDB 7.0, detener el balanceador también desactiva el AutoMerger para el clúster.
Activar el Balanceador
Utilice este procedimiento si ha desactivado el balanceador y está listo para volver a activarlo:
Conecta a cualquier en el
mongosmongoshclúster usando la shell a través de shell.Emita una de las siguientes operaciones para habilitar el equilibrador:
Desde el
mongoshshell, emita:sh.startBalancer() Nota
Para habilitar el balanceador desde un controlador, utilice el comando balancerStart con la base de datos
admin, como en el siguiente ejemplo:db.adminCommand( { balancerStart: 1 } )
A partir de MongoDB 7.0, iniciar el balanceador también habilita el AutoMerger para el clúster fragmentado.
Desactivar el equilibrado durante las copias de seguridad
Nota
Deshabilitar el balanceador solo es necesario cuando se hacen copias de seguridad manualmente, ya sea llamando a mongodump o programando una tarea que llame 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 operación de copia de seguridad, confirme que el balanceador no esté activo. Puedes usar el siguiente comando para determinar si el balanceador está activo:
!sh.getBalancerState() && !sh.isBalancerRunning()
Cuando el procedimiento de copia de seguridad esté completo, puedes volver a activar el proceso de balanceador.
Deshabilitar el balanceo en una colección
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 equilibrio en una colección, conecta a un mongos con la shell mongosh y llama al método sh.disableBalancing().
Por ejemplo:
sh.disableBalancing("students.grades")
El método sh.disableBalancing() acepta como parámetro el namespace completo de la colección.
Habilite el balanceo en una colección
Puedes activar el balanceo para una colección específica utilizando el método sh.enableBalancing().
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 la mongosh shell y ejecuta el método sh.enableBalancing().
Por ejemplo:
sh.enableBalancing("students.grades")
El método sh.enableBalancing() acepta como parámetro el namespace completo de la colección.
Confirme que el balanceo esté habilitado o deshabilitado
Para confirmar si el balanceo de una colección está habilitado o deshabilitado, query la colección collections en la base de datos config para el namespace de la colección y revisa el campo noBalance. 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 da ningún resultado, el balanceo está habilitado actualmente y nunca ha sido deshabilitado anteriormente 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.
Cambiar el comportamiento de replicación para la migración de fragmentos
Acelerador secundario
Durante la migración de fragmentos, el valor _secondaryThrottle determina cuándo la migración continuará con el siguiente documento en el fragmento.
En la colección config.settings:
Si la opción
_secondaryThrottlepara 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 el ajuste
_secondaryThrottleno está configurado, el proceso de migración no espera a que se replique en un secundario y, en su lugar, continúa con el siguiente documento.Este es el comportamiento por defecto para WiredTiger.
Para cambiar la configuración _secondaryThrottle, conéctate a una instancia de mongos y actualiza directamente el valor de _secondaryThrottle en la colección settings de la base de datos de configuración. Por ejemplo, desde un shell de mongosh conectado a un mongos, ejecuta el siguiente comando:
use config db.settings.updateOne( { "_id" : "balancer" }, { $set : { "_secondaryThrottle" : { "w": "majority" } } }, { upsert : true } )
Los efectos de cambiar la configuración _secondaryThrottle pueden no ser inmediatos. Para garantizar un efecto inmediato, detén y reinicia el balanceador para habilitar el valor seleccionado de _secondaryThrottle.
Para más información sobre el comportamiento de replicación durante los distintos pasos de la migración de fragmentos, consulta Migración y replicación de rango.
Usa las opciones
secondaryThrottleywriteConcerndel comandomoveRangepara especificar el comportamiento durante la ejecución del comando.Usa las opciones
_secondaryThrottleywriteConcerndel comandomoveChunkpara especificar el comportamiento durante la ejecución del comando.
Para obtener más detalles, consulta moveRange y moveChunk.
Esperando el borrar
El ajuste _waitForDelete del balanceador y el comando moveChunk afectan cómo el balanceador migra varios fragmentos desde una partición. Del mismo modo, la configuración _waitForDelete del equilibrador y el comando moveRange también afectan la forma en que el equilibrador migra varios fragmentos desde una partición. Por defecto, el balanceador no espera a que se complete la fase de eliminación de la migración en curso antes de iniciar la migración del siguiente fragmento. Para que la fase de eliminación bloquee el inicio de la siguiente migración de fragmento, puedes configurar _waitForDelete en verdadero.
Para obtener detalles sobre la migración de fragmento, consultar Migración de rango. Para obtener detalles sobre el comportamiento de enrutamiento de la migración de fragmento, consulte Limpieza asíncrona de migración de rango.
Importante
Cuando el campo _waitForDelete está configurado en true, MongoDB no espera el retraso en orphanCleanupDelaySecs antes de realizar la supresión por rango. Si usas el parámetro _waitForDelete y se están realizando operaciones de lectura en secundarios, la lectura podría terminar debido a la fase de eliminación de la migración. Para obtener más información, consulte terminateSecondaryReadsOnOrphanCleanup.
Para cambiar el valor de _waitForDelete del balanceador:
Conéctese a una instancia
mongos.Actualiza el valor
_waitForDeleteen lasettingscolecció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:
Conéctese a una instancia
mongos.Actualice o desactive el campo
_waitForDeleteen la colecciónsettingsde la base de datos de configuración:use config db.settings.updateOne( { "_id" : "balancer", "_waitForDelete": true }, { $unset : { "_waitForDelete" : "" } } )
Rangos de saldo que exceden el límite de tamaño
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.
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 shell mongosh conectado a una instancia mongos, ejecute el siguiente comando:
db.getSiblingDB("config").settings.updateOne( { _id: "balancer" }, { $set: { attemptToBalanceJumboChunks : true } }, { upsert: true } )
Si el rango que se quiere mover está marcado como jumbo, se puede quitar manualmente la marca de jumbo para que el balanceador intente migrar el rango.
También puede migrar manualmente rangos que excedan el límite de tamaño (con o sin la etiqueta jumbo) utilizando ya sea:
el comando
moveRangecon la opción forceJumbo: trueel comando
moveChunkcon la opción forceJumbo: true
Sin embargo, cuando ejecutas moveRange o moveChunk con forceJumbo: true, las operaciones de guardar en la colección pueden bloquearse durante un largo periodo de tiempo durante la migración.