Los clústeres fragmentados pueden experimentar situaciones en las que las migraciones de fragmentos se estancan o uno o más fragmentos se vuelven gigantes. Cuando esto ocurre, el balanceador no puede distribuir los datos de manera uniforme entre los fragmentos. Esto puede provocar una utilización desigual de los recursos y una degradación del rendimiento del clúster.
Esta página describe las causas comunes de migraciones de fragmentos y fragmentos jumbo bloqueados, junto con los pasos para diagnosticar y resolver estos problemas. Si el problema persiste después de seguir los pasos a continuación, comuníquese con el soporte técnico.
Comprobaciones de requisitos previos
Verifique que su clúster se vea afectado por migraciones estancadas o fragmentos jumbo.
Verificar el estado del balanceador
Desde un mongos instancia, ejecutar:
sh.getBalancerState()
Si este método devuelve true pero la distribución de los datos sigue siendo desigual, se requiere una investigación adicional.
También puede consultar información detallada sobre el equilibrador:
db.adminCommand({ balancerStatus: 1 })
Comprueba la distribución de los fragmentos
Para revisar la distribución de fragmentos entre las particiones, ejecute:
sh.status(true)
Buscar:
Grandes diferencias en el número de fragmentos por shard.
Fragmentos marcados como
jumbo
Nota
Un fragmento marcado como jumbo no puede ser migrado por el balanceador hasta que se divida o se reduzca su tamaño de alguna otra manera.
Revisar los mensajes de registro
Registros del servidor de configuración
Revise los registros del servidor de configuración en busca de entradas relacionadas con el balanceo o la migración de fragmentos. Busque mensajes que indiquen:
Reintentos de migración
Migraciones abortadas
Trozos marcados como jumbo
Fallos durante las fases de confirmación o eliminación de la migración.
Registros de fragmentos
En los nodos de fragmentación, revise los registros para lo siguiente:
Tiempos de espera para la adquisición de bloqueos
Retraso en la replicación que afecta a la migración
Errores de espacio en disco
Fallos en el paso de migración
Problemas comunes y sus soluciones
Los fragmentos gigantes impiden la migración.
Un fragmento se considera de gran tamaño cuando excede el tamaño de fragmento configurado y no se puede dividir automáticamente.
Identificar trozos gigantes
Desde mongos:
sh.status(true)
Localiza los fragmentos etiquetados como jumbo.
Resolver fragmentos gigantes
Los fragmentos divisibles contienen múltiples valores de clave de fragmento únicos y se pueden dividir. Para resolver un fragmento jumbo divisible, divídalo manualmente:
sh.splitAt("database.collection", { shardKeyField: <value> })
Luego, reinicie el balanceador si es necesario:
sh.startBalancer()
Para saber cuándo es apropiado realizar la división manual, consulte Fragmentos divididos en un clúster fragmentado.
Losfragmentos indivisibles representan un único valor de clave de fragmento y no se pueden dividir. Para resolver un fragmento jumbo indivisible:
Refina la clave
refineCollectionShardKeyde fragmento usando para agregar un campo de sufijo, haciendo que el fragmento sea divisible.Consulta Fragmentos divisibles.Refragmentar la colección utilizando una clave de fragmentación distribuida de manera más uniforme. Consulte Refragmentar una colección.
Para obtener más detalles sobre cómo resolver bloques jumbo,consulte la bandera Clear.jumbo
Distribución ineficaz de claves de fragmentos
Si la clave de fragmentación tiene una cardinalidad baja o sigue un patrón monótonamente creciente, los fragmentos pueden crecer de forma desigual y resistirse al equilibrio.
Para mitigar:
Revise el patrón de clave de fragmentación utilizado por la colección.
Determine si la mayoría de las escrituras se dirigen a un rango estrecho de claves de fragmento. Si los valores de clave de fragmento de alta frecuencia provocan que las escrituras se concentren en un solo fragmento, consulte la sección Solución de problemas de claves de fragmento.
Considere la posibilidad de redistribuir la colección utilizando una clave de fragmentación con una distribución más uniforme.
Consulte la sección "Elegir una clave de fragmentación" para conocer las mejores prácticas.
Balanceador desactivado o en pausa
Si el balanceador está desactivado, no se producen migraciones de fragmentos.
Comprobar el estado del balanceador:
sh.getBalancerState()
Si está desactivado, actívelo:
sh.startBalancer()
Consulte la sección "Balanceador de clúster fragmentado" para obtener más detalles sobre el comportamiento del balanceador.
Migración bloqueada por operaciones en curso.
Las operaciones de larga duración, la creación de índices o las cargas de trabajo de escritura intensas pueden retrasar o bloquear las migraciones de fragmentos.
Para reducir la contienda:
Identificar operaciones de larga duración:
db.currentOp() Equilibrio de horarios durante períodos de menor actividad de escritura.
Asegúrese de que haya suficiente espacio en disco disponible en todas las particiones.
Nota
La migración de fragmentos implica la clonación de datos y una fase de eliminación. La falta de espacio en disco o un retraso en la replicación pueden demorar estas fases.
Verificar resolución
Tras resolver el problema:
Las migraciones de fragmentos se completaron con éxito.
No quedan fragmentos marcados como
jumbo.La distribución de los fragmentos entre las particiones se vuelve más uniforme.
El equilibrador permanece activo y estable.
Vuelva a comprobar la distribución:
sh.status(true)
Diagnósticos para recopilar para obtener más apoyo
Si el problema persiste, recopile la siguiente información antes de ponerse en contacto con el soporte técnico:
Salida de
sh.status(true)Salida de
db.adminCommand({ balancerStatus: 1 })Registros relevantes del servidor de configuración
Registros de fragmentos relevantes
Definición de clave de fragmentación para las colecciones afectadas
Versión de MongoDB
Descripción de la topología del clúster
Salida de
sh.getShardedDataDistribution()para el recuento de fragmentos y el tamaño de los datos por fragmento.