Настройка кросс-региональной репликации данных для DR

Когда основной ЦОД выходит из строя, а бэкапы оказываются в том же регионе, восстановление может занять часы вместо минут. Мы настраиваем кросс-региональную репликацию данных для PostgreSQL, MySQL и S3, чтобы ваш бизнес был готов к катастрофе. Наша команда реализует проект под ключ — от аудита до внедрения и последующей поддержки, обеспечивая надёжное восстановление без срыва сроков.
Часто задаваемые вопросы

После выхода из строя основного ЦОДа в us-east-1 мы обнаружили, что все бэкапы лежат в том же регионе. Восстановление из другого региона заняло 8 часов вместо целевого RTO в 15 минут. Тогда мы поняли: кросс-региональная репликация — единственный способ уложиться в RPO/RTO. За 5+ лет работы с DR мы настроили десятки решений на PostgreSQL, MySQL и S3 для компаний с требованием RPO менее 1 минуты. Наша команда провела более 50 проектов по Disaster Recovery, средний достигнутый RPO — 2 секунды при асинхронной репликации.

Репликация PostgreSQL между регионами

Streaming replication через интернет работает, но требует защищённого канала. Обычная схема: VPN или VPC Peering между регионами, синхронная или асинхронная репликация в зависимости от требований к RPO.

Для асинхронной репликации между регионами Patroni с etcd в каждом регионе — правильный выбор. Но нужно явно указать, что cross-region реплика не участвует в выборах лидера:

# patroni-dr.yml — конфиг для DR-реплики в другом регионе
scope: pg-production
namespace: /service/
restapi:
  listen: 0.0.0.0:8008
  connect_address: 10.10.1.5:8008
etcd3:
  # Локальный etcd только для состояния DR-ноды
  # Не участвует в кворуме основного кластера
  hosts: 10.10.0.1:2379
bootstrap:
  dcs:
    maximum_lag_on_failover: 10485760  # 10 MB — допускаем лаг для cross-region
    master_start_timeout: 300
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 10.10.1.5:5432
  data_dir: /var/lib/postgresql/data
  parameters:
    # Реплика только для чтения, не для выборов
    hot_standby: "on"
    recovery_min_apply_delay: "0"
  tags:
    # Исключить из автоматического failover — только ручной promote
    nofailover: true
    noloadbalance: false
    nosync: false

Мониторинг лага репликации критически важен. Если pg_wal_lsn_diff на DR-реплике растёт — либо сеть деградировала, либо нагрузка на мастер выросла:

-- На мастере: проверить лаг DR-реплики
SELECT client_addr, application_name, state,
       pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS sent_lag_bytes,
       pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag_bytes,
       write_lag, flush_lag, replay_lag
FROM pg_stat_replication
WHERE application_name = 'dr-replica-eu-west';

Репликация MySQL/MariaDB

Для MySQL бинарного лога достаточно для кросс-региональной репликации. Современный GTID-based replication упрощает failover и восстановление после разрыва:

# my.cnf на DR-реплике
[mysqld]
server-id = 2000
# уникальный, отличный от основного кластера
gtid_mode = ON
enforce_gtid_consistency = ON
read_only = ON
super_read_only = ON
# Параллельная репликация для снижения лага
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 8
# Сохранение позиции репликации в таблице (не в файле)
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON

Репликация файловых систем

Для файлов и объектного хранилища подходы разные.

AWS S3 Cross-Region Replication: включается на уровне bucket policy и работает автоматически. Важный нюанс — CRR реплицирует только новые объекты после включения, существующие нужно скопировать отдельно через aws s3 sync:

# Настройка Cross-Region Replication через AWS CLI
aws s3api put-bucket-replication \
  --bucket company-primary-eu-central-1 \
  --replication-configuration '{
    "Role": "arn:aws:iam::123456789:role/s3-replication-role",
    "Rules": [
      {
        "Status": "Enabled",
        "Filter": {"Prefix": ""},
        "Destination": {
          "Bucket": "arn:aws:s3::TRUETECH-dr-eu-west-1",
          "StorageClass": "STANDARD_IA",
          "ReplicationTime": {
            "Status": "Enabled",
            "Time": {"Minutes": 15}
          },
          "Metrics": {
            "Status": "Enabled",
            "EventThreshold": {"Minutes": 15}
          }
        },
        "DeleteMarkerReplication": {"Status": "Enabled"}
      }
    ]
  }'

