Что такое отказоустойчивость (Fault Tolerance)?

«Что такое отказоустойчивость (Fault Tolerance)?» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Отказоустойчивость — это свойство системы продолжать корректно выполнять свои функции (возможно, с деградировавшей производительностью) при возникновении сбоев в её отдельных компонентах (аппаратных, программных, сетевых). Цель — обеспечить доступность (Availability) и надёжность (Reliability) сервиса для пользователей.

Ключевые принципы и паттерны построения отказоустойчивых систем:

  1. Резервирование (Redundancy): Наличие избыточных компонентов, готовых заменить отказавшие.

    • Активное-активное: Все реплики обрабатывают нагрузку (например, несколько инстансов приложения за балансировщиком). Повышает и производительность, и отказоустойчивость.
    • Активное-пассивное (hot/warm standby): Резервный компонент находится в режиме ожидания и включается при отказе основного.
  2. Разделение на изолированные отсеки (Bulkheading): Предотвращение каскадных сбоев. Если падает один микросервис или зона доступности, это не должно "утянуть" за собой всю систему. Пример: использование отдельных пулов подключений к БД для разных сервисов.

  3. Самовосстановление (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
  4. Повторные попытки с экспоненциальной задержкой (Retry with Backoff): Временные сбои (сеть, зависимый сервис) часто можно преодолеть, повторив запрос через растущие интервалы.

  5. Цепочка вызовов с запасным вариантом (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 для обнаружения аномалий и уведомления инженеров, если автоматика не справилась.

Итог: Отказоустойчивость — это не про отсутствие сбоев, а про проектирование системы с расчётом на то, что сбои обязательно произойдут, и минимизацию их влияния на конечного пользователя.