Все уроки
АрхитектураПродвинутый13 мин чтенияВ моём стеке

Надёжность, SRE и эксплуатация

SLO и error budget'ы, дежурства, реагирование на инциденты, postmortem'ы и восстановление после аварий.

  • SLO / SLA
  • Incidents
  • Runbooks
  • Disaster recovery
  • Postmortems
Шаг 1/6
Checkout длится 8 секунд, пользователи в ярости. Пора звать детективов: metrics, traces и logs.

За 30 секунд

Надёжность — это практика поддержания сервиса в том состоянии, которого ждут пользователи, и быстрого восстановления, когда что-то идёт не так. Site Reliability Engineering (SRE) делает её измеримой: определите, что значит «работает» (SLI), задайте цели (SLO) и используйте оставшийся error budget, чтобы балансировать новые фичи и стабильность. Вокруг этого — дежурства, реагирование на инциденты, runbook'и, postmortem'ы и проверенный план на случай аварий.

Почему я это использую

  • Я использую эти практики, потому что самое дорогое в падении — обычно неразбериха вокруг него, а не сам баг.
  • SLO превращают расплывчатые жалобы вроде «сайт как-то медленный» в числа, о которых команда и клиент могут договориться.
  • Бэкапы считаются, только если восстановление было проверено; я научился относиться к непроверенным бэкапам как к их отсутствию.
  • Runbook'и и postmortem'ы позволяют маленькой команде спокойно эксплуатировать продакшен, а не полагаться на память одного человека.

Как это работает

01SLI, SLO, SLA и error budget'ы

