Инженерия отказоустойчивости: проектирование с учетом отказов в облачных развертываниях в нескольких регионах.
Практический подход к проектированию распределенных систем для промышленной эксплуатации, сохраняющих работоспособность при неизбежных отказах регионов, баз данных, сетей и внешних зависимостей.
Mihail Leybuk-GalinСистемный архитекторПоделиться статьёй
1. Учет отказов как архитектурное требование
Облачная инфраструктура создаёт впечатление, что избыточность устраняет отказы. Это не так. Управляемые сервисы, зоны доступности, репликация и автомасштабирование лишь меняют вероятность и характер отказов.
Системы в рабочей среде по-прежнему сталкиваются с сетевыми разделениями, исчерпанием ресурсов, неудачными развёртываниями, проблемами с учётными данными, инцидентами в базах данных, недоступностью зависимостей, ошибками операторов и полным отказом регионов. Проектирование устойчивости начинается с предположения, что каждая зависимость рано или поздно станет недоступной.
2. Выбор подходящей стратегии работы в нескольких регионах
Мультирегиональная инфраструктура не означает автоматически архитектуру active-active. Подходящая топология зависит от целевых показателей восстановления, требований к согласованности, географии пользователей, зрелости эксплуатации и стоимости простоя для бизнеса.
Топология приложения и данных в нескольких регионах
Открыть полноразмерное изображениеАрхитектуры active-passive обеспечивают более простые гарантии согласованности и меньшую эксплуатационную сложность. Развёртывания active-active могут сократить региональные задержки и ускорить переключение трафика, но создают более сложные задачи, связанные с ответственностью за операции записи, репликацией, разрешением конфликтов и реагированием на инциденты.
Практичным компромиссом часто становятся вычислительные компоненты без состояния в режиме active-active в сочетании с явно закреплённой ответственностью за операции записи состояния.
3. Проектирование работы с данными с учетом отказа региона
Вычислительные компоненты реплицировать относительно легко. Состояние — нет. База данных должна отвечать на вопросы, которых могут избежать реплики приложения: какой регион отвечает за запись, насколько быстро реплицируются данные, что происходит при сетевом разделении и какая копия становится основной после переключения при отказе.
Эти решения должны определяться двумя метриками: целевой точкой восстановления (RPO) и целевым временем восстановления (RTO). Они превращают расплывчатые ожидания относительно «высокой доступности» в явные бизнес-требования.
resilience.yaml
service:
request_timeout: 4.5s
database:
primary_region: eu-central
replication: async
max_replication_lag: 30s
dependencies:
timeout: 500ms
retries: 2
backoff: exponential
jitter: true
circuit_breaker:
failure_threshold: 10
open_for: 30sСинхронная репликация сокращает потенциальную потерю данных, но напрямую добавляет сетевую задержку между регионами к выполнению записи. Асинхронная репликация сохраняет низкую задержку локальной записи, допуская при этом измеримый интервал потенциальной потери данных при восстановлении. Правильный компромисс зависит от предметной области.
4. Предотвращение распространения локальных сбоев на всю систему
Мультирегиональные архитектуры часто отказывают глобально, потому что предположительно независимые регионы продолжают использовать одну общую критическую зависимость. Общий глобальный кеш, сервис аутентификации, база данных, поставщик конфигурации или внешняя интеграция могут незаметно свести на нет ценность географической избыточности.
Предотвращение распространения локальных сбоев на всю систему
Предохранители
Не позволяйте сбоящей зависимости занимать рабочие потоки и увеличивать задержки во всей системе.
Явно заданные тайм-ауты
Для каждой удаленной зависимости должен быть задан предельный срок выполнения, согласованный с общим бюджетом задержки запроса.
Изоляция ресурсов
Разделяйте пулы рабочих потоков, очереди и ресурсы соединений, чтобы перегрузка одной функции не могла исчерпать ресурсы всего приложения.
Плавная деградация
Сохраняйте критически важные пользовательские сценарии, временно отключая рекомендации, аналитику, персонализацию и другие необязательные функции.
Устойчивость приобретает практический смысл только после проверки этих сценариев. Учения по переключению между регионами при отказе, искусственное внесение сбоев в зависимости, эксперименты с задержками и командные тренировки по реагированию на сбои превращают архитектурные предположения в проверенное поведение при эксплуатации.
5. Результаты и метрики
Устойчивую архитектуру следует оценивать по скорости восстановления, риску потери данных, доступности критического пути и масштабу отказа, а не только по числу регионов на архитектурной схеме.
- Целевое время переключения при отказе
- 90с
- Целевой RPO
- <30с
- Целевой показатель критичного API
- 99.99%
Мультирегиональную инфраструктуру легко нарисовать и трудно эксплуатировать. Наиболее надёжные системы определяют, какие отказы они способны выдержать, какие возможности могут деградировать, какой объём данных может временно оказаться под угрозой и как платформа возвращается в стабильное состояние после переключения при отказе.