Какие плюсы и минусы у реляционных баз данных с точки зрения DevOps?

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

Ответ

В DevOps-практике работа с реляционными СУБД (PostgreSQL, MySQL) имеет свои сильные стороны и операционные сложности.

Плюсы:

  • Надежность и согласованность данных: Поддержка ACID-транзакций критична для финансовых и транзакционных систем. Механизмы вроде WAL (Write-Ahead Logging) в PostgreSQL обеспечивают долговечность данных даже при сбоях.
  • Зрелость инструментария для операций: Огромный выбор проверенных инструментов для бэкапа/восстановления (pg_dump, mysqldump, физические бэкапы), репликации (master-slave, master-master), мониторинга (встроенные статистики, pg_stat_statements).
  • Возможности для автоматизации: Конфигурацию, создание пользователей, настройку репликации часто можно управлять через декларативные инструменты (например, Ansible-роли для PostgreSQL) или операторы Kubernetes (например, Crunchy Data Postgres Operator).
  • Стандартизированный доступ и богатая экосистема: SQL — универсальный язык. Интеграция с любыми языками программирования и системами (от приложений до ETL-процессов) не представляет проблемы.

Минусы:

  • Сложность горизонтального масштабирования (шардинга): В отличие от NoSQL, автоматический шардинг «из коробки» — нетривиальная задача. Решения вроде Citus для PostgreSQL или Vitess для MySQL требуют глубокой экспертизы и усложняют архитектуру.
  • Точка отказа и процедуры восстановления: Выход из строя master-ноды требует процедуры failover на replica, что может приводить к простою. Автоматизация этого процесса (с помощью Patroni, etcd) добавляет сложности.
  • Производительность на больших объемах и сложных запросах: Неоптимизированные JOIN-запросы или отсутствие правильных индексов могут «положить» базу. Требуется постоянный мониторинг и настройка (query analysis, vacuum в PostgreSQL).
  • Миграции схемы: Изменение структуры больших таблиц (ALTER TABLE) на проде может быть блокирующей и долгой операцией, требующей careful planning и использования специальных инструментов (например, pg_repack, gh-ost для MySQL).

Пример Ansible-таски для настройка автоматических бэкапов PostgreSQL:

- name: Configure PostgreSQL backup with pgBackRest
  template:
    src: pgbackrest.conf.j2
    dest: /etc/pgbackrest/pgbackrest.conf
  vars:
    db_name: "myapp_prod"
    s3_backup_bucket: "{{ backup_bucket_name }}"

- name: Create cron job for full backup once a week and incremental daily
  cron:
    name: "PostgreSQL nightly incremental backup"
    job: "pgbackrest --type=incr --stanza=main backup"
    minute: "0"
    hour: "2"
    weekday: "1-6"

- name: Test backup restore on staging
  shell: |
    pgbackrest --stanza=main --delta restore
  delegate_to: staging_db_host
  run_once: true