SLI, SLO и бюджет ошибок
Посчитал, что означают знаменитые девятки в минутах. Цель 99% - это 432 минуты недоступности в месяц, то есть больше семи часов. 99,9% - уже 43,2 минуты. 99,99% - 4,3 минуты, меньше пяти. А теперь главное: ОДИН десятиминутный полный отказ съедает 23% месячного бюджета при цели 99,9%. Два таких за месяц - и половины бюджета нет.
Стержень: цель по надёжности имеет смысл только вместе с бюджетом ошибок, а бюджет - это разрешение тратить, а не запрет ошибаться.
// Формулировки: «что такое SLI, SLO и SLA?», «зачем бюджет ошибок?», «как выбрать цель по доступности?»
Три сокращения и порядок между ними
SLI (service level indicator) - это сам показатель, измеримое число: доля успешных запросов, доля запросов быстрее 300 миллисекунд, доля свежих данных. Главное требование к нему - он должен отражать то, что чувствует пользователь, а не то, что удобно померить.
SLO (service level objective) - цель по этому показателю: «99,9% запросов успешны за скользящие 30 дней». Это внутреннее обещание команды. SLA (service level agreement) - внешнее обещание клиенту, с деньгами за нарушение. Порядок такой: сначала показатель, потом внутренняя цель, и только потом, если нужно, внешнее обещание - причём с запасом. Внутренняя цель всегда строже внешней, иначе нарушение обещания клиенту вы узнаёте от клиента.
// Выбирают цель не по красоте числа, а по цене. Каждая девятка стоит денег: 99% - это 7,2 часа в месяц, 99,9% - 43 минуты, 99,99% - четыре минуты. Разница между последними двумя означает совсем другую архитектуру: запасные мощности в разных площадках дата-центра, автоматическое переключение, отработанные учения. Если бизнесу хватает 99,5%, платить за 99,99% незачем.
- SLI
- измеримый показатель качества (service level indicator), отражающий опыт пользователя
- SLO
- внутренняя цель по показателю (service level objective)
- SLA
- внешнее обещание клиенту (service level agreement) с ответственностью за нарушение
Бюджет ошибок как инструмент
Бюджет ошибок - это то, что осталось от цели: при 99,9% за месяц разрешено 43,2 минуты неуспеха. Считать его надо в потраченном, а не в «сколько раз падали». Посчитал несколько сценариев при цели 99,9%: полный отказ на 10 минут забирает 23,1% бюджета; получасовой сбой с половиной ошибок - 34,7%; четырёхчасовая деградация с 5% ошибок - 27,8%; сутки с одним процентом ошибок - 33,3%.
Обрати внимание на последние два. Медленная тихая деградация, которую никто не считает аварией, съедает бюджета столько же, сколько громкое падение. Именно поэтому бюджет считают по показателю, а не по числу инцидентов.
// Дальше бюджет становится инструментом принятия решений, и в этом весь смысл. Бюджет цел - катим новое, экспериментируем, идём на риск. Бюджет исчерпан - выкатки (установка новой версии на прод) только критичные, команда занимается надёжностью, пока он не восстановится. Это снимает вечный спор «разработка хочет быстрее, эксплуатация хочет стабильнее»: спорить больше не о чем, есть число. И работает это ровно до тех пор, пока правило соблюдают на самом деле.
- бюджет ошибок
- разрешённая доля неуспеха: разница между 100% и целью
- скорость сгорания
- как быстро расходуется бюджет; по ней и заводят алерты
Как мерить и на что смотреть
Показатель считают отношением: успешные запросы к общему числу за скользящее окно. Окно берут скользящее, а не календарный месяц, иначе первого числа бюджет волшебно обнуляется и первую неделю можно ронять что угодно.
Алерт вешают не на само значение показателя, а на скорость сгорания бюджета. Логика простая: если бюджет тратится в 14 раз быстрее нормы, то за двое суток он кончится целиком - будим человека сейчас. Если в два раза быстрее нормы, то повод разобраться в рабочее время, а не ночью.
// И два честных ограничения. Первое: не всякий запрос стоит считать. Опросы состояния от мониторинга, повторы клиентов, запросы ботов легко перекашивают картину, и их обычно исключают. Второе: цель должна быть достижимой силами вашего сервиса. Если вы зависите от чужого сервиса с обещанием 99,5%, обещать сверху 99,99% нельзя арифметически.
- скользящее окно
- последние 30 дней в любой момент, а не календарный месяц
- алерт по скорости сгорания
- будит, когда бюджет тратится существенно быстрее нормы
Как отвечать: «Зачем нужен бюджет ошибок, если можно просто стремиться к нулю сбоев?»
Потому что ноль сбоев недостижим и, что важнее, не нужен. Бюджет ошибок переводит надёжность из спора в число: при цели 99,9% за месяц разрешено 43,2 минуты неуспеха, и это ресурс, который можно тратить. Я считал, как он сгорает: один полный отказ на десять минут забирает 23% месячного бюджета, а сутки тихой деградации с одним процентом ошибок - 33%, то есть больше. Отсюда два практических следствия. Первое: считать надо по показателю, а не по числу инцидентов, иначе медленная деградация проходит мимо. Второе: бюджет управляет выкатками - пока он цел, команда экспериментирует и катит быстро, а как только исчерпан, выкатки только критичные и все занимаются надёжностью. Это снимает вечный спор между скоростью и стабильностью, потому что спорить больше не о чем, есть число.
Ответ объясняет назначение бюджета, подкрепляет арифметикой сгорания и заканчивается тем, как он меняет работу команды. Последнее и есть смысл всей конструкции.
На чём валятся
- −Обещают 99,99% не понимая, что это четыре минуты в месяц и совсем другая архитектура.
- −Считают надёжность числом инцидентов: тихая деградация съедает бюджет незаметно.
- −Делают внутреннюю цель равной внешнему обещанию и узнают о нарушении от клиента.
- −Берут календарный месяц вместо скользящего окна и обнуляют бюджет первого числа.
- −Обещают сверху больше, чем обещают сервисы, от которых зависят.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 6, остальные разбираются в тренажёре.
- SLO — 99.9% успешных запросов за месяц. Что такое бюджет ошибок и зачем он нужен?A)Резерв мощностей, который держат под всплески нагрузкиB)Сумма, заложенная на компенсации клиентам за простойC)Допустимая доля отказов: 0.1% месяцаD)Число инцидентов, которое команда вправе допустить за квартал
показать ответ и разбор
+C)Допустимая доля отказов: 0.1% месяца// разбор: Бюджет ошибок — обратная сторона цели: при 99.9% в запасе примерно 43 минуты отказа в месяц. Пока бюджет цел, команда катит изменения смело — риск оплачен. Когда он сгорел, релизы притормаживают и силы уходят в надёжность. Так спор «фичи против стабильности» превращается в арифметику, а не в вопрос характера участников.
- Руководство просит поставить цель доступности 100%. Что отвечает инженер?A)Согласиться: цель мотивирует, а недобор спишут по фактамB)Каждая девятка дороже, а меняться нужноC)Взять 100% для внешнего соглашения, а внутри держать 99%D)Поставить 100% и добиваться его ретраями на стороне клиента
показать ответ и разбор
+B)Каждая девятка дороже, а меняться нужно// разбор: Стоимость надёжности растёт нелинейно: переход с трёх девяток на четыре означает резервирование, дублирование по зонам, автоматику переключения и дежурство. Плюс сервис зависит от чужих компонентов, у которых своя доступность, — сотня недостижима арифметически. И главное: без допустимой доли отказов нельзя катить релизы и обновлять инфраструктуру. Цель выбирают по тому, что реально нужно пользователю.
- Какой показатель брать за SLI сервиса, чтобы он отражал именно опыт пользователей?A)Пользовательский: доля успешных/быстрых запросовB)Загрузку CPU и памяти нод, где крутится сервисC)Число задеплоенных версий за неделюD)Количество строк логов, записанных сервисом
показать ответ и разбор
+A)Пользовательский: доля успешных/быстрых запросов// разбор: SLI выбирают с позиции пользователя: доля успешных запросов (availability), доля быстрых ответов (latency ниже порога), корректность. CPU/память — это ресурсы: они могут быть в норме, пока пользователю плохо, и наоборот. Хороший SLI — отношение «хороших» событий к общему числу на границе, которую видит клиент (например, у балансировщика). От него уже ставят SLO и считают бюджет ошибок.
- Команда выжгла бюджет ошибок за месяц раньше срока. Что предписывает разумная политика бюджета?A)Понизить SLO, чтобы бюджет снова стал положительнымB)Игнорировать: бюджет — это ориентир, а не правилоC)Притормозить рискованные запуски, вернуться к надёжностиD)Ускорить релизы, чтобы быстрее выкатить исправления
показать ответ и разбор
+C)Притормозить рискованные запуски, вернуться к надёжности// разбор: Бюджет ошибок — это согласованный запас на риск. Политика бюджета заранее описывает, что происходит при его исчерпании: замораживают рискованные фичи-релизы и переключаются на работу над надёжностью (устранение причин инцидентов, устойчивость), пока бюджет не восстановится. Смысл — объективный, заранее принятый триггер для баланса «скорость против стабильности», а не спор на эмоциях по факту. Понижать SLO под провал нельзя.
- Из чего разумно выводить конкретное число SLO (скажем, 99.9%), а не брать его с потолка?A)Из максимально возможной цифры — чем выше, тем лучшеB)Из SLO соседней команды, чтобы было единообразноC)Из круглого числа, которое проще объявить руководствуD)Из нужд пользователей и исторических данных
показать ответ и разбор
+D)Из нужд пользователей и исторических данных// разбор: SLO ставят между двумя ориентирами: чего достаточно пользователям (сверхнадёжность, которую никто не замечает, — пустая трата) и что сервис реально выдаёт по историческим данным. Слишком высокий SLO жжёт ресурсы и парализует изменения (бюджета почти нет), слишком низкий — злит пользователей. Начинают с измерения текущего уровня и потребности, а дальше корректируют. Чужие цели и круглые числа — плохая основа.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.