DevOps y monitorización

La actualización del kernel de Azure impide el inicio de MongoDB por incompatibilidad con rseq

Una actualización automática del kernel en una VM de Azure a la versión 6.19+ provocó que MongoDB 8.x se negara a iniciar, requiriendo un rollback manual de GRUB y el bloqueo de paquetes para resolverlo.

Ilustración de un servidor Linux luchando bajo el peso de una actualización del kernel
Ilustración creada para este artículo

Traducido automáticamente del original en inglés.

Una mañana rutinaria se convirtió en una interrupción urgente para un equipo de desarrollo cuando su aplicación dejó de responder sin que se hubieran realizado despliegues recientes de código ni cambios de configuración. La causa raíz fue identificada como una actualización automática del kernel de Linux realizada por Azure durante una ventana de mantenimiento, lo cual introdujo una incompatibilidad con la instancia de MongoDB en ejecución.

Qué ocurrió

El incidente comenzó cuando los usuarios reportaron fallos de conexión, lo que llevó al equipo de ingeniería a investigar el estado de su máquina virtual de Azure. Al iniciar sesión, descubrieron que el servicio de MongoDB estaba en estado fallido, cerrándose casi inmediatamente después de los intentos de inicio con códigos de salida que indicaban un fallo rápido dentro de los 35 a 48 milisegundos. Los registros estándar de la aplicación no proporcionaron información útil, mostrando solo un apagado limpio de días anteriores, lo que obligó al equipo a profundizar en los diarios a nivel de sistema.

Al filtrar el diario del sistema (journal) buscando errores fatales, el equipo descubrió un mensaje de error específico que indicaba que MongoDB no puede iniciarse en versiones del kernel de Linux 6.19 y posteriores debido a una incompatibilidad conocida. La plataforma Azure había actualizado silenciosamente el kernel de la VM a la versión 7.0.0-1014-azure, basada en la problemática línea 6.19+. Esto activó un bloqueo de seguridad estricto en MongoDB versión 8.0.29, impidiendo que la base de datos se iniciara para evitar posibles corrupciones de datos o inestabilidad relacionadas con la llamada al sistema rseq.

Detalles clave

  • Disparador: Azure actualizó automáticamente el kernel de Linux en la VM durante una ventana de mantenimiento programada.
  • Incompatibilidad: MongoDB 8.x se niega a iniciarse en kernels de Linux 6.19 y posteriores debido a problemas con la llamada al sistema rseq.
  • Identificación del error: El problema se confirmó mediante los registros de journalctl, no a través de los registros de aplicación estándar de MongoDB.
  • Soluciones fallidas: Cambiar permisos de archivos, eliminar archivos de bloqueo y actualizar MongoDB a la versión 8.0.32 no resolvieron el problema.
  • Resolución: El equipo arrancó en un kernel anterior compatible (6.17.0-1022-azure) modificando la configuración de GRUB.
  • Prevención: Se bloquearon los paquetes del kernel utilizando apt-mark hold para evitar futuras actualizaciones automáticas hasta que esté disponible una solución oficial.

Contexto

Los sistemas Linux utilizan un gestor de arranque llamado GRUB (Grand Unified Bootloader) para seleccionar qué versión del kernel cargar cuando se inicia el servidor. Los proveedores de nube como Azure a menudo instalan nuevos kernels durante el mantenimiento pero conservan las versiones antiguas en disco. Por defecto, GRUB selecciona el kernel más reciente, lo que puede provocar comportamientos inesperados si el nuevo kernel tiene problemas de compatibilidad con el software instalado. La llamada al sistema rseq (secuencias reiniciables) es una optimización de rendimiento en los kernels de Linux más recientes que algunas aplicaciones, incluido MongoDB, pueden no soportar completamente aún o con las que pueden entrar en conflicto en versiones específicas.

Los gestores de paquetes como apt utilizan meta-paquetes como linux-azure para apuntar a la imagen del kernel más reciente disponible. Cuando estos meta-paquetes se actualizan, el sistema instala el kernel más nuevo y actualiza GRUB para iniciarlo por defecto. Los administradores pueden anular este comportamiento especificando manualmente una versión del kernel en la configuración de GRUB o "reteniendo" paquetes específicos para evitar que se actualicen automáticamente.

Por qué importa

Este incidente destaca los riesgos de depender de actualizaciones automáticas de infraestructura sin procesos adecuados de monitoreo o control de cambios. Para equipos que ejecutan software autoalojado, una actualización silenciosa del kernel puede romper servicios críticos durante la noche, generando tiempos de inactividad significativos y esfuerzo de resolución de problemas. La falta de visibilidad inmediata sobre los cambios a nivel de infraestructura hace que las interrupciones parezcan misteriosas, desperdiciando tiempo valioso en pasos de depuración irrelevantes como verificar permisos o registros de aplicación.

Además, subraya la importancia de comprender la cadena de dependencias entre los componentes del sistema operativo y el software de aplicación. Incluso las versiones estables de soporte a largo plazo de bases de datos pueden tener restricciones estrictas sobre las versiones del kernel. Sin una gestión proactiva de las actualizaciones del kernel, las organizaciones corren el riesgo de encontrar bloqueos similares cuando los proveedores de nube impulsan nuevas versiones subyacentes del SO. Esto es particularmente relevante para pequeñas y medianas empresas que pueden no contar con equipos dedicados de ingeniería de fiabilidad del sitio (SRE) para gestionar estos detalles de bajo nivel.

Qué puedes hacer

  • Monitorea las versiones del kernel: Verifica regularmente las versiones del kernel instaladas y activas en tus VMs usando uname -r y dpkg --list | grep linux-image.
  • Bloquea paquetes críticos: Usa apt-mark hold en los meta-paquetes del kernel para evitar actualizaciones automáticas que puedan introducir incompatibilidades.
  • Configura tiempos de espera de GRUB: Establece un GRUB_TIMEOUT distinto de cero en /etc/default/grub para permitir la selección manual del kernel durante el arranque si es necesario.
  • Verifica la compatibilidad: Antes de permitir actualizaciones del kernel, revisa las notas de la versión de tus aplicaciones principales (como MongoDB) para conocer incompatibilidades conocidas con el kernel.
  • Mejora las alertas: Implementa un monitoreo que avise sobre fallos de inicio de servicios y errores en el diario del sistema, no solo sobre comprobaciones de salud a nivel de aplicación.
  • Documenta los pasos de recuperación: Mantén un runbook para revertir versiones del kernel vía GRUB, incluyendo comandos para actualizar el gestor de arranque y reiniciar de forma segura.

Más noticias

Todas las noticias