Service Level Indicator (SLI) — это измерение пользовательского опыта, например доля успешных запросов или доля запросов, обслуженных быстрее 300 мс. Service Level Objective (SLO) — цель для этого показателя на определённом окне: 99.9 процента запросов оформления заказа успешны за 30 дней. Service Level Agreement (SLA) — договор с последствиями, обычно с компенсациями, и он должен быть мягче вашего внутреннего SLO, чтобы у вас было предупреждение до его нарушения. Error budget — разрыв между идеалом и SLO: 99.9 процента допускают около 43 минут сбоев за 30 дней. Пока бюджет есть, выпускайте фичи; когда он израсходован, приоритет — работе над надёжностью. Измеряйте SLI там, где их чувствуют пользователи (на load balancer'е или синтетическими проверками), и алертите на быстрое сгорание бюджета, а не на каждый всплеск CPU.

yaml
groups:
  - name: api-slo
    rules:
      - alert: ApiErrorBudgetFastBurn
        # 99.9% SLO: page if errors burn the budget 14.4x too fast
        expr: |
          (sum(rate(http_requests_total{job="api",status=~"5.."}[1h]))
            / sum(rate(http_requests_total{job="api"}[1h]))) > (14.4 * 0.001)
          and
          (sum(rate(http_requests_total{job="api",status=~"5.."}[5m]))
            / sum(rate(http_requests_total{job="api"}[5m]))) > (14.4 * 0.001)
        for: 2m
        labels:
          severity: page
        annotations:
          summary: "API is burning its 30-day error budget too fast"

02Дежурства и реагирование на инциденты

Дежурство означает, что кто-то отвечает за реакцию, когда ломается продакшен, — с понятной ротацией, путём эскалации и достаточным отдыхом. Это работает, только если по алертам можно действовать: каждый вызов должен означать проблему, видимую пользователям, которой прямо сейчас нужен человек, со ссылкой на дашборд и runbook. Всё остальное — в очередь тикетов. Когда начинается инцидент, следуйте простой последовательности. Подтвердите алерт. Оцените влияние и объявите уровень серьёзности. Распределите роли: incident commander, который координирует, кто-то, кто работает руками, кто-то, кто общается с пользователями и заинтересованными людьми. Сначала смягчите последствия: откатите деплой, переключитесь на резерв, выключите feature flag, добавьте мощности или заблокируйте вредоносный трафик. Первопричину ищите, только когда пользователи в безопасности. По ходу ведите хронологию в одном канале и публикуйте обновления статуса в регулярном ритме, даже если ничего не изменилось.

  • Обнаружить, подтвердить, оценить серьёзность, распределить роли.
  • Сначала смягчить, потом диагностировать: откат часто — самое быстрое исправление.
  • Сообщать по графику: молчание делает инциденты страшнее.
  • Закрывать с проверкой, затем назначать postmortem.

03Runbook'и и blameless postmortem'ы

Runbook — короткое практическое руководство для известной ситуации: «диск заполнен больше чем на 90 процентов», «растёт хвост очереди», «восстановить базу на момент времени». В нём перечислены симптомы, дашборды для проверки, безопасные диагностические команды, исправление и момент, когда нужно эскалировать. Хорошие runbook'и позволяют уставшему инженеру в 3 часа ночи действовать правильно, и они — первый шаг к автоматизации исправления. После любого значимого инцидента пишите postmortem: что произошло, хронология, влияние, как обнаружили и устранили, сопутствующие факторы и конкретные последующие действия с ответственными и сроками. Делайте его blameless: спрашивайте, почему система допустила ошибку, а не кто её совершил, потому что люди скрывают информацию, когда боятся обвинений. Следите за последующими действиями до их выполнения: postmortem без выполненных действий — просто рассказ.

04Высокая доступность и восстановление после аварий: RPO и RTO

Высокая доступность (HA) сохраняет работу сервиса при отказе компонента: несколько инстансов приложения, реплика базы, готовая к failover, резервные load balancer'ы, health check'и, которые обходят сбои. Восстановление после аварий (DR) — о возвращении после того, что HA не может поглотить: падение региона, повреждение данных, ransomware, случайный DROP TABLE, который мгновенно реплицируется на все реплики. DR определяют два числа. Recovery Point Objective (RPO) — сколько данных вы можете позволить себе потерять, в единицах времени: ежечасные бэкапы означают потерю до часа. Recovery Time Objective (RTO) — сколько вы можете простаивать, пока идёт восстановление. Меньшие числа стоят дороже: непрерывное архивирование WAL и point-in-time recovery — для малого RPO, тёплый резерв инфраструктуры — для малого RTO. Храните бэкапы вне сервера, зашифрованными и версионированными, и восстанавливайтесь из них по расписанию.

  • Реплики защищают от отказа железа, но не от плохих записей; от них защищают бэкапы.
  • Следуйте идее 3-2-1: три копии, два носителя, одна вне площадки.
  • Учение по восстановлению измеряет ваш реальный RTO.

05Chaos-тестирование и повседневная эксплуатация

Chaos-тестирование — это намеренное внесение сбоев, чтобы проверить, что система и команда ведут себя как ожидалось. Начинайте с малого и безопасного: на staging убейте инстанс приложения, остановите Redis, добавьте задержку в мок платёжного API, заполните диск — и смотрите, срабатывают ли алерты, правильно ли ведут себя повторы и плавно ли деградирует сервис. Game day — то же самое, но с людьми: отрепетируйте восстановление базы или failover с runbook'ом в руках. Повседневная эксплуатация менее драматична, но важнее: просмотр дашбордов и алертов, установка обновлений безопасности, ротация сертификатов и секретов, наблюдение за ростом диска и базы, проверка задач бэкапа и тестов восстановления, чистка логов и старых сборок, тюнинг медленных запросов и поддержание зависимостей в актуальном состоянии. Отслеживайте toil — повторяющуюся ручную работу — и автоматизируйте то, что возвращается каждую неделю.

Когда применять

  • Любой продакшен-сервис с платящими пользователями или договорными обязательствами.
  • Команды, которые спорят, выпускать ли фичи или чинить стабильность: error budget'ы решают этот спор.
  • Системы с данными, которые было бы дорого или невозможно воссоздать.
  • Перед миграциями или изменениями инфраструктуры — чтобы договориться о допустимом риске.

Когда не стоит

  • Ставить цели 99.99 процента для внутреннего инструмента, которому за глаза хватит 99 процентов: каждая «девятка» стоит дорого.
  • Тяжёлый процесс (роли в инцидентах, формальные ревью) для прототипа выходного дня.
  • Chaos-эксперименты в продакшене до того, как появились базовый мониторинг и откат.

Альтернативы

  • Только uptime-проверки

    Простой внешний монитор — хорошее начало для небольших сайтов, но он не видит частичных сбоев.

  • Управляемые платформы

    PaaS и управляемые базы перекладывают часть работы по доступности и бэкапам на провайдера.

  • Эксплуатация в стиле ITIL

    Более формальное управление изменениями и инцидентами, распространённое в крупных корпорациях.

  • Инструменты для инцидентов

    Сервисы оповещений и status page добавляют структуры дежурствам и коммуникации.

Лучшие практики

  1. Определите несколько SLI с точки зрения пользователя и задайте реалистичные SLO.
  2. Будите людей только из-за симптомов, видимых пользователям, по которым можно действовать; остальное — в тикеты.
  3. Привязывайте каждый алерт к дашборду и runbook'у.
  4. Сначала смягчайте, потом диагностируйте; сделайте откат одной командой.
  5. Пишите blameless postmortem'ы с действиями, у которых есть ответственный и срок.
  6. Храните бэкапы вне сервера и проверяйте восстановление по расписанию.
  7. Согласуйте RPO и RTO с бизнесом и проектируйте бэкапы под них.

Частые ошибки

  • Алертить на каждую метрику, приучая людей игнорировать вызовы.
  • Считать реплики бэкапами, а потом реплицировать неудачное удаление повсюду.
  • Ни разу не проверять восстановление и обнаружить сломанный бэкап посреди аварии.
  • Час отлаживать вживую, когда откат решил бы проблему пользователей за минуты.
  • Писать postmortem'ы, которые обвиняют человека и не приводят ни к каким изменениям в системе.

Глубже

06Алертинг по нескольким окнам и нескольким burn rate

Burn rate показывает, как быстро вы тратите error budget относительно плана: burn rate 1 расходует ровно весь бюджет за окно SLO, а 14.4 — 30-дневный бюджет примерно за два дня. SRE Workbook рекомендует сочетать несколько порогов, каждый из которых проверяется на длинном и коротком окне. Будите дежурного, когда за час сожжено 2 процента месячного бюджета (burn rate 14.4, подтверждено за 5 минут) или 5 процентов за шесть часов (burn rate 6, подтверждено за 30 минут). Заводите тикет, когда 10 процентов сожжено за три дня (burn rate 1, подтверждено за 6 часов). Длинное окно даёт значимость, чтобы короткие всплески не будили людей; короткое окно позволяет алерту быстро погаснуть после исправления проблемы. Используйте recording rules, чтобы заранее считать долю ошибок для каждого окна, — так вычисление алертов остаётся дешёвым.

yaml
groups:
  - name: api-slo-recordings
    rules:
      - record: job:slo_errors:ratio_rate5m
        expr: sum(rate(http_requests_total{job="api",status=~"5.."}[5m])) / sum(rate(http_requests_total{job="api"}[5m]))
      - record: job:slo_errors:ratio_rate1h
        expr: sum(rate(http_requests_total{job="api",status=~"5.."}[1h])) / sum(rate(http_requests_total{job="api"}[1h]))
      - record: job:slo_errors:ratio_rate30m
        expr: sum(rate(http_requests_total{job="api",status=~"5.."}[30m])) / sum(rate(http_requests_total{job="api"}[30m]))
      - record: job:slo_errors:ratio_rate6h
        expr: sum(rate(http_requests_total{job="api",status=~"5.."}[6h])) / sum(rate(http_requests_total{job="api"}[6h]))
  # Page: (1h > 14.4*0.001 and 5m > 14.4*0.001) or (6h > 6*0.001 and 30m > 6*0.001)

07Правильный выбор SLI: гистограммы latency и зависимости

Хорошие SLI — это отношение хороших событий к валидным, измеренное как можно ближе к пользователям. Для latency используйте гистограммы с границами бакетов на ваших порогах и определяйте SLI как долю запросов быстрее, скажем, 300 ms; перцентили, усреднённые по инстансам, математически неверны, а счётчики бакетов корректно складываются. Исключайте то, что не является вашим сбоем (клиентские ошибки 4xx, health check), но будьте строги к тому, что является: ответ 200 со страницей ошибки — это сбой. Учитывайте зависимости: если вашему сервису синхронно нужны три других по 99.9 процента каждый, достижимая доступность ниже 99.9 процента, если не добавить резервирование, кэширование или graceful degradation. Ваш SLO должен быть слабее произведения жёстких зависимостей, иначе часть из них нужно убрать с критического пути.

  • SLI = хорошие события / валидные события в скользящем окне.
  • SLI по latency — из бакетов гистограммы, а не из усреднённых перцентилей.
  • Жёсткие зависимости ограничивают достижимый SLO.

08Безопасные изменения: progressive delivery и быстрый откат

Большинство инцидентов вызваны изменениями: деплоями, обновлениями конфигурации, миграциями, правками сертификатов или DNS. Уменьшайте радиус поражения каждого изменения. Деплойте постепенно: сначала один инстанс или небольшой процент трафика (canary), сравните его error rate и latency с остальными, затем расширяйте. Отделяйте деплой кода от релиза фич с помощью флагов, чтобы плохую фичу можно было выключить без передеплоя. Делайте миграции базы обратно совместимыми, чтобы предыдущая версия приложения продолжала работать после изменения схемы, — это сохраняет возможность отката. Где можно, автоматизируйте откат при провале canary. Замораживайте рискованные изменения вокруг пиковых бизнес-событий. Отслеживайте change failure rate и время восстановления: они показывают, становится ли доставка безопаснее, и большая часть выигрыша в надёжности приходит отсюда, а не от дополнительного железа.

09Бэкапы, которые восстанавливаются: PITR, неизменяемость и учения

Для PostgreSQL point-in-time recovery сочетает периодический base backup с непрерывным архивированием сегментов WAL, поэтому можно восстановиться на любой момент, например за минуту до случайного DELETE. Инструменты вроде pgBackRest и WAL-G берут на себя сжатие, шифрование, retention и параллельное восстановление из object storage. Защищайте бэкапы от тех же угроз, что и продакшен: используйте отдельные учётные данные, которых нет на серверах приложения, включите versioning или object lock, чтобы ransomware или скомпрометированный сервер не смогли их удалить, и копируйте во второй регион или к другому провайдеру. Затем измеряйте. Плановые учения восстанавливают последний бэкап на новый сервер, запускают проверки целостности и несколько запросов приложения и фиксируют, сколько это заняло. Эта длительность — ваш реальный RTO; возраст самых свежих восстановимых данных — ваш реальный RPO.

bash
# pgBackRest: full backup weekly, differential daily, WAL archived continuously
pgbackrest --stanza=main --type=full backup
pgbackrest --stanza=main --type=diff backup
pgbackrest --stanza=main info
 
# Restore to just before a bad DELETE (run on a fresh server)
pgbackrest --stanza=main --delta \
  --type=time "--target=2026-11-05 14:31:00+00" \
  --target-action=promote restore

Реальные ситуации

01

Команда тонет в алертах

Проблема

Дежурный получает сорок пейджей в неделю, в основном про CPU, память и единичные упавшие health check, которые проходят сами. Реальные инциденты дважды пропустили, потому что люди выключили уведомления.

Как решить

Проведите аудит пейджей за месяц и пометьте каждый: требовал действия сейчас, требовал действия позже или не требовал действий. Всё из последних двух групп удалите или понизьте до тикетов или дашбордов. Определите два-три SLI для каждого пользовательского сервиса (success rate, latency) и замените пейджи по причинам на multi-window burn-rate алерты. Требуйте, чтобы каждый оставшийся пейдж ссылался на runbook и дашборд. Еженедельно разбирайте объём пейджей на встрече команды с целевым значением, например не больше двух пейджей за смену дежурства, и считайте повторяющиеся пейджи багами, которые нужно исправить.

02

Случайный DELETE в продакшене

Проблема

Сервисный скрипт без условия WHERE удалил большую часть строк таблицы customers. Реплики применили это за секунду.

Как решить

Остановите записи, которые могут надстроиться над повреждением, например переведя приложение в режим обслуживания для затронутых функций. Не восстанавливайте поверх продакшена. Восстановите последний base backup плюс WAL на отдельный сервер с целевым временем прямо перед DELETE, проверьте данные, затем скопируйте недостающие строки обратно в продакшен через INSERT ... SELECT или дамп этой таблицы, сверив строки, созданные позже. Сообщайте о последствиях, пока работаете. В постмортеме добавьте защиту: скрипты выполняются в транзакциях с проверкой числа строк, а доступ к продакшену — через проверенные процедуры.

03

Согласование целей надёжности с клиентом

Проблема

Клиент просит «пять девяток» для платформы бронирования, которая размещена на одном VPS, с небольшой командой и фиксированным бюджетом.

Как решить

Переведите девятки в простой и деньги: 99.999 процента допускают около 26 секунд в месяц, что требует резервирования в нескольких регионах и круглосуточного дежурства. Затем спросите, что реально бьёт по бизнесу: неудачные бронирования в пиковые часы, потерянные данные или медленные страницы. Предложите SLO на эти сценарии, например 99.9 процента успешных бронирований в месяц с RPO пять минут и RTO один час, и покажите, сколько стоит каждый следующий шаг (второй сервер, managed-база, ротация on-call). Согласуйте error budget policy, чтобы обе стороны знали, что происходит, когда бюджет заканчивается.

Шпаргалка

Минуты error budget (30 дней)
99% = 432 мин, 99.9% = 43.2 мин, 99.95% = 21.6 мин, 99.99% = 4.3 мин
Пейдж при быстром сгорании
Burn rate 14.4 за 1 ч И за 5 мин (2% бюджета)
Пейдж при медленном сгорании
Burn rate 6 за 6 ч И за 30 мин (5% бюджета)
Тикет, а не пейдж
Burn rate 1 за 3 дня И за 6 ч (10% бюджета)
Burn rate
наблюдаемая доля ошибок / (1 - SLO)
Проверить бэкапы
pgbackrest --stanza=main info
Восстановление на момент времени
pgbackrest --stanza=main --type=time "--target=..." restore
Роли в инциденте
Incident commander, ответственный за операции, ответственный за коммуникации
Обязательно в постмортеме
Хронология, влияние, способствующие факторы, действия с владельцем и сроком

В моих реальных проектах

  • На сервере POS SaaS рядом с деплоем на Docker Compose работает стек observability из Prometheus, Grafana и Loki с health check'ами, runbook'ами и скриптами бэкапа.
  • Мой базовый набор для каждого сервера включает снапшоты плюс проверенное восстановление и мониторинг диска, нагрузки и доступности через Uptime Kuma или алерты провайдера.
  • Проблемы в продакшене я сначала диагностирую в режиме только чтения, по логам, прежде чем что-то менять; так я исправил баг в middleware локализации, баг конвертации изображений и ошибку прав доступа к кэшу.
  • При консолидации серверов я следую порядку «инвентаризация, копирование, проверка, переключение DNS» и сохраняю старый сервер, пока всё не проверено; на одном сервере я снизил заполненность диска с 91% до 66%.

Вопросы и ответы

Q1Чем SLO отличается от SLA?

SLO — внутренняя цель надёжности для измеряемого показателя, например 99.9 процента успешных запросов к API за 30 дней. Она направляет инженерные решения. SLA — внешний договор, который обещает уровень сервиса и определяет последствия, обычно компенсации, если вы его не выдержали. SLA должен быть мягче SLO, чтобы вы видели проблему изнутри и реагировали раньше, чем станете должны клиентам. Оба зависят от SLI — реальных измерений, которые должны отражать опыт пользователей, например долю успешных запросов и задержку на границе, а не CPU сервера.

Q2Что такое error budget и как его использовать?

Это объём ненадёжности, который допускает ваш SLO. Цель в 99.9 процента доступности за месяц позволяет около 43 минут сбоев за 30 дней. Бюджет превращает надёжность в общее решение: пока бюджет есть, команда выпускает фичи и идёт на разумные риски; когда он почти израсходован, команда замедляет релизы и ставит в приоритет работу над стабильностью — например, чинит нестабильные зависимости или улучшает откаты. Он же определяет алертинг: вместо вызовов по сырому числу ошибок вы будите людей, когда бюджет сгорает так быстро, что скоро закончится, — это заметно снижает шум.

Q3Расскажите, как вы действуете при инциденте в продакшене.

Сначала подтверждаю алерт и проверяю влияние: какие пользователи, какие функции, с какого момента. Объявляю уровень серьёзности и, если всё серьёзно, разделяю роли: один человек координирует и общается, остальные работают руками. Смягчение идёт раньше поиска первопричины: откатить последний деплой, выключить feature flag, переключиться на резерв или добавить мощности — что быстрее восстановит сервис. Веду хронологию в одном канале и регулярно отправляю обновления заинтересованным людям. Когда всё стабильно, проверяю по метрикам, закрываю инцидент и назначаю blameless postmortem с конкретными действиями, ответственными и сроками.

Q4Объясните RPO и RTO на примере.

RPO (recovery point objective) — какая потеря данных допустима, выраженная во времени. RTO (recovery time objective) — сколько сервис может простаивать, пока вы восстанавливаетесь. Если магазин делает только ночные бэкапы, его RPO — до 24 часов: сбой вечером уносит заказы за весь день. С непрерывным архивированием WAL и point-in-time recovery RPO падает до минут. Если восстановление базы на 200 GB на свежий сервер занимает три часа, это и есть RTO — если только вы не держите тёплый резерв. Цели задаёт бизнес; инженеры называют их цену.

Q5Чем высокая доступность отличается от восстановления после аварий?

Высокая доступность поддерживает работу сервиса при обычных отказах компонентов: несколько инстансов приложения за load balancer'ом, резервная база, которая автоматически берёт работу на себя, дублированная сеть. В идеале пользователи ничего не замечают. Восстановление после аварий покрывает события, которые HA не может поглотить: потерю целого дата-центра, повреждение данных, ransomware или неудачную миграцию, которая мгновенно реплицируется на все реплики. HA — про избыточность в реальном времени; DR — про восстановление из независимых копий, определяемое RPO и RTO. Нужно и то и другое, потому что идеально реплицированная база с радостью реплицирует и ошибочный DELETE.

Q6Каким должен быть хороший алерт?

Хороший алерт требует действий, срочен и связан с влиянием на пользователей. Он срабатывает на симптом, который чувствуют пользователи, — растущую долю ошибок, медленное оформление заказа или сгорание SLO, — а не на причину, которая может быть безобидной, вроде CPU на 80 процентах. У него понятный заголовок, он говорит, насколько всё плохо, ссылается на нужный дашборд и runbook и приходит нужному человеку. Если алерт регулярно срабатывает, а делать никому ничего не нужно, его надо донастроить, понизить до тикета или удалить. Шумный алертинг опасен: люди учатся игнорировать вызовы, включая настоящий.

Вопросы уровня senior

S1Как бы вы написали error budget policy и что происходит, когда бюджет исчерпан?

Policy — это короткий документ, заранее согласованный разработкой и продуктом, чтобы решения под давлением не импровизировались. В нём указаны SLO, окно и владельцы. Он задаёт пороги: когда бюджет в порядке — обычные релизы; когда больше половины потрачено в начале окна — дополнительное ревью рискованных изменений; когда исчерпан — заморозка фич для этого сервиса, кроме исправлений надёжности и патчей безопасности, пока скользящее окно не восстановится. В нём перечислены исключения, например сбои по вине зависимости, покрытой собственным SLO, и путь эскалации, если команды не согласны. Компромисс явный: продукт принимает более медленную доставку после периода ненадёжности, разработка принимает быстрые релизы, пока бюджет позволяет, и обе стороны опираются на одни и те же цифры.

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

Начинайте с RPO и RTO, а не с архитектуры. Если бизнес готов к часу простоя и потере данных за несколько минут, полноценная active-active схема не нужна. Экономичный паттерн — pilot light: непрерывное архивирование WAL и репликация object storage во второй регион или к другому провайдеру, инфраструктура, описанная как код, образы контейнеров в registry, доступном с обеих сторон, и DNS с низким TTL. Тогда failover означает поднять серверы из кода, восстановить базу на последнюю точку и переключить DNS. Отрабатывайте это дважды в год и засекайте время. Warm standby с работающей репликой сокращает RTO до минут за большие деньги; active-active сокращает ещё сильнее, но заставляет решать задачу записи в нескольких регионах, а это большая и постоянная сложность.

S3Как выглядит зрелый процесс разбора инцидентов помимо документа постмортема?

Это цикл обучения, а не бумажная работа. Инциденты объявляются щедро и без лишних затрат, чтобы фиксировались и мелкие. Разборы проходят в течение нескольких дней, пока память свежа, с фасилитатором, который не был вовлечён, и фокусируются на том, как ситуация выглядела для людей в тот момент и каких сигналов не хватало. Действий немного, они конкретные и с владельцами, получают приоритет в обычном планировании и отслеживаются до завершения с регулярным отчётом о просроченных. Раз в квартал разбираются паттерны по инцидентам: повторяющиеся причины, медленное обнаружение, неудобные runbook. Метрики вроде времени обнаружения, времени смягчения и повторных инцидентов показывают, работает ли цикл. Компромисс — время инженеров на разборы, которое окупается тем, что один и тот же сбой не случается дважды.

Глоссарий

SLI
Измеряемый показатель пользовательского опыта, например доля быстрых успешных запросов.
SLO
Внутренняя цель для SLI на временном окне, например 99.9 процента за 30 дней.
Error budget
Допустимый по SLO объём сбоев, который используется для баланса риска и работы над фичами.
Burn rate
Скорость расходования error budget по сравнению с равномерным темпом.
MTTR
Mean time to restore: сколько в среднем занимает восстановление сервиса после сбоя.
Canary release
Отправка небольшой доли трафика на новую версию перед полной раскаткой.
PITR
Point-in-time recovery: восстановление базы на точный момент с помощью бэкапов и логов.
Toil
Ручная повторяющаяся эксплуатационная работа, которая растёт с нагрузкой и поддаётся автоматизации.
Game day
Запланированные учения, на которых команда отрабатывает реакцию на смоделированный сбой.

Есть идея продукта?Давайте создадим его.

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