Разработчик Гуннар Морлинг в 2022 году представил пирамиду ревью кода. По аналогии с ней появилась пирамида отказоустойчивости системы. Она делит отказоустойчивость на уровни и предлагает ответить на ряд важных вопросов по каждому из уровней. Пирамида отказоустойчивости системы помогает лучше понимать и реализовывать эту концепцию. 

Пирамида отказоустойчивости системы (CodeReliant.io)
Пирамида отказоустойчивости системы (CodeReliant.io)

Инфраструктура

В основе пирамиды лежит инфраструктура. В неё входят физические аппаратные средства, на которых работают системы. А также серверы, сети, центры обработки данных, системы электропитания и многое другое. Какие резервы встроены в вашу инфраструктуру? Инвестиции в избыточную инфраструктуру могут уменьшить количество точек отказа и повысить отказоустойчивость.

Ниже приведены примеры вопросов, которые могут задавать себе инженеры:

  • Имеет ли система достаточную избыточность ?

  • Существует ли стратегия резервного копирования?

  • Насколько устойчива настройка сети к сбоям?

  • Есть ли единые точки отказа в настройке инфраструктуры?

  • Что произойдет, если на центр обработки данных или облачный регион обрушится торнадо?

Проектирование системы

В программной инженерии проектирование системы связано с высокоуровневой архитектурой и структурой программы. Как правило, это компромисс между функциональностью и удовлетворением нефункциональных требований.

Некоторые ключевые аспекты проектирования системы:

  • Архитектура — это общие компоненты системы и их взаимодействие. Архитектура может быть распределённая или монолитная, может содержать модель клиент-сервер, микросервисы и т.д.

  • Разделение — разбиение системы на модули и компоненты. Это то, как делятся обязанности и функциональность.

  • Интерфейсы — это то, как компоненты общаются и взаимодействуют друг с другом через API, вызовы функций, протоколы и т. д.

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

  • Безопасность — существуют ли механизмы контроля доступа, шифрования, обфускации, аудита и т.д.

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

  • Производительность — оптимизация скорости, отклика и эффективности.

  • Ремонтопригодность. Позволяет ли проект вносить обновления и изменения без серьезных сбоев/изменений в сервисе.

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

Данные

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

Ниже приведен список таких вопросов. На них надо ответить, прежде чем вы приступите к написанию отказоустойчивого программного обеспечения:

  • Должны ли данные реплицироваться в нескольких местах: хосты, регионы, облака?

  • Существуют ли механизмы для обеспечения атомарности и согласованности транзакций?

  • Как система разрешает конфликты?

  • Какие меры безопасности существуют для защиты целостности данных?

  • Есть ли риск потери данных?

  • Какую технологию баз данных мы должны использовать? (вопрос на 1 миллион долларов)

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

Базовые возможности отказоустойчивости закладываются на уровне проектирования системы. Но многие компании не могут позволить себе включить эти механизмы в свою архитектуру. Если не делать это заранее, то в будущем могут возникнуть проблемы с надежностью системы.

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

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

Вопросы:

  • Какие сбои или неисправности наиболее вероятны?

  • Как мы можем создать избыточность в системе? Например: дублировать серверы, создавать резервы, делать развертывание в нескольких регионах.

  • Как будет деградировать система при перегрузке?

  • Можем ли мы отказаться от второстепенной работы?

  • Как система будет реагировать на сбои компонентов? Нужны ли нам проверки работоспособности и автоматический перезапуск?

  • Какая автоматическая отказоустойчивость необходима? Насколько она должна быть активной?

  • Как мы можем изолировать сбои и не дать им превратиться в каскадные сбои между компонентами?

  • Какие запасные варианты/значения мы можем реализовать в случае сбоя частей системы?

  • Как мы можем реализовать повторные попытки/отсрочку для временных ошибок?

  • Должны ли мы установить сроки, чтобы избежать ненужной работы?

  • Как будет защищена целостность системы, если поврежденный компонент необходимо отключить?

  • Как можно вносить системные изменения и обновления без простоев?

Тесты и наблюдаемость

Этот уровень связан с двумя вопросами:

  • Как вы проверяете устойчивость?

  • Как быстро можно выявить и устранить проблемы?

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

  • Всестороннее тестирование на разных уровнях подтверждает надежность; например, модульное, интеграционное, e2e и функциональное тестирование снижают подверженность ошибкам.

  • Тестирование производительности и нагрузочное тестирование могут помочь выявить узкие места.

  • Хаос-инженеринг — целенаправленные сбои для проверки отказоустойчивости и проверки гипотез об отказоустойчивости системы.

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

Подход Obeservability позволяет отслеживать основные системные показатели, объединять данные журналов и отслеживать индикаторы работоспособности компонентов. Сопоставление метрик и логов позволяет быстро анализировать основные причины проблем. Для обзора показателей надежности и оценки состояния системы используются дашборды. 

Заключение

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


Если вас интересуют SRE-практики, приходите на курс SRE: data-driven подход к управлению надежностью систем. Это курс для опытных инженеров эксплуатации и разработчиков, который помогает освоить SRE-подход и внедрить его в своей компании. Вы научитесь:

  • выбирать и мониторить SRE-метрики (SLO, SLI, error budget) для своего сервиса.

  • реализовывать мониторинг, опознавать и решать проблемы с инфраструктурой;

  • настраивать alerting и healthcheck;

  • использовать разные методы деплоймента, разбираться в инструментах для этого.

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

Старт потока — 22 августа.

Ознакомиться с программой и оставить заявку можно ???? на нашем сайте.

Комментарии (0)