Cuando el correo deja de llegar: análisis de una caída en una plataforma de correo Zimbra-PMG
Por cuestiones de confidencialidad no puedo compartir capturas ni publicar comandos ejecutados junto con sus resultados. Aun así, vale la pena contar el análisis del caso porque terminó siendo una situación bastante particular y probablemente despierte curiosidad en quienes trabajan administrando este tipo de plataformas.
Durante el día comenzaron a llegar las primeras alertas desde usuarios finales: los correos electrónicos no estaban llegando a destino.
En un primer momento no existían señales de una caída del servicio. La plataforma continuaba respondiendo, no se observaban errores evidentes y, a simple vista, el entorno seguía operativo.
Pero como suele pasar en incidentes de este tipo, el síntoma visible (“no llegan correos”) era solo la superficie de un problema más profundo.
Así comenzó el proceso de diagnóstico sobre una plataforma de correo legacy compuesta por Zimbra y PMG, que actualmente continúa en operación mientras avanza una migración tecnológica planificada hacia Carbonio y PMG.
Paso 1 — Verificar el estado de los servicios
El primer paso fue revisar el estado de los servicios involucrados.
Rápidamente apareció algo que llamó la atención: el servicio PMG (pmg-smtp-filter) registraba múltiples fallas de conexión hacia la base de datos, acompañadas por errores repetidos asociados al runtime de Perl (segfault).
Lo curioso era que estos eventos no comenzaron con el incidente, sino que venían ocurriendo desde varias horas antes de la caída.
Con ese dato se pasó a verificar el estado del servicio de base de datos… y efectivamente no se estaba ejecutando.
No era una señal especialmente tranquilizadora.
Se intentó iniciar nuevamente el servicio esperando encontrar errores adicionales durante el arranque; por suerte la base levantó correctamente y sin fallos visibles.
Con el servicio operativo nuevamente, el foco dejó de estar en restaurar disponibilidad y pasó a entender por qué la base de datos se había detenido.
Esto era especialmente relevante porque PMG consulta continuamente reglas y políticas sobre los correos que atraviesan el sistema.
El siguiente paso fue entonces revisar el histórico de eventos alrededor del momento del incidente.
Paso 2 — Buscar eventos alrededor del horario del incidente
Al revisar los logs apareció algo interesante.
Múltiples conexiones activas estaban siendo cerradas por el propio motor:
terminating connection because of crash of another server process
possibly corrupted shared memoryEse mensaje normalmente indica que:
un proceso interno terminó de forma anormal;
el proceso principal decidió detener el resto para proteger consistencia;
el motor entra en recuperación.
Un poco antes aparecía la pieza clave:
server process was terminated by signal 11: Segmentation faultUn SIGSEGV (Segmentation Fault).
Ese dato cambió completamente el enfoque.
Ya no estábamos buscando un problema funcional del correo.
Estábamos frente a un crash de proceso.
Paso 3 — Validar hipótesis clásicas
Antes de asumir un bug de aplicación se revisaron las causas habituales:
Disco
Se verificaron errores de filesystem y eventos del kernel.
Resultado:
sin errores detectadosMemoria
Se buscaron eventos relacionados con:
OOM
Killed process
memoryResultado:
sin evidencia de agotamiento de memoriaHost de virtualización
También se revisaron eventos del host físico buscando:
errores ECC;
reinicios;
eventos de virtualización;
fallas de almacenamiento.
Resultado:
sin correlación con el horario del incidenteHasta ese punto no había señales de infraestructura.
Paso 4 — Encontrar el verdadero patrón
Al seguir profundizando apareció algo más importante.
El componente encargado del procesamiento SMTP venía registrando fallos repetidos.
Los mensajes se repetían durante horas:
segfault
signal 11Y entre esos eventos aparecían errores de conexión hacia la base de datos.
La secuencia terminó siendo algo parecido a esto:
Procesamiento SMTP
↓
Error interno
↓
Segmentation fault
↓
Conexiones hacia BD fallan
↓
Motor entra en recuperación
↓
Usuarios dejan de recibir correosEso explicaba por qué el incidente parecía intermitente y no una caída total.
Paso 5 — Recuperación y validación
Una vez recuperado el servicio se ejecutaron tareas de mantenimiento sobre la base:
Reconstrucción de índices
REINDEX DATABASEObjetivo:
reconstruir índices;
eliminar posibles inconsistencias lógicas.
Limpieza y actualización de estadísticas
VACUUM ANALYZEObjetivo:
limpiar registros obsoletos;
actualizar estadísticas del optimizador.
Después de eso:
el sistema completó recuperación automática;
el flujo de correo volvió a normalidad;
no se observaron pérdidas de información.
Lecciones aprendidas
Este incidente dejó varias conclusiones útiles:
1. “Servicio activo” no significa “servicio sano”
El monitoreo mostraba procesos levantados.
Los logs mostraban otra historia.
2. Los síntomas rara vez están donde ocurre el problema
El usuario veía:
no llegan correosLa causa real estaba varios componentes más abajo.
3. Las plataformas legacy requieren observabilidad extra
En sistemas con muchos años de operación es común encontrar:
procesos que se recuperan solos;
errores silenciosos;
componentes que fallan en cascada.
Próximos pasos
Este incidente reforzó una decisión que ya estaba en planificación:
migración gradual de la plataforma de correo hacia Carbonio;
actualización del gateway de correo hacia una plataforma más reciente.
A veces el mejor resultado de un incidente no es restaurar el servicio.
Es entender por qué falló antes de que vuelva a pasar.
¡Salud y buen blogging!
— Valerka (Montevideo, Uruguay)
¿Te gustó el post? ¿Tenés dudas, comentarios o querés compartir tu experiencia?
Escribime a: valerkasystem@protonmail.com — ¡Siempre leo los mails y trato de responder cuando puedo!