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

Что такое отказоустойчивость (fault tolerance)

Отказоустойчивость — способность системы продолжать работать корректно при появлении сбоев в её компонентах. Иначе: система «терпит» отказы (hardware, софт, сеть, человеческие ошибки) без критической потери функциональности и гарантирует приемлемое поведение для пользователей.

Ключевые идеи

  • Выделение и маскирование отказов. Система должна обнаруживать сбой и либо автоматически переключаться на резерв, либо деградировать контролируемо.

  • Сохранение инвариантов. Даже при частичных отказах важные свойства (целостность данных, корректность обработки) должны соблюдаться.

  • Прогнозируемое поведение. Переход системы в degraded-mode и время восстановления (MTTR) — предсказуемы и управляемы.

Типы отказов и модели

  • Crash/fail-stop — узел внезапно перестаёт отвечать.

  • Byzantine (произвольные) — узел даёт некорректные/вредоносные ответы.

  • Network partition — разделение сети; узлы изолированы.

  • Transient/soft faults — временные ошибки (пакеты теряются, таймауты).
    Для разных моделей требуются разные алгоритмы: для простых fail-stop часто достаточно репликации; для Byzantine нужны более тяжёлые схемы (например, 3f+1 реплик чтобы терпеть f произвольных ошибок).

Количество реплик и кворумы (коротко)

  • Для того чтобы просто сохранить хотя бы одну живую копию при f отказах — нужно f+1 реплик.

  • Для систем, использующих кворум-голосование (majority), чтобы после f отказов остался кворум, обычно проектируют 2f+1 нод.

  • Для устойчивости к Byzantine-faults теоретический минимум — 3f+1 нод.

Техники обеспечения отказоустойчивости

  • Избыточность (redundancy): ноды, диски (RAID), кластеры, реплики БД.

  • Репликация: синхронная (сильная согласованность, медленнее) и асинхронная (быстрее, возможна потеря недозаписанных транзакций).

  • Failover / leader election: автоматическое переключение на резервный узел.

  • Разделение доменов отказа: размещение в разных rack/AZ/region.

  • Изоляция (bulkheads): ограничение распространения ошибок между компонентами (контейнеры, очереди).

  • Circuit breakers и rate limiting: предотвращение лавинообразного ухудшения при проблемах зависимостей.

  • Idempotency & retries с backoff: безопасные повторы и контролируемая нагрузка.

  • Checkpointing и журналирование (WAL): возможность откатиться или восстановить состояние до консистентной точки.

  • Разнообразие (diversity): разные реализации/поставщики, чтобы ошибка в одной реализации не затронула все копии.

  • Health checks и heartbeats: быстрое детектирование недоступных компонентов.

Проектирование stateful vs stateless

Stateless-сервисы проще: масштабируются и заменяются. Stateful-компоненты (БД, очереди) требуют репликации, согласованности и механизма восстановления состояния (snapshot + WAL, журнал транзакций, реплика-промоут).

Метрики и SLA-связь

  • MTTF / MTBF (среднее время до отказа), MTTR (среднее время восстановления).

  • RPO / RTO — влияют на выбор стратегий репликации и резервирования.
    Отказоустойчивость про то, чтобы минимизировать влияние отказа (низкий RTO/RPO) и удерживать SLO.

Тестирование и валидация

  • Chaos engineering (fault injection) — симуляция отказов в проде для проверки устойчивости.

  • Failover drills, интеграционные тесты, регулярные проверки резервных сценариев, мониторинг метрик «здоровья».

Ограничения и компромиссы

Отказоустойчивость увеличивает сложность, стоимость (дублирование, сеть, оперирование) и может требовать компромиссов по согласованности (CAP). Нужно балансировать требования бизнеса (насколько критична потеря данных/простой) и стоимость реализации.