Расскажи про свой опыт работы с PostgreSQL в контексте DevOps.

«Расскажи про свой опыт работы с PostgreSQL в контексте DevOps.» — вопрос из категории Базы данных, который задают на 29% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мой опыт с PostgreSQL в DevOps фокусируется на обеспечении отказоустойчивости, производительности и автоматизации операций. Я не пишу бизнес-логику приложения, но отвечаю за инфраструктуру БД.

Основные направления работы:

  1. Репликация и High Availability:

    • Настройка streaming-репликации (синхронной/асинхронной) для отказоустойчивости.
    • Использование Patroni или собственных скриптов на базе etcd/Consul для автоматического фейловера и выбора лидера.
    • Настройка logical replication для миграций между мажорными версиями или выгрузки данных в аналитические хранилища.
  2. Резервное копирование и восстановление (Backup/Restore):

    • Автоматизация бэкапов с помощью pg_dump/pg_dumpall для логических и pg_basebackup для физических.
    • Интеграция с инструментами типа WAL-G или pgBackRest для непрерывного архивирования WAL-логов и инкрементальных бэкапов в объектные хранилища (S3, GCS).
    • Регулярное тестирование процедуры восстановления (DR-дриллы).
  3. Мониторинг и тюнинг:

    • Настройка экспортера для Prometheus (postgres_exporter) для сбора метрик: количество подключений, активные транзакции, размеры БД, эффективность кэша.
    • Анализ медленных запросов через pg_stat_statements и настройка индексов совместно с разработчиками.
    • Настройка параметров сервера (shared_buffers, work_mem, maintenance_work_mem) в зависимости от доступной RAM и нагрузки.
  4. Автоматизация развертывания и миграций:

    • Использование Ansible/Terraform для деплоя инстансов PostgreSQL с предопределенной конфигурацией.
    • Интеграция миграций приложения (Liquibase, Flyway) в пайплайн CI/CD.

Пример настройки физической репликации через Patroni (YAML-конфиг):

scope: postgres-cluster
name: postgres-node-1

restapi:
  listen: 0.0.0.0:8008
  connect_address: 10.0.1.1:8008

etcd:
  hosts: 10.0.1.10:2379,10.0.1.11:2379,10.0.1.12:2379

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    postgresql:
      use_pg_rewind: true
      parameters:
        wal_level: replica
        hot_standby: "on"
        max_connections: "100"