Отказоустойчивость (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 удаленная площадка: Бэкапы реплицируются в независимый регион.
Типы бэкапов
- PITR (Point-in-Time Recovery) для PostgreSQL: позволяет откатиться на любую секунду за последние 7 дней (через WAL-архивы).
- Besu Snapshots: Ежечасный снимок состояния блокчейна.
- Config Backup: Все конфигурации (Terraform, K8s manifests) хранятся в Git.
4. Business Continuity Plan (BCP)
Что делать, если "все сломалось", но работать надо?
Сценарий: Недоступен DLT (Реестр)
- Система переходит в режим Read-Only.
- Клиенты могут видеть балансы (из кэша Ledger-DB).
- Новые операции (выпуск, перевод) блокируются с ошибкой "Техническое обслуживание".
- Срочные погашения (по требованию регулятора) выполняются вручную через прямую выплату с банковского счета с последующим (отложенным) отражением в реестре.
5. Disaster Recovery Runbooks
Runbook: Потеря Primary DC
Симптомы:
- Все сервисы недоступны
- Мониторинг показывает "Service Down"
- DNS не резолвится
Действия:
-
Объявление инцидента
# Объявление инцидента в Slack /incident declare "Primary DC Down" severity=critical -
Оценка ситуации
# Проверка статуса сервисов kubectl get pods -n maniton # Проверка состояния данных kubectl get pvc -n maniton -
Переключение на 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 -
Восстановление 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
Симптомы:
- База данных недоступна
- Ошибки подключения
- Данные повреждены
Действия:
-
Оценка повреждений
# Проверка состояния 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 -
Восстановление из 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 -
Восстановление из реплики
# Промоут реплики 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
Симптомы:
- Блокчейн недоступен
- Транзакции не проходят
- Блоки не генерируются
Действия:
-
Проверка состояния
# Проверка валидаторов 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}' -
Восстановление из snapshot
# Получение snapshot kubectl exec -n maniton besu-validator-0 -- besu snapshot export # Восстановление kubectl exec -n maniton besu-validator-0 -- besu snapshot import snapshot.json -
Перезапуск сети
# Перезапуск валидаторов 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