Облачные вычисления и центры обработки данных

Три принципа предотвращения каскадного отказа в распределённых системах

Sam Newman объясняет, как небольшой сбой в одном компоненте может перерасти в масштабный отказ распределённых систем, приводя в качестве примеров инцидент Ronan Point, сбой AWS и проблему на сайте продажи подержанных автомобилей. Он предлагает три практические стратегии: снижение рисков, укрепление компонентов и уменьшение связанности между ними.

2026-08-19
5 мин. чтения
197 просмотров
certi.news Editorial Team
Три принципа предотвращения каскадного отказа в распределённых системах

Отказ распределённой системы может начаться с ошибки, которая кажется незначительной, но быстро перерасти в цепочку сбоев, когда множество компонентов зависит друг от друга. В выступлении Sam Newman, независимый консультант по разработке программного обеспечения, связывает понятие каскадного отказа (Progressive Collapse) в гражданском строительстве с проблемами устойчивости цифровых систем и приходит к выводу, что предотвратить все ошибки невозможно, однако можно снизить вероятность их распространения и масштаб последствий.

От здания Ronan Point до облачных сервисов

Newman возвращается к инциденту частичного обрушения башни Ronan Point в районе Canning Town в Лондоне в 1968 году. Ограниченный взрыв газа в квартире Mrs. Ivy Hodge выбил внешнюю стену, которая поддерживала часть здания. Четыре этажа над местом взрыва обрушились, после чего часть угла башни упала в результате последовательного воздействия. Погибли четыре человека, а время происшествия — незадолго до шести часов утра — помогло ограничить число жертв.

Смысл этой истории для программного обеспечения заключается не в физическом сходстве здания и цифрового сервиса, а в характере отказа: небольшой первоначальный сбой выводит из строя компонент, от которого зависят другие компоненты, и круг ущерба расширяется. Такую цепочку трудно понять в распределённых системах, поскольку связи между сервисами, базами данных, балансировщиками нагрузки и системами DNS не всегда видны как ряд костяшек домино.

Цифровые примеры каскадного отказа

Во время сбоя в зоне us-east-1 AWS в октябре один из вспомогательных компонентов DynamoDB столкнулся с проблемой при обновлении маршрутов DNS внутри инфраструктуры AWS. Ошибка в процессе обновления планов привела к удалению маршрутов в Route 53, после чего начали отказывать сервисы, зависевшие от этих маршрутов, включая сетевые балансировщики нагрузки, вычислительные сервисы, очереди и EKS. Поскольку эти базовые сервисы использовались другими сервисами, проблема распространилась на продукты и компании, взаимодействующие с пользователями, включая Alexa, Ring, Slack, Snapchat, Zoom и Shopify; некоторые из них пострадали частично, а другие — полностью.

Согласно объяснению Newman, основанному на отчёте AWS, система включала планировщик, создававший планы изменений DNS, и несколько исполнителей, применявших их. Один из планов выполнялся дольше обычного, затем был создан другой план, который другой исполнитель применил быстро. Когда выполнение старого плана позднее завершилось, он удалил маршруты, созданные новым планом. В результате возникло состояние гонки (Race Condition), приведшее к удалению записей DNS.

Вторым примером был сайт продажи подержанных автомобилей, мотоциклов и прицепов, работавший на приложении под кодовым названием Sauron на десяти серверах. Обычно приложение обрабатывало от 30 до 60 одновременных запросов, но столкнулось с более чем 800 запросами. Один из зависимых сайтов принимал соединения, а затем зависал без ответа, тогда как приложение ожидало 30 секунд перед завершением запроса. Пул соединений был исчерпан, затем начали накапливаться программные потоки, и процессоры тратили время на управление ими, в результате чего система полностью остановилась. Пользователи усилили нагрузку, многократно нажимая кнопку обновления.

Три направления для снижения вероятности обрушения

