Расскажите о вашем опыте работы с базами данных в контексте DevOps

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

Ответ

В DevOps моя работа с базами данных фокусируется на автоматизации, надежности и интеграции с инфраструктурой, а не на администрировании в чистом виде.

Основные задачи и подходы:

  • Автоматизация развертывания и миграций: Использовал инструменты миграции схемы, такие как Liquibase или Flyway, интегрированные в CI/CD пайплайн. Это позволяло применовать изменения к БД предсказуемо и с возможностью отката. Для управления конфигурацией инстансов БД в облаке (AWS RDS, Cloud SQL) использовал Terraform.
  • Резервное копирование и восстановление (Backup & Recovery): Настраивал автоматические бекапы (например, снимки RDS или логические дампы через pg_dump). Критически важным было регулярное тестирование процедуры восстановления из бекапа на изолированном стенде. Для этого писал скрипты на Python/Bash, которые автоматизировали процесс.
  • Мониторинг и производительность: Интегрировал мониторинг БД в общий стек на основе Prometheus. Использовал экспортеры (например, postgres_exporter) для сбора метрик: количество активных соединений, скорость выполнения запросов, использование диска. Настраивал алерты на аномалии (например, нехватка соединений). Для анализа медленных запросов использовал встроенные механизмы БД (логи медленных запросов в MySQL/PostgreSQL).
  • Высокая доступность (High Availability): Работал с настройкой репликации. Например, для PostgreSQL настраивал streaming replication с помощью Patroni для автоматического фейловера, что давало отказоустойчивость на уровне БД.

Пример скрипта для бекапа PostgreSQL и загрузки в S3 (для использования в CronJob в K8s):

#!/bin/bash
set -e

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_${DATE}.sql.gz"
PG_HOST="${POSTGRES_HOST}"
PG_DB="${POSTGRES_DB}"

# Создание дампа
pg_dump -h $PG_HOST -U $POSTGRES_USER $PG_DB | gzip > /tmp/$BACKUP_FILE

# Загрузка в S3 (используем AWS CLI)
aws s3 cp /tmp/$BACKUP_FILE s3://${S3_BACKUP_BUCKET}/postgres-backups/

# Очистка локального файла
rm /tmp/$BACKUP_FILE

# Опционально: ротация старых бекапов в S3 (например, удаление старше 30 дней)
aws s3 ls s3://${S3_BACKUP_BUCKET}/postgres-backups/ | 
awk '{print $4}' | 
while read -r line; do
    backup_date=$(echo $line | cut -d'_' -f2)
    if [[ $(date -d "$backup_date" +%s) -lt $(date -d "-30 days" +%s) ]]; then
        aws s3 rm s3://${S3_BACKUP_BUCKET}/postgres-backups/$line
    fi
done