Ответ
Отказоустойчивость — это свойство системы продолжать корректно выполнять свои функции (возможно, с деградировавшей производительностью) при возникновении сбоев в её отдельных компонентах (аппаратных, программных, сетевых). Цель — обеспечить доступность (Availability) и надёжность (Reliability) сервиса для пользователей.
Ключевые принципы и паттерны построения отказоустойчивых систем:
-
Резервирование (Redundancy): Наличие избыточных компонентов, готовых заменить отказавшие.
- Активное-активное: Все реплики обрабатывают нагрузку (например, несколько инстансов приложения за балансировщиком). Повышает и производительность, и отказоустойчивость.
- Активное-пассивное (hot/warm standby): Резервный компонент находится в режиме ожидания и включается при отказе основного.
-
Разделение на изолированные отсеки (Bulkheading): Предотвращение каскадных сбоев. Если падает один микросервис или зона доступности, это не должно "утянуть" за собой всю систему. Пример: использование отдельных пулов подключений к БД для разных сервисов.
-
Самовосстановление (Self-healing): Система автоматически обнаруживает сбой и предпринимает действия по его устранению без вмешательства человека.
- В Kubernetes: Контроллер реплик (
Deployment,StatefulSet) постоянно поддерживает заданное количество работающих подов (replicas). Если под падает, контроллер создаёт новый. - Проверки жизнеспособности (Probes):
livenessProbe: # Перезапускает контейнер, если проверка не проходит httpGet: path: /health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: # Исключает под из балансировки нагрузки, если он не готов httpGet: path: /ready port: 8080 periodSeconds: 5
- В Kubernetes: Контроллер реплик (
-
Повторные попытки с экспоненциальной задержкой (Retry with Backoff): Временные сбои (сеть, зависимый сервис) часто можно преодолеть, повторив запрос через растущие интервалы.
-
Цепочка вызовов с запасным вариантом (Circuit Breaker): Если зависимый сервис постоянно недоступен, "размыкатель" прерывает цепь вызовов на определённое время, возвращая клиенту заранее подготовленный ответ по умолчанию (fallback), чтобы не накапливать очередь запросов и не тратить ресурсы.
Пример отказоустойчивой архитектуры в DevOps-стеке:
- Инфраструктура: Кластер Kubernetes, развёрнутый across multiple availability zones (AZ).
- Приложение: Stateless-микросервисы с 3+ репликами, размазанными по разным нодам и AZ.
- Балансировщик: Cloud Load Balancer, проверяющий health checks и направляющий трафик только на здоровые инстансы.
- База данных: Управляемый сервис БД (например, Amazon RDS) с Multi-AZ репликацией и автоматическим failover.
- Кэш: Кластер Redis с Sentinel или Redis Cluster для автоматического переключения на реплику.
- Мониторинг и алертинг: Prometheus + Alertmanager для обнаружения аномалий и уведомления инженеров, если автоматика не справилась.
Итог: Отказоустойчивость — это не про отсутствие сбоев, а про проектирование системы с расчётом на то, что сбои обязательно произойдут, и минимизацию их влияния на конечного пользователя.