Какие ваши действия, если в продакшене упал контейнер с PostgreSQL?

«Какие ваши действия, если в продакшене упал контейнер с PostgreSQL?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мои действия направлены на быстрое восстановление доступности и сохранность данных.

  1. Диагностика: Первым делом смотрю логи упавшего контейнера.

    docker logs --tail 50 --timestamps <container_name_or_id>

    Ищу ключевые ошибки: FATAL: could not extend file, out of memory, database system is shut down.

  2. Проверка состояния и ресурсов:

    # Проверяю статус контейнера и код выхода
    docker inspect <container_id> --format='{{.State.Status}} {{.State.ExitCode}}'
    
    # Проверяю, не исчерпано ли место на volume с данными
    docker run --rm -v pg_data:/volume_data alpine df -h /volume_data
    
    # Смотрю потребление памяти хоста
    free -h
  3. Попытка перезапуска:

    docker start <container_name>

    Если контейнер сразу останавливается, запускаю его в интерактивном режиме с шеллом, чтобы увидеть вывод:

    docker run -it --rm --entrypoint sh <postgres_image>
    # Затем пытаюсь запустить postgres вручную внутри контейнера
  4. Восстановление из бекапа (если контейнер не оживает):

    • Убеждаюсь, что volume с данными (/var/lib/postgresql/data) примонтирован к хосту или в сетевом хранилище.
    • Разворачиваю новый временный контейнер PostgreSQL, монтируя к нему проблемный volume, чтобы попытаться сделать дамп.
      docker run -d --name pg_recovery 
      -v pg_data:/var/lib/postgresql/data 
      -e POSTGRES_PASSWORD=temp 
      postgres:14
    • Если БД загружается, немедленно делаю дамп: docker exec pg_recovery pg_dumpall -U postgres > backup.sql.
    • Разворачиваю чистый контейнер с последним рабочим бекапом.
  5. Профилактика на будущее:

    • В docker-compose.yml или манифесте Kubernetes добавляю политику перезапуска и health checks.
      # docker-compose.yml пример
      services:
      postgres:
      image: postgres:14
      restart: unless-stopped
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres"]
        interval: 30s
        timeout: 10s
        retries: 3
    • Настраиваю мониторинг (Prometheus с экспортером postgres_exporter) и алерты на недоступность БД или нехватку места.
    • Организую регулярное автоматическое бэкапирование (например, с помощью pgbackrest или wal-g) и периодически проверяю процедуру восстановления.