Los clústeres particionados pueden afrontar situaciones en las que las migraciones de fragmentos se estanquen o en las que uno o más fragmentos se conviertan en jumbo. Cuando esto sucede, el equilibrador no puede distribuir los datos de manera uniforme entre las particiones. Esto puede ocasionar una utilización desigual de los recursos y un menor rendimiento del clúster.
Esta página describe las causas comunes de las migraciones de fragmentos atascadas y los fragmentos jumbo, junto con los pasos para diagnosticar y resolver estas condiciones. Si el problema persiste después de completar los pasos que se indican a continuación, comuníquese con el soporte técnico.
Comprobaciones previas
Verifique que su clúster esté afectado por migraciones atascadas o fragmentos jumbo.
Revisar 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 puedes revisar información detallada sobre el balanceador:
db.adminCommand({ balancerStatus: 1 })
Verificar la distribución de fragmentos
Para revisar la distribución de fragmentos entre las particiones, ejecuta:
sh.status(true)
Busca:
Grandes diferencias en el número de fragmentos por partición
Fragmentos marcados como
jumbo
Nota
Un fragmento marcado como jumbo no puede ser migrado por el balanceador hasta que sea dividido o reducido de tamaño de alguna manera.
Verificar mensajes de registro
Registros del servidor de configuración
Revisa 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
Fragmentos marcados como jumbo
Errores durante las fases de confirmación o eliminación de la migración
Registros de particiones
En los nodos de partición, revisa los registros para:
Tiempos de espera de adquisición de bloqueos
Atraso de la replicación que afecta la migración
Errores de espacio en disco
Fallas en los pasos de migración
Problemas comunes y soluciones
Fragmentos jumbo Previenen la Migración
Un fragmento se vuelve jumbo cuando supera el tamaño de fragmento configurado y no puede dividirse automáticamente.
Identificar fragmentos jumbo
De mongos:
sh.status(true)
Localiza los fragmentos etiquetados como jumbo.
Resolver fragmentos jumbo
Los fragmentos divisibles contienen varios valores únicos de valor de la clave de partición y pueden dividirse. Para resolver un fragmento jumbo, debes dividirlo manualmente:
sh.splitAt("database.collection", { shardKeyField: <value> })
Luego, reinicia el balanceador si es necesario:
sh.startBalancer()
Para aprender cuándo se debe aplicar la división manual, consulta Divide los fragmentos en un clúster fragmentado.
Fragmentos indivisibles representan un único valor de la clave de partición y no se pueden dividir. Para resolver un fragmento jumbo indivisible:
Refine la clave de partición usando
refineCollectionShardKeypara añadir un campo sufijo, haciendo que el fragmento sea divisible. Consulta Fragmentos divisibles.Rehacer el sharding en la colección usando una clave de partición más uniformemente distribuida. Consulte Reasignar una colección.
Para obtener más detalles sobre la resolución de fragmentos jumbo, consulte Borrar la bandera jumbo.
Distribución ineficaz de clave de partición
Si la clave de partición tiene una baja cardinalidad o sigue un patrón monótonamente creciente, los fragmentos podrían crecer de manera desigual y resistirse al balanceo.
Para mitigar:
Revisa el patrón de clave de partición utilizado por la colección.
Determina si la mayoría de las escrituras se destinan a un rango reducido de clave de partición. Si los valores de claves de partición de alta frecuencia están provocando que las escrituras se concentren en una sola partición, consulta Resolución de problemas con las claves de partición.
Considera volver a distribuir la colección utilizando una clave de partición más equitativamente distribuida.
Consulta Escoge una clave de partición para seguir las mejores prácticas.
Balanceador deshabilitado o pausado
Si el balanceador está deshabilitado, las migraciones de fragmentos no ocurren.
Comprobar el estado del balanceador:
sh.getBalancerState()
Si está desactivado, actívalo:
sh.startBalancer()
Consulte Balanceador de clústeres compartidos para obtener detalles adicionales sobre el comportamiento del balanceador.
Migración bloqueada por operaciones en curso
Las operación de larga duración, las creación de índices o los cargas de trabajo intensos pueden retrasar o bloquear las migración de fragmento.
Para reducir la contienda:
Identifique las operaciones prolongadas de larga duración:
db.currentOp() Equilibrar el cronograma durante períodos de menor actividad de escritura.
Asegúrate 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 borrado. El espacio insuficiente en disco o un alto atraso de la replicación pueden retrasar estas fases.
Verificar resolución
Después de resolver el problema:
Las migraciones de fragmentos se han completado correctamente.
No quedan fragmentos marcados como
jumbo.La distribución de los fragmentos en las particiones se vuelve más uniforme.
El balanceador permanece activo y estable.
Vuelva a comprobar la distribución:
sh.status(true)
Diagnósticos a recopilar para más apoyo
Si el problema persiste, recoja lo siguiente antes de ponerse en contacto con soporte técnico:
Salida de
sh.status(true)Salida de
db.adminCommand({ balancerStatus: 1 })Registros relevantes del servidor de configuración
Registros de particiones relevantes
Definición de clave de partición para 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 partición