Disaster Recovery: бэкапы, PITR, RPO-RTO и учения восстановления
↑ Этап 7 · Эксплуатация и безопасность БД
Зачем это на собесе
Высшая степень зрелости эксплуатации: план, процедуры и регулярные учения по восстановлению после катастроф.
Что такое Disaster Recovery
Набор планов и технологий для восстановления сервиса после тяжёлых сбоев: потеря дата-центра/региона, повреждение данных, ошибочное удаление, атака шифровальщика, ошибка оператора.
Отличие от HA: HA защищает от отказа отдельных узлов (автоматически, минуты). DR — от потери площадки или логического повреждения данных (часто вручную, часы).
Целевые показатели
- RPO — допустимая потеря данных;
- RTO — допустимое время недоступности;
- RLO (Recovery Level Objective) — какой уровень функциональности восстановить в первую очередь.
| Уровень | RPO | RTO | Подход | Стоимость |
|---|---|---|---|---|
| Backup & restore | часы | часы–сутки | бэкапы + восстановление | низкая |
| Pilot light | минуты | часы | минимальная инфраструктура в другом регионе, данные реплицируются | средняя |
| Warm standby | секунды–минуты | минуты–час | уменьшенная копия работает | выше |
| Hot / active-active | ~0 | секунды–минуты | полноценное в нескольких регионах | максимальная |
Показатели определяются бизнесом (стоимость простоя и потери данных), а не инженерами.
Сценарии катастроф
| Сценарий | Защита |
|---|---|
| Отказ узла / диска | HA (Patroni), RAID, реплики |
| Отказ зоны доступности | multi-AZ |
| Потеря региона | DR-регион, standby cluster, бэкапы в другом регионе |
Ошибочное удаление/UPDATE без WHERE | PITR, логический бэкап, журнал, delayed replica |
| Повреждение данных (баг, bit rot) | контрольные суммы (data_checksums), проверка бэкапов, PITR |
| Шифровальщик, злонамеренное удаление | неизменяемые бэкапы (Object Lock), изоляция учётных записей, offline-копия |
| Потеря ключей шифрования | резервирование ключей в KMS/Vault |
| Ошибка миграции | транзакционные DDL, бэкап перед миграцией, roll-forward |
| Потеря облачного аккаунта/провайдера | копии в другом облаке/у другого провайдера |
Компоненты решения
- Резервные копии: полные + инкрементальные + непрерывная архивация WAL (pgBackRest, WAL-G, Barman) → объектное хранилище в другом регионе, шифрование, Object Lock, политика ретенции, правило 3-2-1.
- PITR: восстановление на момент до инцидента (см. предыдущий раздел про бэкапы).
- Отложенная реплика (
recovery_min_apply_delay = '1h'): защита от логических ошибок, быстрый откат. - DR-реплика / standby cluster в другом регионе: асинхронная репликация (Patroni standby cluster,
primary_conninfoна другой кластер). - Инфраструктура как код: Terraform/Ansible/Helm — быстро поднять окружение заново.
- Данные вне БД: объектное хранилище (репликация бакетов), очереди, секреты, конфигурации, DNS.
- Runbook: пошаговые инструкции на случай каждого сценария, контакты, доступы (break-glass), решения о «точке невозврата».
- Мониторинг DR: лаг DR-реплики, успех бэкапов, архивации WAL, свежесть последней копии, проверки целостности.
Процедура восстановления (PITR-пример)
1. Зафиксировать инцидент и время (t_incident), остановить запись в повреждённую БД (режим read-only / отключить приложение).
2. Определить целевую точку: последний момент до ошибки.
3. Поднять НОВЫЙ экземпляр из последнего полного бэкапа + WAL (pgbackrest restore --type=time --target=...).
4. Проверить целостность и данные (контрольные запросы, счётчики, выборочный анализ).
5. Вариант A: выгрузить потерянные данные в рабочую БД (точечное восстановление).
Вариант B: переключить трафик на восстановленный экземпляр (DNS/HAProxy), переподнять реплики.
6. Собрать метрики: фактический RTO/RPO, задержки.
7. Постмортем и улучшения.Учения по восстановлению
Необходимы: непроверенный бэкап = отсутствие бэкапа.
| Уровень | Что | Частота |
|---|---|---|
| Автоматическая проверка | еженощное восстановление последнего бэкапа в песочницу + контрольные запросы | ежедневно |
| Tabletop | разбор сценария за столом по runbook | раз в квартал |
| Учение на стенде | полное восстановление в изолированной среде, замер RTO | раз в квартал/полугодие |
| Game Day (chaos) | контролируемое отключение узла/зоны в staging или проде | раз в полгода |
| Failover DR-региона | переключение на DR с реальным трафиком | раз в год |
Что замерять: фактические RPO и RTO, время обнаружения, время принятия решения, ошибки в runbook, зависимости (DNS, секреты, сертификаты, доступы).
Особенности и ловушки
- секреты и ключи недоступны в DR-регионе — восстановление невозможно;
- зависимости от первичного региона (DNS, контейнерный реестр, CI);
- согласованность БД и объектного хранилища (восстанавливать на одну и ту же точку);
- версии ПО: тот же major PostgreSQL для физического восстановления;
- лимиты ёмкости в DR-регионе (квоты облака) и стоимость;
- задержка репликации в DR увеличивает RPO;
- split-brain при возврате: «failback» — отдельная процедура;
- документация в недоступной системе (runbook хранится в той же вики, что упала) — держите копию вне основной инфраструктуры;
- людской фактор: паника, отсутствие доступов, непонятные роли.
Коммуникации и роли
Incident commander, техническая группа, коммуникации (статус-страница, клиенты), руководство; шаблоны сообщений; критерии объявления «катастрофы» и отката.
Связь с безопасностью и соответствием
Требования регуляторов (ЦБ, PCI DSS, ISO 27001, GDPR): план непрерывности бизнеса (BCP), регулярные учения, хранение копий, аудит.
Вопросы с ответами
Чем Disaster Recovery отличается от High Availability?
HA автоматически защищает от отказа узлов и зон (минуты), сохраняя работу; DR — восстановление после потери площадки, повреждения или удаления данных (часы), часто с участием людей и бэкапов.
Как защититься от шифровальщика и злонамеренного удаления бэкапов?
Неизменяемые копии (Object Lock/WORM), отдельные учётные записи и права на бэкап-хранилище, копии в другом аккаунте/регионе, offline-копия, контроль доступа и оповещения.
Как убедиться, что DR-план работает?
Регулярные автоматические восстановления бэкапов, учения по runbook и game days с замером фактических RPO и RTO; исправлять найденные проблемы и обновлять документацию.