open atlas
↑ К треку
Основы System Design SD · 02 · 01

SLA, SLO, SLI

SLI — это число, которое ты измеряешь, SLO — цель, к которой его держишь, SLA — контракт, по которому платишь, если не удержал. Ставь SLO ниже SLA, разницу трать как бюджет ошибок и измеряй тот SLI, что чувствует пользователь, а не тот, что легко нарисовать на графике.

SD Middle ◷ 18 min
Уровень
ОсновыJuniorMiddleSenior
Уже знаешь этот юнит? Пройди быструю проверку за минуту →

Платформенная команда гордо вывесила «99,99% аптайма» на странице статуса. Через шесть недель крупный клиент пригрозил уйти, ссылаясь на постоянные ошибки при оформлении заказа — а дашборд всё так же горел зелёным. Подвох: команда мерила доступность как «балансировщик ответил на TCP-соединение», а он не падал всё это время. То, что волновало клиентов — «запрос на оформление вернул корректный ответ менее чем за секунду» — отказывал в 3% случаев, и за этим числом никто не следил. У них были цель, контракт и метрика — и все три указывали не туда. Починка была не «больше резервирования», а выбрать число, которое что-то значит для пользователя, и решить, что про него обещать.

Три слова, которые путают зря

Эти три термина постоянно смешивают, и смешение дорого обходится, потому что прячет, кто за что отвечает. Зафиксируем:

  • SLI — Service Level Indicator (индикатор). Число, которое ты реально измеряешь. «Доля HTTP-запросов, вернувших 2xx/3xx менее чем за 300 мс.» Это отношение хороших событий к валидным, посчитанное по реальному трафику. SLI — это факт.
  • SLO — Service Level Objective (цель). Цель, к которой ты держишь этот SLI внутри. «99,9% запросов успешны под 300 мс, измерено за 28 дней.» Это цель, которую ты ставишь себе сам. SLO — это решение.
  • SLA — Service Level Agreement (соглашение). Контракт с клиентом о том, что будет, если ты промахнёшься — обычно возврат денег или сервисный кредит. «Если месячная доступность упадёт ниже 99,5%, ты получаешь 10% месячной платы назад.» SLA — это обещание с деньгами.

Зависимость идёт в одну сторону: ты измеряешь SLI, целишься в SLO и обещаешь SLA. Без хорошего SLI твой SLO — фикция, а SLA — иск, ждущий своего часа. У команды из вступления было всё три — просто они построили их на индикаторе («TCP подключился»), который не имел отношения к опыту пользователя («оформление сработало»).

Девятки и чего стоит каждая

Когда стейкхолдер требует «пять девяток» — ты понимаешь, на что соглашаешься и в какую сумму это выльется? Доступность обычно выражают в «девятках» — проценте времени, что сервис поднят за некое окно. Арифметика девяток неинтуитивна, потому что каждая лишняя девятка режет допустимый простой в 10×, и абсолютные числа быстро становятся крошечными:

доступность     простой/год     простой/месяц    простой/день
99%    (две 9)     ~3,65 суток      ~7,2 часа       ~14,4 мин
99,9%  (три 9)     ~8,76 часа       ~43 мин         ~1,44 мин
99,99% (четыре 9)  ~52,6 мин        ~4,3 мин        ~8,6 с
99,999%(пять 9)    ~5,26 мин        ~26 с           ~0,86 с

Читай колонку «месяц» медленно — это окно, которое использует большинство SLO. При трёх девятках ты можешь лежать ~43 минуты в месяц — один плохой деплой и откат влезают сюда. При четырёх девятках у тебя ~4,3 минуты — один человек, которому пришёл алерт, который залогинился и среагировал, уже это пробивает, так что четыре девятки фактически требуют автоматического failover. При пяти девятках (~26 секунд в месяц) человека в петле нет вообще; ты платишь за полностью автоматическое обнаружение и восстановление, мульти-региональное резервирование и инженерную организацию, чтобы всё это вести. Каждая девятка — примерно на порядок больше денег и операционной зрелости, чем предыдущая — поэтому «мы хотим пять девяток» от команды, которая деплоит вручную в пятницу под вечер, — это разговор о бюджете, а не об инженерии.

Почему это работает

Почему стоимость лезет так круто за девятку, хотя процент почти не двигается (99,9% → 99,99% это «всего» 0,09%)? Потому что доступность складывается умножением по зависимостям, а не сложением. Запрос, что трогает балансировщик, app-сервер, кэш и БД, зависит от того, что все четыре подняты: если каждый независимо 99,9%, цепочка — 0,999⁴ ≈ 99,6%, хуже любого отдельного компонента. Чтобы вывести весь путь на четыре девятки, каждое звено должно бить четыре девятки или быть зарезервировано так, чтобы отказ звена не валил запрос. Это резервирование (следующий урок) — там и живёт стоимость порядка: ты покупаешь дубликаты всего плюс механику, чтобы переключаться между копиями быстрее, чем среагирует человек.

