сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Архитектура

Отказоустойчивость

Отказоустойчивость

«Система должна быть надёжной» - требование, под которое нельзя ни спроектировать, ни принять работу. Надёжной насколько? Доступность 99,9 процента - это 8,8 часа простоя в год, и по договору всё честно. Четыре девятки - уже 53 минуты в год, и стоит это в разы дороже.

Стержень: отказ не гипотеза, а расписание. Вопрос в том, что система делает во время отказа и за сколько возвращается. Оба ответа - бизнес-решения, оформленные числом.

// Формулировки: «что такое деградация?», «внешний сервис недоступен», «что значат RPO и RTO?»

Девятки в часах

Проценты доступности ничего не значат, пока их не перевести во время. В году 8760 часов. 99 процентов - это 87,6 часа простоя, трое с половиной суток. 99,9 - 8,8 часа. 99,99 - 53 минуты. 99,999 - около пяти минут в год, и такое обещают единицы.

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

// И сразу уточняют, что считается простоем и на каком окне. «Не оформляется заказ» и «медленно грузится карточка» - разные события с разной ценой; месячное окно и годовое дают разный запас на один инцидент.

Деградация вместо отказа

Упал сервис рекомендаций. Вариант первый: страница товара не открывается совсем. Вариант второй: открывается без блока «похожие товары», человек спокойно покупает. Разница между вариантами - одна строчка в требованиях, написанная заранее.

Работа аналитика тут предельно конкретная: разделить функции на критичные и второстепенные и для каждой второстепенной описать, что видит пользователь, когда её нет. Не опишешь - решение примет разработчик прямо во время инцидента, и это будет ошибка на весь экран.

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

деградация
осознанный отказ от второстепенных функций ради сохранения главного сценария

Как медленный сосед укладывает тебя

У сервиса пул на 200 одновременных обработчиков. Обычно сосед отвечает за 50 миллисекунд, приходит 100 запросов в секунду - занято около пяти обработчиков, запас огромный. Сосед начал отвечать за 30 секунд. Теперь каждый запрос держит обработчик тридцать секунд, приходит их сотня в секунду - пул кончается через две секунды. Дальше твой сервис не отвечает никому, включая тех, кому сосед вообще не нужен. Это каскадный отказ.

Таймаут превращает зависание в обычную ошибку, на которую можно ответить. Поставили две секунды - одновременно занято 100 умножить на 2, то есть 200 обработчиков, ровно весь пул. Значит нужен ещё и лимит на число параллельных вызовов соседа, скажем 50, а остальным сразу отдавать деградацию.

// Размыкатель цепи добавляет памяти: увидел подряд серию ошибок - перестал звонить соседу на минуту и сразу отдаёт запасной ответ. Соседу дают отдышаться, свой пул цел, пользователь видит понятное сообщение вместо тридцатисекундного ожидания.

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

RPO, RTO и учения

Два числа, которые заказывает бизнес. RPO (recovery point objective) - какой объём данных не жалко потерять, выраженный временем: «не больше пяти минут записей». RTO (recovery time objective) - за сколько система обязана вернуться в строй: «полчаса».

Оба прямо превращаются в деньги. RPO в сутки - это ночная копия, дёшево и просто. RPO в пять минут - это журнал транзакций, непрерывно едущий на резервный контур. RTO в полчаса - заранее поднятый резерв и отрепетированное переключение, а не «поднимем из копии, когда найдём человека, который это умеет».

// Резервный контур, который ни разу не переключали, не работает - это правило, а не пессимизм. Конфигурация отстала, сертификат протух, права не выданы, порядок помнит один человек, и он в отпуске. Поэтому в требования кладут регулярные учения с реальным переключением и замером фактического времени: RTO без учений остаётся числом на бумаге.

RPO
допустимый объём потерянных данных, выраженный периодом
RTO
целевое время возврата системы в строй

Как отвечать: «Сформулируй проверяемое требование к отказоустойчивости»

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

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

На чём валятся

  • − Пишут «система должна быть отказоустойчивой» без сценария и порога.
  • − Называют проценты доступности, не переведя их в часы простоя и в деньги.
  • − Не описывают поведение при недоступности внешнего сервиса.
  • − Вызывают внешние сервисы без таймаута и без лимита параллельных вызовов.
  • − Полагаются на резервный контур, который ни разу не проверяли переключением.
  • − Задают RPO и RTO, не посчитав, во что обойдётся их достижение.

Проверьте себя

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

  1. #ana_arc_resilience1 / 5
    Что такое каскадный отказ?
    A)Отказ, повторяющийся по расписанию
    B)Отказ, вызванный ошибкой в коде релиза
    C)Сбой, распространяющийся на соседние сервисы
    D)Одновременный отказ всех узлов кластера
    показать ответ и разбор
    +C)Сбой, распространяющийся на соседние сервисы

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

  2. #ana_arc_resilience2 / 5
    Что означают RPO и RTO в требованиях к восстановлению?
    A)Частоту резервного копирования и его объём
    B)Допустимую потерю данных и время восстановления
    C)Число резервных узлов и их расположение
    D)Стоимость простоя и стоимость резерва
    показать ответ и разбор
    +B)Допустимую потерю данных и время восстановления

    // разбор: RPO отвечает на вопрос, за какой период не жалко потерять данные, RTO — за какое время система обязана вернуться в строй. Эти два числа определяют схему резервирования и её стоимость: RPO в пять минут требует частых копий или репликации, RPO в сутки обходится куда дешевле.

  3. #ana_arc_resilience3 / 5
    Зачем задавать таймаут на вызов внешнего сервиса?
    A)Чтобы снизить трафик между сервисами
    B)Чтобы уменьшить нагрузку на процессор
    C)Чтобы не копить зависшие ожидания
    D)Чтобы упростить журналирование ошибок
    показать ответ и разбор
    +C)Чтобы не копить зависшие ожидания

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

  4. #ana_arc_resilience4 / 5
    Какое требование к отказоустойчивости проверяемо?
    A)Система должна быть отказоустойчивой
    B)Система не должна терять данные
    C)Система должна восстанавливаться быстро
    D)При отказе узла работа идёт за 30 секунд
    показать ответ и разбор
    +D)При отказе узла работа идёт за 30 секунд

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

  5. #ana_arc_resilience5 / 5
    Почему резервный контур, который ни разу не проверяли, считают ненадёжным?
    A)Он устаревает морально со временем
    B)Непроверенное переключение подводит
    C)Он требует отдельной лицензии на ПО
    D)Он потребляет ресурсы в режиме ожидания
    показать ответ и разбор
    +B)Непроверенное переключение подводит

    // разбор: Резерв отстаёт по конфигурации, сертификаты протухают, права не выданы, а порядок переключения помнит один человек в отпуске. Всё это выясняется в момент аварии, когда времени разбираться нет. Поэтому в требования закладывают регулярные учения с переключением и замером фактического времени.

дальше

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

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