За счет чего обеспечивается устойчивость установки
Базовые свойства организации: устойчивость и гибкость
Устойчивость. Развитие реальных систем немонотонно и включает не только прогрессивные направления, но и пути деградации (которые могут смениться прогрессом, а могут и привести к краху), направления разрушения. В процессе развития, состоящего из циклически повторяющихся стадий эволюции и скачка, система постоянно переходит из устойчивого состояния в неустойчивое и обратно. Структурная и функциональная устойчивость, под которой мы понимаем способность системы сохранять свои параметры в определенной области значений, позволяющей ей поддерживать качественную определенность, в том числе состава, связей и поведения (но не равновесия!), формируется в процессе адаптации системы к изменившимся в результате катастрофы внешним и внутренним условиям и сохраняется в течение большей части эволюционной стадии.
Организация — открытая система, т. е. система, постоянно стремящаяся сохранить баланс между внутренними возможностями и внешними силами окружающей среды (т. е. самостабилизирующаяся) с целью сохранения своего устойчивого состояния. Устойчивость — способность системы приходить в равновесное состояние после воздействия внутренних и внешних (окружающей среды) возмущений. Например, А. Романцов пишет: «Устойчивость промышленного предприятия — это способность системы управления обеспечивать функционирование предприятия под влиянием внешних и внутренних факторов в состоянии равновесия и возвращать его в данное состояние после незначительных отклонений».
Любое предприятие является неким структурным образованием, обладающим системными свойствами. Важнейшим признаком системы является то, что составляющие систему элементы образуют во взаимосвязи единое целое с качественно новыми свойствами. В связи с этим следует подчеркнуть, что система есть упорядоченная совокупность взаимосвязанных и взаимодействующих элементов, закономерно образующих единое целое, обладающая свойствами, отсутствующими у элементов, ее образующих. Система обладает целостностью, активностью, способна к развитию и повышению своей организованности. Любая система должна соответствовать своей среде, приспосабливаться к ней, что дает возможность говорить об устойчивой организованной системе.
В данном контексте, с одной стороны, под устойчивостью можно понимать сохранение, неизменное состояние по отношению к возмущающим воздействиям внешней и внутренней среды организации, а с другой — ее можно рассматривать как процесс, своего рода движение «вперед», в результате которого происходит развитие и совершенствование организационных структур и систем.
Основываясь на существовании взаимоотношений и взаимодействия между системами, т. е. на существовании согласованного развития систем, можно утверждать, что устойчивость организации зависит от уровня организованности системы. Устойчивости всей системы способствует то, что одна часть системы усваивает то, что было отторжено другой. Кроме того, устойчивость комплекса может обеспечиваться за счет дополнительных связей с другими системами и увеличения разнообразия данной системы. Чем разнообразнее система, тем больше шансов, что один ее разрушенный элемент может быть заменен другим.
Устойчивость организации связана с ее равновесием. «Природа при всей своей бесконечности и вечности имеет начало и конец… Устойчивость — стремление к равновесию, взаимодействие начала и конца». Другими словами, нормальным состоянием системы является состояние неравновесное. Для этого есть объективные причины. В развитие этой темы следует обратить внимание на подход К. Вальтуха, который исходит из того, что в процессе производственной деятельности человек «систематически создает из предметов, находимых в природе, такие продукты, которые либо совсем не порождаются спонтанным природным формообразованием, либо порождаются лишь сравнительно редко». По его мнению, производство представляет собой производство информации. Информация же, как мера разнообразия, формирует неопределенность, относительное неравновесие.
Для сохранения системы в меняющейся внешней среде недостаточно простого обменного равновесия. Гарантией устойчивости может служить лишь возрастание суммы активностей, когда новые неблагоприятные воздействия встречают не прежнее, а возросшее сопротивление. Разрушение системы происходит именно из-за уменьшения суммы этих активностей-сопротивлений.
Развитие организации ведет к ее дальнейшему усложнению, появлению дополнительных связей, которые приводят к более устойчивым структурным соотношениям.
В действительности имеют место не абсолютно, а относительно устойчивые состояния организации. Такие состояния не являются состояниями полного равновесия, но подобны равновесным. При таком «квазиравновесном» состоянии обмен энергией между системой и окружающей средой относительно слабый, но зато имеет место относительно большая информационная связь
Действительная практическая устойчивость системы зависит не только от количества заключенных в ней активностей-сопротивлений, но и от способа их сочетания, характера их организационных связей. Чем больше неоднородность внутренних связей в системе, тем она менее устойчива, и наоборот, с возрастанием их однородности происходит увеличение устойчивости системы. В первом случае имеющиеся структурные противоречия сохраняются, и к ним добавляются все новые и новые. Во втором случае идущее разрушение отрывает от комплекса наименее прочно связанные с ним элементы, разрывает наиболее противоречивые связи. Усложнение этих связей, рост их неоднородности снижают стройность и устойчивость всей системы.
Рано или поздно развитие системы приводит к неустойчивости и кризису, поскольку части целого становятся различны, а накопившиеся системные противоречия перевешивают силу дополнительных связей между частями и ведут к их разрыву, к общему нарушению организационного единства. Структурная устойчивость обеспечивается за счет наличия механизмов, предназначенных для того, чтобы некоторые наиболее важные характеристики системы оставались практически неизменными независимо от всевозможных внешних воздействий.
Другим фактором устойчивости структуры может служить наличие в системе так называемой структурной избыточности, т. е. возможности дублирования существенных элементов системы. Такая избыточность позволяет не нарушать функционирование системы при неблагоприятных внешних воздействиях, а значит, и сохранить устойчивость структуры. Однако у такого сохранения существует предел. Если условия внешней среды выходят за те границы, в которых система с данной структурой устойчиво функционирует, то вначале наступает нарушение основных функций, а затем и структуры в целом. Во избежание такой ситуации системы могут компенсировать неблагоприятные возмущения при помощи большого числа их разновидностей, более широких границ изменений каждого возмущения и оперативности во времени.
Следует подчеркнуть, что устойчивость системы является следствием разрешения кризиса. Кризис любой системы представляет собой переход от одного этапа развития к другому, из одного качественного состояния в другое со своей критической точкой. Причиной любого кризиса является разрушение какой-либо внутренней связи, приводящее к потере устойчивости того равновесия, в котором находилась система.
Результатом любого кризиса всегда является либо преобразование системы, либо ее распад. Если система не разрушается, а развивается далее, то устранение противоречий достигается установлением связей между разошедшимися частями системы. В результате такого структурного преобразования комплекса возникает организационный комплекс, приспособленный к среде и соответствующий ей.
Однако не всякая система может успешно пройти этот путь самостоятельно, порой его результатом является признание экономической системы (организации) несостоятельной, что влечет ее ликвидацию. Поэтому меры, направленные на поддержание устойчивости функционирования организации, можно рассматривать в качестве антикризисных. Обеспечивать устойчивость функционирования системы должна система управления изменениями.
Гибкость. Понятию «гибкость» сопутствуют следующие основные признаки: воздействие на систему, изменение свойств или поведения системы, включая адаптацию, и наличие пределов изменения. Совокупность этих признаков позволяет дать субстанциональное определение гибкости.
Гибкость — способность системы, подвергнутой определенному воздействию, нормативно или адаптивно изменять свое состояние и (или) поведение в пределах, обусловленных критическими значениями параметров системы.
Организационный процесс должен обладать гибкостью, т. е. способностью к оперативным изменениям в ходе своего осуществления. С учетом этого выделяют гибкость ориентации процесса и гибкость его реализации. Таким образом, в данном случае гибкость рассматривается как один из важнейших инструментов процессуализации организации.
Свойство гибкости в организации как системе обеспечивается многими факторами, среди которых следует выделить:
◦ принципы построения организационных структур;
◦ технологическую (производственную) гибкость, которая оценивает технологию производства, определяет, насколько быстро можно перестроиться на выпуск новой продукции;
◦ уровень квалификации работников;
◦ современные средства коммуникации;
◦ характер производственных отношений, включая стиль руководства, организационную культуру, психологический климат в коллективе, наличие неформальных групп и т. д.
Экономические признаки гибкости. На страте экономических факторов рассматривается эластичность, гибкость производства, определяемая природой хозяйственного механизма. Значение исследований экономических признаков гибкости в условиях полного хозяйственного расчета и самофинансирования возрастает. Приведем сформулированные В. Немчиновым признаки гибкости, которые связаны с предпосылками приближения цен к стоимости:
◦ совпадение производства и потребления в целом и по отдельным продуктам;
◦ пропорциональное развитие отдельных производств;
◦ покрытие друг другом спроса и предложения.
Содержание понятия гибкости на экономической страте определяет возможности вовлечения в производство дополнительных ресурсов, изменения функций производственной системы, а также ее структуры. Вовлечение в производство дополнительных ресурсов, например дополнительного оборудования, создание новых мощностей не всегда оправдано. Поэтому возрастает экономическое значение использования фиксированных ресурсов производства, обеспечивающих его гибкость по отношению к выявленному платежеспособному спросу. Такую ситуацию можно обеспечить определенным запасом гибкости, который выражается в функциональных возможностях производственной системы.
Функциональные признаки гибкости. Одним из первых признаков, относящихся к функциональной гибкости производственных систем, следует назвать универсальность. Она обеспечивается соответствующей структурой ГПС и тем набором технологических операций, которые заложены в систему. Кроме того, в многомашинной системе универсальность определяется набором различных последовательностей операций. Предположим, что в системах 1 и 2 могут выполняться три вида операций: А, В, С. Система 1 может производить операции только в технологической последовательности АВС, а система 2 способна производить операции в технологических последовательностях АВС, ВСА, САВ, ВАС. Таким образом, можно утверждать, что система 2 более гибкая, чем система 1, а производственная гибкость определяется не только набором всех операций, но и набором их последовательностей. Универсальность как составляющая функциональной гибкости имеет пределы, обусловленные физическими возможностями системы.
Существенным признаком функциональной гибкости является адаптивность управления, которая обеспечивает выполнение технологической операции по заданной программе в условиях неполной априорной информации об управляемом процессе, а также работу системы в условиях изменения самой программы, причем когда стратегия изменения программы заранее неизвестна. Этот признак обеспечивается возможностями управляющих вычислительных машин, средствами автоматики и др.
Необходимо выделить и такой важный функциональный признак, как способность оптимизировать производственный процесс, в том числе и в случае непредвиденных ситуаций. Этот признак обеспечивается математическим моделированием. Поскольку в практике чаще всего встречаются стохастические задачи, одним из основных средств их решения для ГПС могут быть методы теории массового обслуживания.
Структурные признаки гибкости. Структурная гибкость предполагает также перестройки, которые затрагивают технологическую компоновку и конструктивные связи всей системы или ее отдельных элементов. К ним, в частности, относятся:
◦ переналадка для обработки новой детали в пределах заданной номенклатуры;
◦ перестройка для выпуска новой продукции;
◦ перестройка в случае непредвиденных ситуаций, например при выходе из строя части оборудования.
Такие перестройки сопровождаются сменой оснастки, изменением количества оборудования, занятого в технологическом процессе, изменением его компоновки, сменой видов производственных механизмов.
Характерными структурными признаками ГПС являются модульность оборудования, разветвленность транспортных коммуникаций, резервирование оборудования.
Инженерная надежность и отказоустойчивость распределенной системы
Это гостевая публикация от Пэдди Байерса (Paddy Byers), сооснователя и технического директора Ably — платформы для стриминга данных в реальном времени. Оригинал статьи опубликован в блоге Ably.
Люди хотят быть уверены в надежности используемого сервиса. Однако в реальности отдельные компоненты неизбежно отказывают, и у нас должна быть возможность продолжать работу, несмотря на это.
В этой статье мы подробно рассмотрим концепции надежности и отказоустойчивости, которые стали определяющими при разработке платформы Ably.
Для начала дадим несколько определений:
Надежность — cтепень того, насколько пользователи могут положиться на продукт или сервис для решения своих задач. Доступность и устойчивость являются видами надежности.
Доступность — степень готовности продукта или сервиса к эксплуатации по требованию. Это понятие часто сcодят к обеспечению необходимого излишка ресурсов с учетом статистически независимых отказов.
Устойчивость — cпособность продукта или сервиса соответствовать заявленным характеристикам в процессе использования. Это значит, что система не просто готова к эксплуатации: благодаря дополнительным мощностям, предусмотренным в ходе проектирования, она может продолжать работать под нагрузкой, как и ожидают пользователи.
Отказоустойчивость — способность системы сохранять надежность (доступность и устойчивость) при отказе отдельных компонентов или сбоях в подсистемах.
Отказоустойчивые системы спроектированы таким образом, чтобы смягчать воздействие неблагоприятных факторов и оставаться надежными для конечного пользователя. Методы обеспечения отказоустойчивости могут использоваться для улучшения доступности и устойчивости.
Понятие доступности в широком смысле можно трактовать как гарантию безотказной работы в течение определенного времени. В свою очередь, устойчивость определяет качество этой работы, то есть гарантирует максимально эффективное сохранение функциональности и возможности взаимодействовать с пользователем в неблагоприятных условиях.
Если сервис не способен безотказно работать по требованию, значит, ему не хватает доступности. А если он готов к работе, но при этом отклоняется от заявленных характеристик в процессе использования, значит, не хватает устойчивости. Методы проектирования отказоустойчивых систем направлены на устранение этих недостатков и обеспечение бесперебойной работы системы как для бизнеса, так и для отдельных пользователей.
Доступность, устойчивость и состояние компонентов системы
Чаще всего в основе методов проектирования отказоустойчивых систем лежит понятие избыточности, подразумевающее наличие большего числа компонентов или мощностей, чем необходимо для работы сервиса. Ключевые вопросы здесь — какой вид избыточности выбрать и как ею управлять.
В физическом мире традиционно различают:
ситуации, угрожающие доступности, когда можно остановить и затем возобновить работу сервиса — например, остановить автомобиль, чтобы сменить покрышку;
ситуации, угрожающие устойчивости, когда бесперебойная работа сервиса является жизненно важной и обеспечивается постоянным использованием резервных компонентов — как, например, в случае с авиационными двигателями.
Разные требования к обеспечению бесперебойной работы определяют способ удовлетворения потребности в дополнительных мощностях.
В контексте распределенных систем, таких как Ably, существует аналогичное различие между компонентами, работающими с сохранением состояния и без сохранения состояния.
Компоненты, работающие без сохранения состояния, выполняют свои функции без привязки к долгоживущему состоянию. Каждое обращение к сервису выполняется независимо от предыдущих. Добиться отказоустойчивости таких компонентов сравнительно просто: нужно обеспечить доступность необходимых ресурсов, чтобы обращение к сервису выполнялось даже в условиях отказа некоторых из них.
Компоненты, работающие с сохранением состояния, непосредственно зависят от текущего состояния сервиса. Именно оно обеспечивает связь между текущим, прошлым и будущим обращениями. Для таких компонентов, как авиационные двигатели, смысл отказоустойчивости заключается в обеспечении бесперебойной работы, то есть в поддержании требуемого состояния сервиса. Это гарантирует их устойчивость.
Далее мы приведем примеры для каждой из описанных ситуаций и расскажем об инженерных задачах, которые приходится решать, чтобы обеспечить отказоустойчивость на практике.
Отказы неизбежны и естественны
В проектировании отказоустойчивых систем отказы воспринимаются как штатная ситуация. Нужно понимать, что в крупномасштабных системах они рано или поздно случаются. Отказы отдельных компонентов следует воспринимать как неизбежность и всегда быть к ним готовыми.
В отличие от физического мира, отказы в цифровых системах обычно не определяются двумя состояниями. Обычные показатели устойчивости компонентов (например, среднее время безотказной работы) к таким системам не применимы. Сервисы выходят из строя постепенно, после нескольких сбоев. Классический пример здесь — задача византийских генералов.
Предположим, что один из компонентов системы начал работать с перебоями и выдавать неверный результат. Или внешние партнеры не сообщали вам об отказе, пока ситуация не стала серьезной, и это сильно осложнило вашу работу.
Обеспечение устойчивости к таким отказам требует тщательного анализа, инженерного искусства и иногда человеческого участия. Каждую потенциальную неполадку необходимо выявить, классифицировать, а затем обеспечить возможность для ее скорейшего устранения или предотвратить ее с помощью масштабного тестирования и разумных проектных решений. Основная сложность при проектировании отказоустойчивых систем состоит в том, чтобы определить природу неполадок, понять, как их отследить и ликвидировать (особенно если отказы носят частичный или периодический характер), и в конечном счете сделать работу сервиса бесперебойной и максимально эффективной.
Сервисы без сохранения состояния
Сервисные слои без сохранения состояния не нуждаются в бесперебойной работе отдельных компонентов. Доступность ресурсов напрямую связана с доступностью всего слоя. Доступ к дополнительным ресурсам, отказы которых статистически не зависят друг от друга, — ключ к поддержанию работы системы. По возможности слои проектируются без сохранения состояния — это главный фактор для обеспечения не только доступности, но и масштабируемости.
Таким объектам достаточно иметь несколько независимо доступных компонентов, чтобы сервис продолжал работать. Без привязки к состоянию устойчивость отдельных составляющих не имеет значения.
Однако простого наличия дополнительных ресурсов недостаточно — их нужно эффективно использовать. Необходимо иметь возможность определять их доступность и распределять между ними нагрузку.
Таким образом, надо задать себе следующие вопросы:
Как сохранить работоспособность системы после разных типов отказов?
Какой уровень избыточности возможно обеспечить?
Какие ресурсы и показатели производительности необходимы, чтобы его поддерживать?
Каких эксплуатационных расходов требует управление этим уровнем избыточности?
Выбранное решение должно удовлетворять следующим критериям:
Требования клиентов к высокой доступности сервиса
Уровень эксплуатационных расходов для бизнеса
Дополнительные компоненты и отношения между ними необходимо проектировать, настраивать и эксплуатировать таким образом, чтобы все отказы были статистически независимыми. Согласно простым расчетам, при увеличении уровня избыточности вероятность катастрофического отказа уменьшается по экспоненте. Если сбои возникают статистически независимо друг от друга, они не имеют накопительного эффекта и вероятность полного отказа системы на порядок снижается с добавлением каждого дополнительного ресурса.
Чтобы увеличить степень статистической независимости отказов в Ably, мы распределили мощности по множественным зонам доступности в разных регионах. Оказывать услуги из нескольких зон доступности в одном регионе проще — AWS делает это практически без усилий. Зоны доступности в целом хорошо позволяют поддерживать независимость отказов, но их создание само по себе предполагает обеспечение необходимой избыточности для поддержания высокого уровня доступности.
Однако это еще не все. Мы не можем полностью положиться на один регион — иногда несколько зон доступности отказывают одновременно или все они становятся недоступными из-за локальных проблем со связью. А иногда региональные ограничения мощности делают поддержку сервисов невозможной. Поэтому мы обеспечиваем доступность нашего сервиса, предоставляя его из множества регионов. Это лучший способ гарантировать статистическую независимость отказов.
Обеспечение избыточности сразу для нескольких регионов работает не так хорошо, как поддержка множества зон доступности. Например, нет смысла распределять запросы между регионами с помощью балансировщика нагрузки, поскольку он сам находится в конкретном регионе и может стать недоступным.
Вместо этого мы используем комплекс мер, чтобы всегда направлять запросы клиентов туда, где все исправно работает и сервис доступен. Как правило, это ближайший регион, но если он недоступен, их можно перенаправить и дальше.
Сервисы с сохранением состояния
В Ably устойчивость определяется бесперебойной работой сервисов с сохранением состояния, и добиться этого намного сложнее, чем просто обеспечить доступность.
Работа таких сервисов напрямую зависит от конкретного состояния, которое устанавливается при каждом обращении к ним. Стабильность этих состояний обеспечивает корректную работу сервиса на уровне целого слоя. Это значит, что отказоустойчивости сервисов без сохранения состояния можно добиться, применяя к ним стандартные категории устойчивости. Чтобы не потерять текущие состояния в случае отказа, необходимо обеспечить постоянный уровень избыточности. Выявление и исправление дефектов позволяет устранить возможность возникновения византийских отказов с помощью механизмов достижения консенсуса.
Самая простая аналогия здесь — полет на самолете. Если он упадет, это будет катастрофой, потому что вы в своем текущем состоянии находитесь в этом конкретном самолете. Так что именно от него вы ожидаете бесперебойной работы. В случае отказа состояние будет потеряно, и вы не сможете пересесть в другой самолет.
Когда работа сервиса зависит от состояния, при переключении на запасной ресурс он должен иметь возможность начать с того же места, где закончил. Поддержание текущего состояния становится необходимостью, и в этом случае одной доступности недостаточно.
В Ably мы предоставляем достаточно резервных мощностей для ресурсов без сохранения состояния, чтобы удовлетворить требования клиентов к доступности. Однако объектам с сохранением состояния необходимы не только дополнительные ресурсы, но и четкие инструкции по их использованию, чтобы обеспечить гарантированную функциональную бесперебойность сервиса.
Например, если обработка информации для определенного канала ведется на определенном инстансе, входящем в кластер, то в случае отказа этого инстанса (что приведет к изменению роли канала) для продолжения работы понадобятся дополнительные механизмы.
Они действуют на нескольких уровнях. На первом из них задача такого механизма — гарантировать, что для обработки информации канала будет назначен другой, исправный ресурс. На следующем уровне необходимо убедиться, что новый ресурс продолжил работу с той же точки, где она была прервана. Далее каждый из упомянутых механизмов работает с определенным уровнем избыточности, чтобы обеспечить соблюдение общих требований к сервису.
Эффективность механизмов обеспечения бесперебойной работы напрямую влияет на поведение сервиса и контроль этого поведения в рамках предоставления услуги. Возьмем конкретную проблему из приведенного выше сценария: в случае с каждым отправленным сообщением вам необходимо точно знать, завершена его обработка или нет.
Когда клиент отправляет сообщение в Ably, сервис принимает его и уведомляет, была попытка публикации успешной или нет. В этом случае главный вопрос в контексте обеспечения доступности будет таким:
«В течение какой доли времени сервис может принимать (и обрабатывать) сообщения, а не отклонять их?»
Минимальный целевой показатель доступности для нас — 99,99; 99,999 или даже 99,9999 %.
Если вы попытались опубликовать сообщение и мы уведомили вас, что попытка не удалась, это говорит о нехватке доступности. Это плохо, но, по крайней мере, вы в курсе ситуации.
А вот если мы ответили: «Да, мы получили ваше сообщение», но не смогли выполнить последующую обработку, это уже другой тип отказа, связанный с невозможностью обеспечить гарантированный функционал сервиса. Это нехватка устойчивости, которая является для распределенных систем намного более серьезной проблемой. Ее решение требует масштабных и сложных инженерно-технических работ.
Архитектурный подход к обеспечению устойчивости
Следующие две иллюстрации наглядно демонстрируют архитектурный подход, который мы внедрили в Ably для оптимального использования избыточности при обработке сообщений.
Размещение роли с сохранением состояния
Обычно горизонтальное масштабирование достигается путем распределения задач в масштабируемом кластере вычислительных ресурсов. Сущности, работающие без сохранения состояния, можно распределить среди доступных ресурсов с некоторыми ограничениями: место выполнения каждой назначенной операции должно определяться с учетом балансировки нагрузки, близости расположения и других соображений оптимизации.
В случае с операциями, которые выполняются с сохранением состояния, этот фактор необходимо учитывать при размещении ролей — например, определить для всех сущностей, задействованных в обработке данных, конкретное местоположение каждой назначенной роли.
Конкретный пример — обработка сообщений, передаваемых по каналу. Когда канал активен, для него назначается ресурс, который выполняет эту операцию. Поскольку этот процесс выполняется с сохранением состояния, мы можем добиться хорошей производительности: мы достаточно знаем о сообщении во время его обработки, так что нам нет необходимости просматривать его — остается просто отправить.
Чтобы как можно более равномерно распределить каналы по доступным ресурсам, мы используем последовательное хеширование. При этом соответствующая служба обзора кластеров обеспечивает согласование между такими параметрами, как работоспособность узлов и их членство в хеш-кольце.
Это становится возможным благодаря последовательному алгоритму размещения в хеш-кольце
Механизм размещения позволяет определить не только первоначальное расположение роли, но и место, куда она переместится в результате таких событий, как отказ узла. Таким образом, динамический механизм размещения ролей играет ключевую роль в обеспечении устойчивости и бесперебойной работы сервиса.
Выявить, хешировать, продолжить
Первый шаг к уменьшению риска отказов — выявление неполадок. Как было сказано выше, это обычно вызывает затруднения, потому что требует почти мгновенного согласования между распределенными сущностями. Как только сбой обнаружен, состояние хеш-кольца обновляется и определяет новое расположение для отказавшего ресурса, где он продолжит работу с тем же каналом и в том же состоянии.
Даже если роль не была выполнена и произошла потеря состояния, нужно обеспечить его поддержку (с необходимой избыточностью), чтобы восстановить непрерывное выполнение роли. Именно эта непрерывность позволяет сервису сохранять устойчивость к отказам такого рода. Состояние всех сообщений в очереди сохраняется во время перемещения роли. Если вместо этого у нас получилось просто переназначить роль, сохранив состояние, значит, мы обеспечили доступность сервиса — но не его устойчивость.
Слой обеспечения постоянства канала
Когда сообщение опубликовано, мы обрабатываем его, определяем, была ли попытка публикации успешной, а затем отвечаем на запрос к сервису. Гарантированная устойчивость в этом случае означает уверенность в том, что, как только сообщение принято, все последующие операции по пересылке будут выполнены по умолчанию. В свою очередь, это значит, что мы подтверждаем публикацию сообщения, только когда уверены, что оно сохранено с обеспечением постоянства, с применением необходимой избыточности и не будет утеряно.
Во-первых, данные о приеме сообщения записываются как минимум в двух разных зонах доступности. Во-вторых, к этим зонам доступности предъявляются те же требования избыточности при последующем процессе обработки данных. Это главный принцип работы слоя обеспечения постоянства в Ably: мы записываем сообщение в нескольких местах и следим за тем, чтобы процесс записи был транзакционным. Мы прекращаем его, только убедившись, что попытка записи была неудачной или однозначно успешной. Зная это, мы можем быть уверены, что дальнейшая обработка будет произведена даже при отказе ролей, ответственных за этот процесс.
Тот факт, что сообщение сохранено в нескольких зонах доступности, позволяет предположить, что отдельные независимые отказы в них не приведут к потере данных. Для подобного размещения необходима координация между зонами доступности. А уверенность в том, что запись данных в нескольких местах действительно является транзакционной, требует достижения распределенного консенсуса на всем слое обеспечения постоянства при обработке сообщений.
Благодаря нашей математической модели при отказе узла мы точно знаем, сколько времени уйдет на выявление причины сбоя, достижение консенсуса и последующего перемещения роли. Эти данные вкупе с частотой отказов для каждой зоны доступности позволяют создать вероятностную модель возникновения комплексного сбоя, который может привести к потере текущего состояния сервиса. Описанные базовые принципы позволяют нам гарантировать устойчивость работы сервиса с вероятностью 99,999 999 %.
Вопросы внедрения отказоустойчивости
Даже если у вас есть теоретическое представление о том, как добиться определенного уровня отказоустойчивости, существует несколько практических и инженерных вопросов, которые необходимо рассматривать в контексте всей системы. Ниже мы приводим несколько примеров. Чтобы узнать больше по этой теме, прочитайте нашу статью Подводные камни масштабирования распределенных систем: проектирование системы в реальных условиях.
Достижение консенсуса в глобально распределенных системах
Описанные выше механизмы, такие как алгоритм размещения ролей, могут быть эффективными только в том случае, если все участвующие в них сущности находятся в согласии по поводу топологии кластера, а также статуса и работоспособности каждого узла.
Это классическая проблема достижения консенсуса: члены кластера, каждый из которых сам может пережить отказ, должны договориться о статусе одного из них. Протоколы достижения консенсуса, такие как Raft или Paxos, широко известны и имеют прочную теоретическую базу. Однако на практике в них существует ряд ограничений, касающихся масштабирования и ширины канала связи. В частности, они не эффективны в сетях, которые охватывают множество регионов, потому что их производительность падает, как только задержка при передаче данных между одноранговыми узлами становится слишком большой.
Поэтому наши одноранговые узлы используют протокол Gossip: он отказоустойчив, способен к работе в нескольких регионах и позволяет достичь согласования по прошествии некоторого времени. Gossip позволяет распространять между регионами данные о топологии сети и создает ее карту. Достигнутый таким образом консенсус об общем состоянии используется в качестве основы для распространения данных на уровне всего кластера.
Работоспособность не определяется двумя состояниями
Классическая теория, которая легла в основу разработки протоколов Paxos и Raft, базируется на том, что при отказе или проблемах с работоспособностью сущности не просто сбоят или перестают отвечать на запросы. Вместо этого они могут выдавать отдельные симптомы неполадок, такие как отклонение запросов, высокий процент ошибок или в целом нестабильное и некорректное поведение (см. Задача византийских генералов). Эта проблема стоит очень остро и касается даже взаимодействия клиентов с сервисом.
Когда клиент пытается подключиться к конечной точке в том или ином регионе, может оказаться, что этот регион недоступен. При полном отсутствии доступа мы понимаем, что это простой отказ, можем выявить его и перенаправить клиента в другую точку инфраструктуры. Но на практике такой регион может просто демонстрировать частичное ухудшение качества работы в отдельные моменты времени. Таким образом, клиент не сможет решить проблему самостоятельно. Для этого ему нужно знать, куда его перенаправили и когда он сможет повторить попытку воспользоваться сервисом с предыдущей конечной точки.
Это еще один пример общей проблемы обеспечения отказоустойчивости распределенных систем: в них множество подвижных элементов, каждый из которых создает добавочную сложность. Если один из них выйдет из строя или его статус изменится, как достигнуть консенсуса по поводу наличия изменений, их природы и последующего плана действий?
Проблема доступности ресурсов
Говоря простым языком, она заключается в том, что обеспечить избыточные мощности можно только при условии доступности ресурсов. Периодически возникают ситуации, когда конкретный регион не может получить доступ к необходимым ресурсам и приходится перенаправлять запрос в другой регион.
Однако иногда проблема становится более сложной — когда вы понимаете, что механизмы обеспечения отказоустойчивости сами по себе требуют привлечения дополнительных ресурсов.
Например, это может быть механизм перемещения ролей из-за изменения топологии. В его работе задействуются такие ресурсы, как мощности процессора и оперативная память затрагиваемых инстансов.
Но что если отказ произошел как раз из-за нехватки ресурсов процессора или памяти? Вы пытаетесь решить проблему, но для этого нужны процессор и память! Таким образом, есть множество областей, в которых необходимо иметь достаточный запас дополнительных ресурсов, чтобы вовремя принимать меры противодействия отказам.
Проблема масштабирования ресурсов
Добавим к сказанному выше, что проблема может возникнуть не только с доступностью ресурсов, но и вследствие частоты запросов на их масштабирование. В стабильной, работоспособной системе у вас может быть N каналов, N подключений, N сообщений и N мощностей для их обработки. Теперь представим, что произошел отказ, который привел к сбою в работе кластера из N инстансов. Если объем работ, необходимых для компенсации сбоя, составляет N², то затраты на поддержку резервных мощностей примут и вовсе неподъемный объем, так что единственным возможным решением станет переключение на другой регион или кластер.
Тривиальные механизмы обеспечения отказоустойчивости могут демонстрировать сложность O(N²) или даже хуже, и это необходимо учитывать при поиске решения проблемы. Это еще одно напоминание о том, что отказ может произойти не только в результате поломки — его причиной может стать слишком большой масштаб, сложность инфраструктуры и другие факторы нерационального использования ресурсов.
Заключение
Отказоустойчивость — это подход к созданию системы, позволяющий ей выдерживать и минимизировать влияние неблагоприятных событий и условий эксплуатации, неизменно обеспечивая уровень обслуживания, ожидаемый пользователями.
Говоря об инжиниринге надежности в физическом мире, мы, как правило, разделяем понятия доступности и устойчивости. Существуют широко известные методы достижения этих состояний посредством обеспечения отказоустойчивости и избыточности. В Ably мы используем аналогичные определения компонентов системы, выделяя те, что работают без сохранения состояния и с сохранением состояния.
Отказоустойчивость компонентов, работающих без сохранения состояния, достигается так же, как доступность в физическом мире — путем обеспечения дополнительных ресурсов, отказы которых статистически независимы друг от друга. Отказоустойчивость компонентов, работающих с сохранением состояния, можно сравнить с устойчивостью: она определяется поддержанием бесперебойной работы сервиса. Непрерывность состояния — важнейший параметр отказоустойчивости, поскольку от него зависит корректная и бесперебойная работа сервиса.
Для достижения отказоустойчивости системные отказы следует воспринимать как рутинные и ожидаемые события, а не как что-то необычное. В отличие от теоретических моделей, использующих бинарную концепцию «успешная работа — отказ», работоспособность реальной системы не определяется этими двумя состояниями и требует комплексного подхода к отказоустойчивости, сочетающего теоретические знания и практические навыки.
Сервис Ably включает множество слоев, на каждом из которых применяется целый ряд механизмов обеспечения отказоустойчивости. Перечень инженерных проблем, с которыми мы столкнулись, включал в числе прочего размещение ролей с сохранением состояния, выявление отказов, хеширование и возможность постепенного восстановления сервиса. Мы также гарантируем непрерывность работы сервиса на слое обеспечения постоянства: например, то, что дальнейшая обработка сообщения будет продолжена, после того как мы подтвердили его получение.
Практическое проектирование отказоустойчивых систем подразумевает решение ряда реальных инженерных проблем. Среди них проблемы доступности и масштабирования инфраструктуры, достижение консенсуса и координация постоянно меняющейся топологии кластеров и узлов глобально распределенной системы, неожиданные и трудноопределяемые сбои в работе каждой сущности.
Разрабатывая платформу Ably с учетом описанных здесь принципов, мы стремились создать лучшее в своем классе корпоративное решение. Поэтому сейчас мы можем обеспечить клиентам гарантированно высокий уровень обслуживания благодаря доступности, устойчивости, надежности и отказоустойчивости нашего сервиса.
Перевод материала подготовлен в рамках курса «Highload Architect». Всех желающих приглашаем на день открытых дверей онлайн, где вы сможете узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса. Регистрация здесь
