Манитон Docs

Отказоустойчивость (DRP/BCP)

Резервирование, бэкапы и планы восстановления

Отказоустойчивость (DRP/BCP)

Платформа классифицируется как Критичная Инфраструктура. Мы обеспечиваем доступность сервиса 99.9% и сохранность данных (RPO ≈ 0).

1. Процесс восстановления (Disaster Recovery Pipeline)

Алгоритм действий дежурной смены при возникновении критического инцидента (например, падение дата-центра).

Loading diagram...

2. Метрики RTO и RPO

  • RPO (Recovery Point Objective) = 0 (потеря данных недопустима).
    • Достигается за счет синхронной репликации БД (Sync Commit) и кворума в блокчейне (QBFT требует подтверждения от 2/3 узлов).
  • RTO (Recovery Time Objective) = 4 часа.
    • Максимальное время простоя при полной потере основного ЦОД.

3. Резервирование данных (Backups)

Стратегия 3-2-1

  • 3 копии данных: Основная, Реплика, Холодный бэкап.
  • 2 типа носителей: Быстрые SSD (для работы), Объектное хранилище S3 (для архива).
  • 1 удаленная площадка: Бэкапы реплицируются в независимый регион.

Типы бэкапов

  1. PITR (Point-in-Time Recovery) для PostgreSQL: позволяет откатиться на любую секунду за последние 7 дней (через WAL-архивы).
  2. Besu Snapshots: Ежечасный снимок состояния блокчейна.
  3. Config Backup: Все конфигурации (Terraform, K8s manifests) хранятся в Git.

4. Business Continuity Plan (BCP)

Что делать, если "все сломалось", но работать надо?

Сценарий: Недоступен DLT (Реестр)

  1. Система переходит в режим Read-Only.
  2. Клиенты могут видеть балансы (из кэша Ledger-DB).
  3. Новые операции (выпуск, перевод) блокируются с ошибкой "Техническое обслуживание".
  4. Срочные погашения (по требованию регулятора) выполняются вручную через прямую выплату с банковского счета с последующим (отложенным) отражением в реестре.

5. Disaster Recovery Runbooks

Runbook: Потеря Primary DC

Симптомы:

  • Все сервисы недоступны
  • Мониторинг показывает "Service Down"
  • DNS не резолвится

Действия:

  1. Объявление инцидента

    # Объявление инцидента в Slack
    /incident declare "Primary DC Down" severity=critical
  2. Оценка ситуации

    # Проверка статуса сервисов
    kubectl get pods -n maniton
    
    # Проверка состояния данных
    kubectl get pvc -n maniton
  3. Переключение на Standby DC

    # Обновление DNS
    kubectl patch configmap dns-config -p '{"data":{"primary":"standby"}}'
    
    # Промоут реплики DB
    kubectl exec -n maniton postgres-standby-0 -- pg_ctl promote
    
    # Проверка состояния
    kubectl get pods -n maniton-standby
  4. Восстановление Primary DC

    # Восстановление из бэкапов
    kubectl exec -i -n maniton postgres-0 -- psql -U postgres < backup.sql
    
    # Синхронизация данных
    kubectl exec -n maniton postgres-0 -- pg_basebackup -h postgres-standby -D /var/lib/postgresql/data

Runbook: Потеря данных PostgreSQL

Симптомы:

  • База данных недоступна
  • Ошибки подключения
  • Данные повреждены

Действия:

  1. Оценка повреждений

    # Проверка состояния
    kubectl exec -n maniton postgres-0 -- pg_controldata -D /var/lib/postgresql/data
    
    # Проверка WAL
    kubectl exec -n maniton postgres-0 -- ls -la /var/lib/postgresql/data/pg_wal
  2. Восстановление из PITR

    # Определение точки восстановления
    kubectl exec -n maniton postgres-0 -- psql -U postgres -c "SELECT pg_current_wal_lsn()"
    
    # Восстановление
    kubectl exec -n maniton postgres-0 -- pg_restore -d postgres backup.dump
  3. Восстановление из реплики

    # Промоут реплики
    kubectl exec -n maniton postgres-replica-0 -- pg_ctl promote
    
    # Проверка данных
    kubectl exec -n maniton postgres-replica-0 -- psql -U postgres -c "SELECT COUNT(*) FROM operations"

Runbook: Потеря данных Besu

Симптомы:

  • Блокчейн недоступен
  • Транзакции не проходят
  • Блоки не генерируются

Действия:

  1. Проверка состояния

    # Проверка валидаторов
    kubectl exec -n maniton besu-validator-0 -- besu peers
    
    # Проверка блоков
    kubectl exec -n maniton besu-validator-0 -- curl -X POST http://localhost:8545 \
      -H "Content-Type: application/json" \
      -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
  2. Восстановление из snapshot

    # Получение snapshot
    kubectl exec -n maniton besu-validator-0 -- besu snapshot export
    
    # Восстановление
    kubectl exec -n maniton besu-validator-0 -- besu snapshot import snapshot.json
  3. Перезапуск сети

    # Перезапуск валидаторов
    kubectl rollout restart deployment besu-validator -n maniton
    
    # Проверка консенсуса
    kubectl exec -n maniton besu-validator-0 -- besu consensus status

6. Мониторинг DR/BCP

Метрики

export const drMetrics = {
  primaryDcStatus: new Gauge({
    name: 'dr_primary_dc_status',
    help: 'Status of primary data center',
    labelNames: ['dc'],
  }),

  standbyDcStatus: new Gauge({
    name: 'dr_standby_dc_status',
    help: 'Status of standby data center',
    labelNames: ['dc'],
  }),

  replicationLag: new Gauge({
    name: 'dr_replication_lag_seconds',
    help: 'Replication lag in seconds',
    labelNames: ['service'],
  }),

  backupStatus: new Gauge({
    name: 'dr_backup_status',
    help: 'Backup status',
    labelNames: ['type'],
  }),
};

Алерты

groups:
  - name: dr
    rules:
      - alert: PrimaryDCDown
        expr: dr_primary_dc_status{dc="primary"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: 'Primary data center is down'

      - alert: ReplicationLagHigh
        expr: dr_replication_lag_seconds > 300
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: 'Replication lag is high'

      - alert: BackupFailed
        expr: dr_backup_status == 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: 'Backup failed'

7. Тестирование DR/BCP

Chaos Engineering

# Убить под
kubectl delete pod -n maniton auth-service-xxx

# Остановить сервис
kubectl scale deployment auth-service -n maniton --replicas=0

# Убить node
kubectl cordon node-1
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data

# Симуляция потери сети
kubectl run test --image=busybox --rm -it -- sh -c 'iptables -A INPUT -s 10.0.0.0/8 -j DROP'

Recovery Testing

# Тест восстановления из бэкапа
kubectl exec -i -n maniton postgres-0 -- psql -U postgres < backup.sql

# Тест восстановления из реплики
kubectl exec -n maniton postgres-replica-0 -- pg_ctl promote

# Тест восстановления из snapshot
kubectl exec -n maniton besu-validator-0 -- besu snapshot import snapshot.json

Дополнительные ресурсы

On this page