Отказоустойчивость — это способность системы поддерживать надлежащую работу, несмотря на сбои или неисправности в одном или нескольких ее компонентах. Эта способность имеет важное значение для систем высокой доступности , критически важных для выполнения задач или даже жизненно важных систем .
Отказоустойчивость конкретно относится к способности системы обрабатывать сбои без какой-либо деградации или простоя. В случае ошибки конечные пользователи остаются в неведении относительно каких-либо проблем. И наоборот, система, которая испытывает ошибки с некоторым прерыванием обслуживания или постепенным снижением производительности, называется «устойчивой». При устойчивости система адаптируется к ошибке, поддерживая обслуживание, но признавая определенное влияние на производительность.
Обычно отказоустойчивость описывает компьютерные системы , гарантируя, что вся система остается функциональной, несмотря на проблемы с оборудованием или программным обеспечением . Некомпьютерные примеры включают структуры, которые сохраняют свою целостность, несмотря на повреждения от усталости , коррозии или удара.
Первым известным отказоустойчивым компьютером был SAPO , построенный в 1951 году в Чехословакии Антонином Свободой . [1] : 155 Его базовая конструкция представляла собой магнитные барабаны , соединенные через реле, с методом голосования для обнаружения ошибок памяти ( тройная модульная избыточность ). Несколько других машин были разработаны в этом направлении, в основном для военного использования. В конце концов, они разделились на три отдельные категории:
Большая часть разработок в области так называемых вычислений LLNM (Long Life, No Maintenance) была выполнена NASA в 1960-х годах [2] в рамках подготовки к проекту Apollo и другим исследовательским аспектам. Первая машина NASA отправилась в космическую обсерваторию , а вторая попытка, компьютер JSTAR, использовалась в Voyager . Этот компьютер имел резервную копию массивов памяти для использования методов восстановления памяти, и поэтому его называли компьютером JPL Self-Testing-And-Repairing. Он мог обнаруживать собственные ошибки и исправлять их или при необходимости задействовать избыточные модули. Компьютер все еще работает по состоянию на начало 2022 года. [3]
Гипернадежные компьютеры были впервые использованы в основном производителями самолетов , [1] : 210 компаниями атомной энергетики и железнодорожной промышленностью в Соединенных Штатах. Этим организациям нужны были компьютеры с огромным количеством времени безотказной работы, которые могли бы достаточно изящно выходить из строя во время сбоя, чтобы обеспечить продолжение работы, при этом полагаясь на постоянный человеческий мониторинг выходных данных компьютера для обнаружения сбоев. IBM снова разработала первый компьютер такого типа для NASA для управления ракетами Saturn V , но позже BNSF , Unisys и General Electric построили свои собственные. [1] : 223
В 1970-х годах в этой области было проведено много работ. [4] [5] [6] Например, F14 CADC имел встроенную самодиагностику и избыточность. [7]
В целом, ранние попытки создания отказоустойчивых конструкций были сосредоточены в основном на внутренней диагностике, где неисправность указывала на то, что что-то выходит из строя, и рабочий мог это заменить. Например, у SAPO был метод, при котором неисправные барабаны памяти издавали шум перед отказом. [8] Более поздние попытки показали, что для полной эффективности система должна была быть самовосстанавливающейся и диагностируемой — изолируя неисправность, а затем внедряя избыточное резервное копирование, предупреждая о необходимости ремонта. Это известно как избыточность N-модели, где неисправности вызывают автоматические отказоустойчивые функции и предупреждение оператору, и это по-прежнему самая распространенная форма отказоустойчивой конструкции первого уровня, используемая сегодня.
Другим первоначальным методом было голосование, как обсуждалось выше, с несколькими резервными резервами, работающими постоянно и проверяющими результаты друг друга. Например, если четыре компонента сообщили ответ 5, а один компонент сообщил ответ 6, остальные четыре «голосовали» за то, что пятый компонент был неисправен, и выводили его из эксплуатации. Это называется голосованием большинства M из N.
Исторически сложилась тенденция к отходу от N-модели и переходу к M-модели из N, поскольку сложность систем и трудность обеспечения переходного состояния от состояния с отрицательным отказом к состоянию с положительным отказом не нарушали работу.
Tandem Computers , в 1976 году [9] и Stratus были среди первых компаний, специализирующихся на разработке отказоустойчивых компьютерных систем для обработки онлайн-транзакций .
Аппаратная отказоустойчивость иногда требует, чтобы сломанные части были извлечены и заменены новыми, пока система все еще работает (в вычислительной технике это известно как горячая замена ). Такая система, реализованная с одной резервной копией, известна как одноточечная толерантность и представляет собой подавляющее большинство отказоустойчивых систем. В таких системах среднее время между отказами должно быть достаточно большим, чтобы у операторов было достаточно времени для исправления сломанных устройств ( среднее время ремонта ) до того, как резервная копия также выйдет из строя. Полезно, если время между отказами будет как можно больше, но это не является особым требованием в отказоустойчивой системе.
Отказоустойчивость особенно успешна в компьютерных приложениях. Tandem Computers построили весь свой бизнес на таких машинах, которые использовали одноточечную устойчивость для создания своих систем NonStop с временем безотказной работы, измеряемым годами.
Отказоустойчивые архитектуры могут охватывать также компьютерное программное обеспечение, например, путем репликации процессов .
Форматы данных также могут быть разработаны для постепенного ухудшения. Например, HTML разработан для обеспечения прямой совместимости , что позволяет веб-браузерам игнорировать новые и неподдерживаемые сущности HTML, не делая документ непригодным для использования. Кроме того, некоторые сайты, включая популярные платформы, такие как Twitter (до декабря 2020 года), предоставляют дополнительный облегченный интерфейс, который не использует JavaScript и имеет минимальную компоновку, чтобы обеспечить широкую доступность и охват , например, на игровых консолях с ограниченными возможностями просмотра веб-страниц. [10] [11]
Высокоустойчивая к отказам система может продолжать работать на том же уровне производительности, даже если один или несколько компонентов вышли из строя. Например, здание с резервным электрогенератором будет подавать то же напряжение на настенные розетки, даже если отключится электросеть.
Система, которая разработана для отказоустойчивой , или отказоустойчивой, или отказоустойчивой изящно , независимо от того, функционирует ли она на пониженном уровне или полностью выходит из строя, делает это таким образом, чтобы защитить людей, имущество или данные от травм, повреждений, вторжений или раскрытия. В компьютерах программа может отказоустойчивой, выполняя изящный выход (в отличие от неконтролируемого сбоя), чтобы предотвратить повреждение данных после возникновения ошибки. [12] Аналогичное различие проводится между «хорошо проваливается» и « плохо проваливается ».
Система, разработанная для постепенной деградации или мягкого отказа (используется в вычислительной технике, аналогично «отказоустойчивости» [13] ), работает на пониженном уровне производительности после отказа какого-либо компонента. Например, если отключается сетевое питание, в здании может работать освещение на пониженном уровне или лифты могут работать на пониженной скорости. В вычислительной технике, если для потоковой передачи онлайн-видео не хватает пропускной способности сети, вместо версии с высоким разрешением может транслироваться версия с более низким разрешением. Прогрессивное улучшение — еще один пример, когда веб-страницы доступны в базовом функциональном формате для старых веб-браузеров с небольшим экраном или ограниченными возможностями, но в расширенной версии для браузеров, способных обрабатывать дополнительные технологии или имеющих больший дисплей.
В отказоустойчивых компьютерных системах программы, которые считаются надежными, предназначены для продолжения работы, несмотря на ошибку, исключение или недопустимый ввод, а не для полного сбоя. Хрупкость программного обеспечения является противоположностью надежности. Устойчивые сети продолжают передавать данные, несмотря на отказ некоторых ссылок или узлов. Ожидается, что устойчивые здания и инфраструктура также предотвратят полный отказ в таких ситуациях, как землетрясения, наводнения или столкновения.
Система с высокой прозрачностью отказов будет предупреждать пользователей о том, что произошел отказ компонента, даже если он продолжает работать с полной производительностью, так что отказ может быть устранен или ожидается неминуемый полный отказ. [14] Аналогично, компонент fail-fast разработан для сообщения в первой точке отказа, а не для создания отчетов, когда выходят из строя последующие компоненты. Это позволяет легче диагностировать основную проблему и может предотвратить неправильную работу в сломанном состоянии.
Состояние единичного сбоя — это ситуация, когда одно средство защиты от опасности неисправно. Если состояние единичного сбоя неизбежно приводит к другому состоянию единичного сбоя, то два отказа считаются одним состоянием единичного сбоя. [15] Источник предлагает следующий пример:
Состояние единичного отказа – это состояние, когда неисправно одно средство защиты от опасности в оборудовании или присутствует одно внешнее ненормальное состояние, например, короткое замыкание между токоведущими частями и рабочей частью. [16]
Обеспечение отказоустойчивого дизайна для каждого компонента обычно не является вариантом. Сопутствующая избыточность влечет за собой ряд штрафов: увеличение веса, размера, энергопотребления, стоимости, а также времени на проектирование, проверку и тестирование. Поэтому необходимо рассмотреть ряд вариантов, чтобы определить, какие компоненты должны быть отказоустойчивыми: [17]
Примером компонента, который проходит все испытания, является система удержания пассажиров автомобиля. Хотя основная система удержания пассажиров обычно не рассматривается, это гравитация . Если автомобиль переворачивается или подвергается сильным перегрузкам, то этот основной метод удержания пассажиров может выйти из строя. Удержание пассажиров во время такой аварии абсолютно необходимо для безопасности, поэтому первый тест пройден. Несчастные случаи, приводящие к выбрасыванию пассажиров, были довольно распространены до появления ремней безопасности , поэтому второй тест пройден. Стоимость избыточного метода удержания, такого как ремни безопасности, довольно низкая, как с экономической точки зрения, так и с точки зрения веса и пространства, поэтому третий тест пройден. Поэтому добавление ремней безопасности во все автомобили является отличной идеей. Другие «дополнительные системы удержания», такие как подушки безопасности , стоят дороже и поэтому проходят этот тест с меньшим отрывом.
Другим прекрасным и долгосрочным примером реализации этого принципа является тормозная система: хотя фактические тормозные механизмы имеют решающее значение, они не особенно склонны к внезапному (а не прогрессирующему) отказу и в любом случае обязательно дублируются, чтобы обеспечить равномерное и сбалансированное приложение тормозного усилия ко всем колесам. Было бы также непомерно дорого дополнительно удваивать основные компоненты, и они значительно увеличили бы вес. Однако столь же критические системы для приведения в действие тормозов под контролем водителя по своей природе менее надежны, как правило, используя трос (может ржаветь, растягиваться, заклинивать, рваться) или гидравлическую жидкость (может протекать, кипеть и образовывать пузырьки, впитывать воду и, таким образом, терять эффективность). Таким образом, в большинстве современных автомобилей гидравлический тормозной контур ножного тормоза разделен по диагонали, что дает две меньшие точки отказа, потеря либо только снижает тормозную мощность на 50% и не вызывает такого опасного дисбаланса тормозного усилия, как прямое разделение спереди-назад или слева-справа, и если гидравлический контур полностью выйдет из строя (относительно очень редкое явление), есть отказоустойчивость в виде тросового стояночного тормоза, который управляет относительно слабыми задними тормозами, но все еще может безопасно остановить автомобиль в сочетании с торможением трансмиссией/двигателем, пока требования к нему соответствуют нормальному потоку движения. Совокупно маловероятное сочетание полного отказа ножного тормоза с необходимостью резкого торможения в экстренной ситуации, скорее всего, приведет к столкновению, но все равно на более низкой скорости, чем это было бы в противном случае.
По сравнению с рабочим тормозом, активируемым педалью, сам стояночный тормоз является менее важным элементом, и если он не используется в качестве одноразового резерва для ножного тормоза, не вызовет немедленной опасности, если будет обнаружено, что он не работает в момент применения. Поэтому в него как такового не встроено избыточности (и обычно он использует более дешевую, легкую, но менее износостойкую тросовую систему приведения в действие), и может быть достаточно, если это происходит на холме, использовать ножной тормоз, чтобы на мгновение удержать автомобиль неподвижно, прежде чем тронуться с места, чтобы найти ровный участок дороги, на котором можно остановиться. В качестве альтернативы, на пологих уклонах, трансмиссию можно переключить на передачу Park, Reverse или First, а блокировку трансмиссии / компрессию двигателя использовать для удержания автомобиля в неподвижном состоянии, поскольку им нет необходимости включать утонченность, чтобы сначала остановить его.
На мотоциклах аналогичный уровень отказоустойчивости обеспечивается более простыми методами; во-первых, передняя и задняя тормозные системы полностью разделены, независимо от их метода активации (который может быть тросовым, стержневым или гидравлическим), что позволяет одной полностью выйти из строя, не затрагивая другую. Во-вторых, задний тормоз относительно сильный по сравнению со своим автомобильным собратом, являясь мощным дисковым на некоторых спортивных моделях, хотя обычно предполагается, что передняя система должна обеспечивать большую часть тормозного усилия; поскольку общий вес транспортного средства более центрирован, задняя шина, как правило, больше и имеет лучшее сцепление, так что гонщик может откинуться назад, чтобы перенести на нее больший вес, тем самым позволяя применить большее тормозное усилие до того, как колесо заблокируется. На более дешевых и медленных машинах утилитарного класса, даже если переднее колесо должно использовать гидравлический диск для дополнительного тормозного усилия и более простой компоновки, заднее колесо обычно будет примитивным, несколько неэффективным, но исключительно прочным барабаном со штоковым приводом, благодаря простоте соединения педали с колесом таким образом и, что еще важнее, практически невозможности катастрофического отказа, даже если остальная часть машины, как и многие недорогие велосипеды после первых нескольких лет использования, находится на грани разрушения из-за пренебрежительного обслуживания.
Основные характеристики отказоустойчивости требуют:
Кроме того, отказоустойчивые системы характеризуются как плановыми, так и незапланированными сбоями в обслуживании. Они обычно измеряются на уровне приложений, а не только на уровне оборудования. Показатель качества называется доступностью и выражается в процентах. Например, система с пятью девятками статистически обеспечит доступность 99,999%.
Отказоустойчивые системы обычно основаны на концепции избыточности.
Исследование видов допусков, необходимых для критических систем, включает в себя большой объем междисциплинарной работы. Чем сложнее система, тем тщательнее должны быть рассмотрены и подготовлены все возможные взаимодействия. Учитывая важность систем высокой стоимости в транспорте, коммунальном хозяйстве и армии, область тем, которые затрагиваются в исследовании, очень широка: она может включать такие очевидные предметы, как моделирование и надежность программного обеспечения или проектирование оборудования , до таких загадочных элементов, как стохастические модели, теория графов , формальная или исключающая логика, параллельная обработка , удаленная передача данных и многое другое. [18]
Запасные компоненты отвечают первой основополагающей характеристике отказоустойчивости тремя способами:
Все реализации RAID , избыточного массива независимых дисков , за исключением RAID 0, являются примерами отказоустойчивого устройства хранения данных , использующего избыточность данных .
Машина с отказоустойчивостью Lockstep использует реплицированные элементы, работающие параллельно. В любой момент времени все репликации каждого элемента должны находиться в одном и том же состоянии. Для каждой репликации предоставляются одни и те же входы , и ожидаются одни и те же выходы. Выходы репликаций сравниваются с помощью схемы голосования. Машина с двумя репликациями каждого элемента называется двойной модульной избыточностью (DMR). Тогда схема голосования может обнаружить только несоответствие, а восстановление полагается на другие методы. Машина с тремя репликациями каждого элемента называется тройной модульной избыточностью (TMR). Схема голосования может определить, какая репликация ошибочна, когда наблюдается голосование два к одному. В этом случае схема голосования может вывести правильный результат и отбросить ошибочную версию. После этого внутреннее состояние ошибочной репликации предполагается отличным от состояния двух других, и схема голосования может переключиться в режим DMR. Эту модель можно применять к любому большему количеству репликаций.
Машины с отказоустойчивостью Lockstep проще всего сделать полностью синхронными , когда каждый вентиль каждой репликации делает один и тот же переход состояния на одном и том же краю часов, а часы репликаций находятся точно в фазе. Однако можно построить системы Lockstep без этого требования.
Синхронизация репликаций требует приведения их внутренних сохраненных состояний в соответствие. Они могут быть запущены из фиксированного начального состояния, например, состояния сброса. В качестве альтернативы внутреннее состояние одной реплики может быть скопировано в другую реплику.
Один из вариантов DMR — это пара-и-запасной . Два реплицированных элемента работают в паре, с избирательной схемой, которая обнаруживает любое несоответствие между их операциями и выдает сигнал, указывающий на наличие ошибки. Другая пара работает точно так же. Последняя схема выбирает выход пары, которая не объявляет об ошибке. Пара-и-запасной требует четырех реплик вместо трех, как у TMR, но она использовалась в коммерческих целях.
Вычисления, не обращающие внимания на сбои, — это метод, позволяющий компьютерным программам продолжать выполнение, несмотря на ошибки . [19] Метод может применяться в разных контекстах. Он может обрабатывать недействительные чтения памяти, возвращая программе искусственное значение, [20] которая, в свою очередь, использует искусственное значение и игнорирует предыдущее значение памяти , к которому она пыталась получить доступ, это сильно контрастирует с типичными средствами проверки памяти , которые сообщают программе об ошибке или прерывают ее выполнение.
Подход имеет издержки производительности: поскольку метод переписывает код для вставки динамических проверок на валидность адреса, время выполнения увеличится на 80–500%. [21]
Наставничество при восстановлении — это облегченная технология, позволяющая программному обеспечению восстанавливаться после ошибок, которые в противном случае были бы фатальными, таких как разыменование нулевого указателя и деление на ноль. [22] По сравнению с вычислительной техникой, забывающей об отказе, наставничество при восстановлении работает непосредственно с двоичным файлом скомпилированной программы и не требует повторной компиляции в программу.
Он использует фреймворк бинарного инструментария Just-in-Time Pin . Он присоединяется к процессу приложения при возникновении ошибки, восстанавливает выполнение, отслеживает эффекты восстановления по мере продолжения выполнения, содержит эффекты восстановления в процессе приложения и отсоединяется от процесса после того, как все эффекты восстановления сбрасываются из состояния процесса. Он не мешает нормальному выполнению программы и, следовательно, влечет за собой незначительные накладные расходы. [22] Для 17 из 18 систематически собранных реальных ошибок разыменования нуля и деления на ноль реализация прототипа позволяет приложению продолжать выполняться, чтобы предоставлять приемлемый вывод и обслуживание своим пользователям на входах, вызывающих ошибку. [22]
Шаблон проектирования выключателя — это метод, позволяющий избежать катастрофических отказов в распределенных системах.
Избыточность — это предоставление функциональных возможностей, которые были бы ненужными в безотказной среде. [23] Это может состоять из резервных компонентов, которые автоматически «включаются», если один компонент выходит из строя. Например, большие грузовые автомобили могут потерять шину без каких-либо серьезных последствий. У них много шин, и ни одна из них не является критической (за исключением передних шин, которые используются для управления, но, как правило, несут меньшую нагрузку, каждая в целом, чем остальные четыре-16, поэтому имеют меньшую вероятность выхода из строя). Идея включения избыточности для повышения надежности системы была впервые выдвинута Джоном фон Нейманом в 1950-х годах. [24]
Возможны два вида избыточности: [25] пространственная избыточность и временная избыточность. Пространственная избыточность обеспечивает дополнительные компоненты, функции или элементы данных, которые не нужны для безотказной работы. Пространственная избыточность далее классифицируется на аппаратную, программную и информационную избыточность в зависимости от типа избыточных ресурсов, добавленных в систему. При временной избыточности вычисления или передача данных повторяются, а результат сравнивается с сохраненной копией предыдущего результата. Текущая терминология для этого вида тестирования называется «тестированием отказоустойчивости в процессе эксплуатации» или сокращенно ISFTT.
Преимущества отказоустойчивой конструкции очевидны, тогда как многие ее недостатки не очевидны:
Существует разница между отказоустойчивостью и системами, которые редко имеют проблемы. Например, системы Western Electric crossbar имели частоту отказов два часа за сорок лет, и поэтому были очень отказоустойчивыми . Но когда случался отказ, они все равно полностью прекращали работу, и поэтому не были отказоустойчивыми .