Newman считает, что сосредоточение на одной «первопричине» ведёт к чрезмерному упрощению. Предотвращение искры может быть полезным, но оно не устраняет все условия, позволяющие огню распространиться. Поэтому инженерия устойчивости предполагает принятие вероятности отказов и подготовку к ограничению их последствий посредством трёх взаимосвязанных категорий:

  • Снижение рисков: устранение источников опасности или ограничение их способности истощать ресурсы. В случае AWS это включало временную остановку автоматического управления DNS до устранения проблемы и добавление более качественных тестов компонента. В приложении Sauron можно было бы использовать сброс нагрузки (Load Shedding), принимая ограниченное число запросов и отклоняя те, что превышают возможности системы, вместо того чтобы позволять им накапливаться до отказа.
  • Укрепление компонентов: повышение способности сервиса выдерживать отказ части системы посредством избыточности, мониторинга, тестирования и улучшения реализации. Это может означать запуск нескольких экземпляров сервиса за балансировщиком нагрузки, однако решение зависит от важности компонента и его стоимости: приложение Sauron находилось на этапе вывода из эксплуатации и обеспечивало лишь часть доходов, поэтому запуск дополнительных резервных экземпляров в тот момент был коммерчески непривлекательным вариантом.
  • Уменьшение связанности: предотвращение распространения отказа одного компонента на остальную систему. Это включает использование изолирующих перегородок (Bulkheads), ограничений времени ожидания, альтернативных маршрутов и локальных архитектур, когда это возможно. Чем меньше одна часть системы зависит от другой, тем легче локализовать отказ, а не распространять его.

Что это практически меняет для технических команд?

Устойчивость не означает автоматический запуск системы в двух регионах или двух облаках. Newman объясняет, что варианты простираются от резервного копирования и восстановления до архитектуры Pilot Light, которая реплицирует данные без полного запуска инфраструктуры, затем до тёплого восстановления и, наконец, до одновременной работы двух активных площадок. Эти варианты постепенно сокращают время простоя и потери данных, но повышают стоимость и сложность.

Он также предостерегает от того, чтобы считать двунаправленную синхронизацию между площадками простой задачей, особенно при добавлении её к существующему приложению, которое для этого не проектировалось. То же относится к использованию нескольких облаков: оно может уменьшить зависимость от одного провайдера, но требует разных навыков и операционных процессов для каждой платформы, а простого развертывания одного и того же кода в AWS и Azure недостаточно для обеспечения независимости, поскольку одна и та же программная ошибка может вывести из строя обе среды.

Заключение

Главный урок заключается в том, что устойчивость — это не поиск среды, которая никогда не отказывает, а проектирование системы таким образом, чтобы её часть продолжала работать при отказе другой части. Поэтому следует оценивать риски, пределы ёмкости, узкие места и цепочки зависимостей, а затем находить баланс между избыточностью, изоляцией и стоимостью. Такие решения, как работа в нескольких регионах или облаках, остаются инженерными и коммерческими вариантами, зависящими от важности сервиса, а не универсальным рецептом для любой системы.

Источник новости
InfoQ - Architecture Articles
Открыть первоисточник ↗
c
Автор

certi.news Editorial Team

Что важно знать

Sam Newman объясняет, что локальный сбой в распределённых системах может перерасти в масштабный отказ из-за взаимозависимости компонентов. Он предлагает ограничивать такие последствия за счёт снижения рисков, укрепления компонентов и уменьшения связности между ними, одновременно находя баланс между устойчивостью и стоимостью.

  • Каскадный отказ происходит, когда небольшой первоначальный сбой нарушает работу зависимых от него компонентов, в результате чего зона ущерба расширяется.
  • Ошибка при обновлении маршрутов DNS в AWS вызвала последовательные сбои, затронувшие такие сервисы, как DynamoDB, Route 53 и EKS, а затем и зависящие от них продукты.
  • Риски можно снизить, временно приостанавливая опасные операции, улучшая тестирование и применяя сброс нагрузки, чтобы предотвратить истощение ресурсов.
  • Укрепление компонентов включает резервирование, мониторинг и тестирование, однако целесообразность резервных копий зависит от важности сервиса и его стоимости.
  • Снижение связности с помощью изоляции, ограничений времени ожидания и альтернативных маршрутов помогает локализовать сбои.
  • Работа в нескольких регионах или облаках не является автоматическим решением: она повышает сложность и стоимость и может не предотвратить воздействие общей программной ошибки на обе среды.

Частые вопросы

Что такое каскадный отказ в распределённых системах?

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

Какие три стратегии предлагаются для ограничения каскадных отказов?

Снижение рисков, укрепление компонентов и уменьшение связности между частями системы.

Как случай с AWS способствовал распространению сбоя?

Гонка между двумя планами изменений DNS привела к удалению маршрутов, созданных более новым планом. Из-за этого остановились сервисы, зависевшие от этих маршрутов, и последствия распространились на другие продукты.

Гарантирует ли использование двух разных облаков предотвращение сбоя?

Нет. В статье объясняется, что одна и та же программная ошибка может вывести из строя обе среды, а работа с несколькими облаками также требует иных навыков и процессов.

В той же категории

Вам также может понравиться

Все новости