Cómo Solucionar "pg_xlog/xlogtemp.26: No space left on device" de PostgreSQL en un Pod de EKS

Matias MartinezMatias Martinez
4 min read

Cuando implementas PostgreSQL en un clúster de Amazon EKS (Elastic Kubernetes Service), puedes encontrarte con varios problemas relacionados con el almacenamiento y la recuperación de datos. Uno de los errores comunes es el siguiente:

PostgreSQL Database directory appears to contain a database; Skipping initialization

LOG:  database system was interrupted while in recovery at 2024-08-20 09:34:16 -03
HINT:  This probably means that some data is corrupted and you will have to use the last backup for recovery.
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  redo starts at F8/60F07848
LOG:  redo done at F8/73FFFA00
LOG:  last completed transaction was at log time 2024-07-26 08:56:22.757006-03
PANIC:  could not write to file "pg_xlog/xlogtemp.26": No space left on device
LOG:  startup process (PID 26) was terminated by signal 6: Aborted
LOG:  aborting startup due to startup process failure
LOG:  database system is shut down

Este error indica que PostgreSQL no puede continuar con el inicio porque ha encontrado problemas relacionados con el espacio en disco y la recuperación de transacciones. En este artículo, te mostraremos cómo solucionar este problema paso a paso.

Diagnóstico del Problema

Error de Espacio en Disco

El mensaje de error PANIC: could not write to file "pg_xlog/xlogtemp.26": No space left on device sugiere que el sistema de archivos se quedó sin espacio. Esto puede suceder por varias razones:

  1. Datos Corruptos: La base de datos pudo haberse interrumpido inesperadamente durante una operación de recuperación.

  2. Espacio Insuficiente: Aunque en el mensaje se indique que hay falta de espacio, en realidad puede haber un problema con cómo se está gestionando el espacio en el volumen persistente de Kubernetes.

Verificación del Volumen Persistente

Antes de proceder con la solución, verifica el estado del volumen persistente para asegurarte de que está montado y funciona correctamente:

kubectl get pvc
kubectl describe pvc <claim-name>
kubectl get pv
kubectl describe pv <volume-name>

Asegúrate de que el volumen tiene suficiente espacio disponible y está montado en el contenedor correctamente.

Solución del Problema

1. Actualizar el Deployment en EKS

Para resolver el error, necesitas reiniciar el registro de transacciones de PostgreSQL usando pg_resetxlog. Aquí te explicamos cómo hacer esto:

1- Modificar el Deployment: Actualiza tu archivo de despliegue de Kubernetes para que ejecute pg_resetxlog cuando se inicie el contenedor. Esto se hace agregando un comando en el campo command del contenedor.

Aquí hay un ejemplo de cómo puedes hacerlo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:9.6
          command:
            - /bin/sh
            - -c
          args:
            - su - postgres -c "/usr/lib/postgresql/9.6/bin/pg_resetxlog -f /var/lib/postgresql/data/pgdata"
          ports:
            - name: service
              containerPort: 5432

2- Desplegar los Cambios: Aplica los cambios en el clúster de Kubernetes.

kubectl apply -f <deployment-file>.yaml

3- Verificar los Logs: Una vez que el pod esté desplegado, revisa los logs para confirmar que el comando pg_resetxlog se ejecutó correctamente.

kubectl logs <pod-name>
  1. Deberías ver un mensaje que diga Transaction log reset, indicando que el comando se ejecutó correctamente.

2. Restaurar la Configuración del Deployment

Después de ejecutar pg_resetxlog, necesitas restaurar la configuración del deployment original para que PostgreSQL pueda iniciar normalmente sin ejecutar el comando de reseteo.

  1. Revertir la Configuración: Modifica el archivo de despliegue para eliminar el comando de reseteo. Asegúrate de que el contenedor se inicie normalmente.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:9.6
          ports:
            - name: service
              containerPort: 5432

2- Desplegar los Cambios: Vuelve a aplicar el archivo de despliegue.

kubectl apply -f <deployment-file>.yaml

3- Verificar los Logs de Inicio: Revisa los logs del pod para asegurarte de que PostgreSQL se inicia correctamente y que la inicialización se salta como se espera.

kubectl logs <pod-name>
  1. Deberías ver un mensaje que diga Skipping initialization, lo que indica que PostgreSQL está utilizando el directorio de datos existente.

Este proceso te permite solucionar problemas relacionados con la inicialización y recuperación de PostgreSQL en un entorno de Kubernetes gestionado por Amazon EKS. Al asegurarte de que el volumen persistente tiene suficiente espacio y reiniciar el registro de transacciones de PostgreSQL con pg_resetxlog, puedes resolver problemas de corrupción de datos y continuar con el uso de tu base de datos.

Si sigues enfrentando problemas, asegúrate de revisar los permisos del volumen persistente y considerar la restauración desde una copia de seguridad. Estos pasos deberían ayudarte a resolver la mayoría de los problemas comunes de PostgreSQL en un entorno de contenedores.

0
Subscribe to my newsletter

Read articles from Matias Martinez directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Matias Martinez
Matias Martinez

Apasionado por la tecnología con más de 10 años de experiencia. Actualmente trabajando con tecnologías Cloud y Devops. ☁️ AWS Certified Solutions Architect – Associate ☁️ AWS Certified Security – Specialty