rsync + inotifywait для on-premise: для файловых серверов вне облака — непрерывная репликация через lsyncd или rsync по расписанию через cron. lsyncd использует inotify и реплицирует изменения в реальном времени:

-- /etc/lsyncd/lsyncd.conf.lua
sync {
    default.rsync,
    source = "/data/media",
    target = "dr-server.company.com:/data/media",
    rsync = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        rsh = "/usr/bin/ssh -e aes128-ctr -i /etc/lsyncd/dr-key",
        _extra = {"--bwlimit=50000"} -- ограничение полосы: 50 Мбит/с
    }
}

Проверка консистентности данных

Репликация может работать без ошибок и при этом давать расхождения данных — особенно при асинхронной схеме. Для PostgreSQL pg_checksums и периодические сравнения через pg_comparator или checksums на уровне приложения.

Для S3 — периодический листинг и сравнение объектов между регионами через AWS Data Sync или собственные скрипты.

Почему асинхронная репликация — базовый выбор для кросс-регион?

Синхронная репликация между датацентрами на расстоянии >1000 км даёт задержку не менее 10 мс на пакет, что снижает пропускную способность записи до 1/3 от локальной. Асинхронная схема вносит лаг 0.5–5 секунд, но сохраняет производительность мастера. В 90% случаев для DR достаточно асинхронной репликации с RPO до 10 секунд. Patroni с пометкой nofailover: true позволяет автоматически не промотировать DR-реплику, пока оператор не решит иначе. Сравните: синхронная схема даёт RPO=0, но снижает TPS на 40% — мы рекомендуем её только для финансовых транзакций в пределах одного города. Асинхронная репликация в 50 раз быстрее по TPS при задержке >10 мс.

Как проверить консистентность данных после репликации?

Для PostgreSQL используйте pg_checksums и pg_comparator. Для таблиц с большим объёмом данных (10+ TB) достаточно сравнивать контрольные суммы каждого WAL-файла. Для S3 — запускайте aws s3 sync --dryrun раз в неделю, чтобы выявить расхождения в именах и хэшах объектов. Наши инженеры включают такие проверки в автоматику по умолчанию.

Типичные ошибки и чек-лист при настройке DR

Чек-лист настройки кросс-региональной репликации
  1. Проверьте сетевую связность между регионами: latency, bandwidth, MTU.
  2. Настройте мониторинг лага репликации с алертами (Prometheus + Grafana).
  3. Создайте runbook с описанием процедуры promote и обратного копирования.
  4. Регулярно тестируйте failover (минимум раз в квартал).
  5. Включите репликацию только после полного аудита производительности мастера.

Что входит в работу по настройке DR

Компонент Описание Результат
PostgreSQL streaming replication Настройка защищённого канала, конфиг Patroni, мониторинг лага DR-реплика с RPO до 5 сек
MySQL GTID Включение GTID, параллельная репликация, auto-failover скрипт DR-реплика с RPO до 2 сек
S3 Cross-Region Replication Включение CRR, миграция существующих объектов Автоматическая репликация с SLO 99.9%
Мониторинг и алерты Prometheus/Grafana, алерты при лаге >30 сек SMS/Telegram оповещения
Документация runbook Описание процедуры промоута и тестирования Runbook для инженеров

Ориентиры по срокам

Компонент Сложность Срок
PostgreSQL streaming replication cross-region Средняя 3–7 дней
MySQL GTID cross-region Средняя 2–5 дней
S3 Cross-Region Replication Низкая 1–2 дня
Комплексная репликация (несколько БД + файлы + мониторинг) Высокая 2–6 недель

Стоимость рассчитывается индивидуально после аудита инфраструктуры. Получите консультацию — наши инженеры оценят вашу схему и предложат оптимальное решение под ключ с гарантией RTO/RPO. Настройте DR, который действительно работает, — свяжитесь с нами, чтобы обсудить детали вашего проекта.

Ссылки

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139