Какие стратегии и технологии вы бы применили для минимизации потери данных при отказе диска между плановыми бэкапами?

Ответ

Чтобы минимизировать потерю данных (снизить RPO — Recovery Point Objective) между бэкапами, необходимо использовать комбинацию подходов на разных уровнях:

  1. Аппаратный уровень: RAID

    • Использование массивов избыточных независимых дисков (RAID). RAID 1 (зеркалирование) дублирует данные на два или более диска. При отказе одного диска система продолжает работать со вторым без потери данных.
  2. Уровень базы данных: Репликация и журналирование

    • Write-Ahead Logging (WAL): Это фундаментальный механизм. Все изменения сначала записываются в журнал (WAL-файл) на диске, и только потом применяются к файлам данных. В случае сбоя, СУБД может восстановить своё состояние из журнала, гарантируя, что закоммиченные транзакции не будут потеряны.
    • Репликация: Создание копий (реплик) базы данных на других серверах.
      • Синхронная репликация: Транзакция не считается завершённой, пока не будет подтверждена и основной базой, и репликой. Это гарантирует нулевую потерю данных (RPO=0), но увеличивает задержку записи.
      • Асинхронная репликация: Транзакция подтверждается сразу после записи на основной сервер, а на реплику данные передаются с небольшой задержкой. Это обеспечивает высокую производительность, но допускает минимальную потерю данных при отказе мастера.
  3. Уровень бэкапов: Point-in-Time Recovery (PITR)

    • Помимо полных бэкапов, необходимо настроить непрерывное архивирование WAL-файлов. Это позволяет восстановить состояние базы данных на любой момент времени, а не только на момент создания последнего бэкапа, эффективно закрывая "окно" между ними.

Пример настройки репликации в PostgreSQL:

-- На основном сервере (primary) в postgresql.conf:
wal_level = replica          -- Уровень журналирования, достаточный для репликации
max_wal_senders = 3        -- Количество процессов, отправляющих WAL на реплики
archive_mode = on            -- Включаем архивирование WAL для PITR
archive_command = 'cp %p /path/to/archive/%f' -- Команда для архивации

-- Для синхронной репликации:
synchronous_commit = on
synchronous_standby_names = 'replica_name' -- Имя реплики, подтверждения которой нужно ждать

Комбинация RAID, WAL, репликации и PITR создаёт многоуровневую защиту, которая сводит риск потери данных к минимуму.