Почему SLO ниже SLA

Надёжная команда никогда не ставит внутренний SLO равным подписанному SLA. Она намеренно ставит SLO жёстче SLA — обещаешь клиенту 99,5%, целишься в 99,9%. Зазор — это буфер: если пробил внутреннюю цель 99,9%, срабатывает алерт, и у тебя есть запас среагировать до того, как пробьёшь контракт 99,5% и будешь должен возвраты. SLO — это пожарный датчик; SLA — горящее здание. Будь они равны, ты бы впервые узнал о беде, когда деньги уже ушли.

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

Бюджет ошибок: разрешение тратить надёжность

Самая полезная идея во всей этой области — обратная сторона SLO. Если твой SLO — 99,9% успешных запросов, то 0,1% разрешено отказывать — эти 0,1% и есть твой бюджет ошибок (error budget). За окно в 28 дней при, скажем, 100 миллионах запросов это 100 000 запросов, которые ты можешь «потратить» на отказ, прежде чем пробьёшь цель.

Это переформулирует надёжность с «никогда не падать» (невозможно и неверная цель) на «оставаться в бюджете». А бюджет — это ресурс, который можно тратить, что растворяет классическую драку между продуктом (катить фичи) и SRE (держать стабильность). Практика SRE в Google это конкретизирует: если бюджет остался — катишь; если бюджет исчерпан — политика замораживает рискованные запуски, и команда тратит усилия на надёжность, пока бюджет не пополнится. Спорит число. Команда, безупречная весь месяц, имеет бюджет, чтобы спалить его на рискованную миграцию; команда, у которой только что был инцидент, в долгу по бюджету и должна притормозить. Важно: тратить бюджет — нормально и ожидаемо — вечно неистраченный бюджет ошибок часто значит, что ты переинвестировал в надёжность, которую пользователи не просили и которую можно было пустить на фичи.

Частая ошибка

Самая частая ошибка SLI — мерить доступность с точки зрения сервера, а не пользователя. «Наш сервис вернул 200 в 99,99% случаев» звучит здорово — но считает только запросы, которые дошли до сервиса. Если из-за неверной конфигурации балансировщика или сбоя DNS 5% пользователей вообще не получили соединение, эти отказы не в числителе и не в знаменателе; они невидимы. Пользователь пережил сбой; твой SLI пережил тихий день. Меряй как можно ближе к пользователю — в идеале на балансировщике или через real-user monitoring — и определи «валидные события» как всё, что должно было быть обслужено, а не только то, что было. Команда из вступления провалилась ровно здесь: её индикатор не видел отказов, в которых жил клиент.

Викторина

Твой SLA обещает клиентам 99,9% месячной доступности с пунктом о возврате. Где ставить внутренний SLO и почему?

Викторина

Путь запроса проходит четыре независимых компонента последовательно, каждый с доступностью 99,9%. Какова доступность всего пути и что из этого следует?

Закончи аналогию

Если твой SLO — 99,9% успешных запросов, то 0,1%, которым разрешено отказывать, — это твой _______: ресурс, который можно тратить на рискованные запуски, пока он полон, и который замораживает новый риск, когда исчерпан.

Вспомните перед уходом
  1. 01
    Определи SLI, SLO и SLA и сформулируй связь между ними.
  2. 02
    Что такое бюджет ошибок и как он меняет работу команды?
  3. 03
    Почему каждая лишняя девятка стоит примерно на порядок больше?
Итог

Три слова, что зря размывают: SLI — число, которое ты измеряешь (отношение хороших событий к валидным, вроде «запросов, обслуженных корректно под 300 мс»), SLO — внутренняя цель, к которой держишь его («99,9% за 28 дней»), SLAконтракт с клиентом со штрафами за промах. Зависимость односторонняя — измеряй SLI, целься в SLO, обещай SLA — и ты намеренно ставишь SLO жёстче SLA, чтобы внутренний пробой был ранним предупреждением, а не мгновенным возвратом. Девятки оцифровывают ставки: каждая лишняя режет месячный простой ~10× (43 мин → 4,3 мин → 26 с) и стоит примерно на порядок больше, потому что доступность умножается по зависимостям, и ты покупаешь резервирование плюс автоматический failover в компенсацию. Сильнейшая идея — бюджет ошибок (100% − SLO): надёжность становится ресурсом, который тратишь — катишь, пока он есть, тормозишь, когда кончился — что заменяет спор фичи-против-стабильности арифметикой. А фундамент под всем этим — выбрать SLI, что отражает то, что чувствует пользователь, измеренный как можно ближе к нему: ошибись тут, как команда из вступления, и два других числа уверенно меряют пустоту. Теперь, когда встретишь пункт SLA в контракте с вендором или надпись «99,99% аптайма» на странице статуса, спроси первым делом: какой SLI за этим стоит — и мерит ли он то, что реально чувствует пользователь?

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 7 завершено
Связанные уроки

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.