Solución de Problemas y Depuración de MongoDB
¿Cuáles son los primeros pasos que tomas cuando una aplicación MongoDB tiene un rendimiento lento?
Respuesta:
Primero, revisaría los logs de MongoDB en busca de errores o consultas lentas. Luego, usaría mongostat y mongotop para monitorear métricas de rendimiento en tiempo real e identificar operaciones activas o colecciones que consumen recursos. Finalmente, analizaría db.currentOp() para ver las operaciones en curso.
¿Cómo identificas las consultas de ejecución lenta en MongoDB?
Respuesta:
Utilizo el comando db.setProfilingLevel(1, { slowms: 100 }) para habilitar el perfilado de la base de datos, que registra las consultas que exceden un umbral especificado. Alternativamente, puedo usar db.system.profile.find() para consultar directamente la colección del perfilador en busca de operaciones lentas. El plan explain() también es crucial para comprender la ejecución de la consulta.
Una consulta es consistentemente lenta. ¿Qué herramientas y técnicas usarías para optimizarla?
Respuesta:
Usaría explain('executionStats') para analizar el plan de consulta, identificar índices faltantes o etapas ineficientes. Basado en la salida de explain, crearía los índices apropiados. Si la indexación no es suficiente, consideraría una rediseño del esquema o una reestructuración de la consulta.
¿Cómo depuras una alta utilización de CPU en un servidor MongoDB?
Respuesta:
Una alta utilización de CPU a menudo indica consultas ineficientes, índices faltantes o operaciones de escritura excesivas. Revisaría mongostat para operaciones activas, db.currentOp() para procesos de larga duración y el perfilador para consultas lentas. Herramientas a nivel de sistema como top o htop también pueden identificar el uso de CPU del proceso mongod.
¿Cuáles son las causas comunes de un alto uso de memoria en MongoDB y cómo las abordas?
Respuesta:
Un alto uso de memoria puede deberse a grandes conjuntos de trabajo (working sets), consultas ineficientes que extraen demasiados datos a la RAM, o pipelines de agregación no optimizados. Revisaría db.serverStatus().wiredTiger.cache para la utilización de la caché y aseguraría una indexación adecuada para reducir los datos escaneados. Podría ser necesario escalar la RAM o implementar sharding.
Describe cómo depurarías un conjunto de réplicas que no se está sincronizando correctamente.
Respuesta:
Comenzaría revisando rs.status() en todos los miembros para identificar el estado y la salud de cada nodo. Luego, examinaría los logs de MongoDB en cada miembro en busca de errores relacionados con la replicación, problemas de red o fallos en la aplicación del oplog. La conectividad de red entre los miembros también es una causa común.
¿Cuál es el propósito del perfilador de MongoDB y cómo se habilita?
Respuesta:
El perfilador de MongoDB captura información detallada sobre las operaciones de la base de datos, incluyendo tiempos de ejecución de consultas, bloqueos (locks) y E/S. Ayuda a identificar consultas y operaciones lentas. Lo habilitas usando db.setProfilingLevel(level, { slowms: threshold }), donde level puede ser 0 (apagado), 1 (operaciones lentas) o 2 (todas las operaciones).
¿Cómo manejas una situación en la que una instancia de MongoDB se queda sin espacio en disco?
Respuesta:
Primero, identificaría qué está consumiendo espacio usando db.stats() y db.collection.stats(). Luego, buscaría archivos de log grandes o copias de seguridad antiguas para eliminarlos. Si el problema es el crecimiento de datos, consideraría añadir más espacio en disco, implementar sharding o archivar datos antiguos para reducir el conjunto de trabajo.
Sospechas de una operación bloqueada (deadlock). ¿Cómo investigarías esto en MongoDB?
Respuesta:
MongoDB utiliza control de concurrencia optimista, por lo que los deadlocks reales son raros. Sin embargo, las operaciones de larga duración que mantienen bloqueos pueden bloquear a otras. Usaría db.currentOp() para identificar operaciones con el estado waitingForLock y ver qué operación está manteniendo el bloqueo. Podría terminar la operación bloqueante si es necesario.
¿Cuáles son las métricas clave que monitoreas para la salud y el rendimiento de MongoDB?
Respuesta:
Las métricas clave incluyen opcounters (lecturas, escrituras, comandos), connections (actuales, disponibles), network (bytes de entrada/salida), memory (residente, virtual, mapeada), wiredTiger.cache (bytes sucios, páginas leídas/escritas) y locks (global, base de datos, colección). Estas proporcionan información sobre la carga de trabajo y la utilización de recursos.