Привет, %username%! Иногда кажется, что про надежность уже сказано всё: SLO, error budget, postmortem’ы, Chaos Engineering и вот это всё. Но потом ты открываешь очередной инцидент в проде — и понимаешь, что падает не «абстрактная система», а вполне конкретная «штука», которую ты вчера трогал руками. И вот ты сидишь, смотришь в логи и графики, и главный вопрос звучит примерно так: «А можно было сделать так, чтобы сегодня я спал?»
На написание этой статьи меня сподвигла книга “SRE. Рецепты выживания в продакшне для инженера по надежности” за авторством Натальи Савенковой. Эта статья — попытка собрать в одном месте практические тезисы, которые помогают не просто «чинить прод», а строить такую эксплуатацию, где падения становятся реже, а восстановление — проще и спокойнее.
Принципы вместо героизма
Все начинается не с Grafana и не с Kubernetes, а с принципов команды: что мы считаем нормой, что считаем неприемлемым и как вообще привыкли работать.
- Надежность начинается с того, как команда договаривается работать: что считаем ок, а что считаем нарушением здравого смысла.
- Если надежность сервиса нельзя управлять, измерять и регулировать — у тебя нет сервиса, у тебя набор случайно работающих скриптов.
- Принцип «если страшно — делай чаще» отлично работает и для процедур (релизы, переключения, учения) — чем больше повторов, тем ближе автомация и тем меньше шансов, что «руки дрогнут».
Характерная мысль: надежность — это не героические ночные починки, а заранее сформулированные правила, по которым команда принимает решения, особенно неприятные.
Иммунитет системы: DIS, GD, fallback
Крутая метафора — иммунитет продукта: система рождается с каким‑то базовым «здоровьем», но дальше его нужно постоянно тренировать учебными встрясками и интеграцией опыта прошлых инцидентов.
- Всё, что с системой случается, должно попадать в общую память: DIS (Digital Immune System, назови как хочешь) — не украшение, а база для эволюции.
- Если смежный сервис начал чаще отвечать ошибками — это не только про ретраи, это триггер к запуску graceful degradation (GD) или fallback именно на этом участке.
- Exponential backoff — не про «красивые алгоритмы», а про то, чтобы ретраи не продлевали агонию инцидента, а давали системе шанс «встать с колен».
Идеальная связка: DIS аккумулирует историю ошибок, GD даёт «план Б», fallback закрывает совсем плохие сценарии, чтобы пользователю не прилетал унылый «502 Bad Gateway».
Graceful Degradation: всегда отвечать, но не всегда всем
Если в голове GD = «мы иногда отваливаемся по лёгкому», то ничего хорошего не выйдет.
- Правильная GD — это когда сервис всегда отвечает, но не всегда полной функциональностью.
- Нужны уровни деградации: от выключения «сопутствующих товаров» до отдачи статики «техработы, вот наши лучшие предложения».
- Кэширование и заглушки — такие же инструменты GD: лучше показать «Топ‑5» или дефолтный вариант, чем ничего.
Очень важный момент — GD надо согласовывать с продактом заранее: какие блоки отключаем сначала, какие — потом, что для бизнеса критично, а что можно отрубить без слёз.
Fallback: когда даже GD не спасает
Fallback — это не «ещё одна страница с ошибкой», это реальный последний шанс дать пользователю хоть какую‑то ценность.
- Fallback лучше любого 5xx: даже тетрис или одна страница с лучшим товаром лучше, чем пустой 502.
- Важно мониторить, как часто показывается fallback: это отдельный сигнал о классах запросов, которые система не может обработать корректно.
- Fallback и GD — не взаимоисключающие штуки: GD работает «по пути» запроса, fallback — когда пути уже не осталось.
По сути, GD и fallback — это про уважение к пользователю: либо ты честно пытаешься дать хотя бы что‑то, либо молча падаешь в 5xx и надеешься, что он когда-нибудь вернётся.
Мониторинг, который действительно помогает
Мониторинг «чтобы был» только создает иллюзию контроля. Полезный мониторинг строится из нескольких идей.
Абсолютные значения и тренды
- Контролируй трафик по абсолютным значениям сверху и снизу — чтобы видеть и внезапные всплески, и подозрительные провалы.
- Используй тренды, чтобы ловить аномалии в поведении (типичное для дня недели, часа и т.д.), но помни: плавные изменения тренд может спокойно «проглотить».
- Рабочий рецепт: совмещать мониторинг по абсолюту и по тренду, а не выбирать что‑то одно.
Среднее, min/max и перцентили
- Среднее без min/max — это классика «средней температуры по больнице».
- Важно отслеживать min/max и перцентили (p90, p95, p99), потому что именно они часто первыми намекают на будущий сбой.
- Если по агрегатам всё красиво, а один хост уже умирает — без min/max ты про это узнаешь только из инцидента.
Молчаливый мониторинг и резервный мониторинг
- «Если мониторинг не пишет о проблемах — возможно, он просто не работает» — очень неприятная правда.
- Резервный мониторинг на других технологиях (хоть отдельная Grafana+VM на retention 2 дня) — это не паранойя, а нормальная страховка.
- Мониторинг должен быть не только внутренним, но и внешним: проверять доступность глазами пользователя из важных локаций.
По хорошему, у тебя должны мониториться: сами сервисы, их зависимости, мониторинг, срок годности сертификатов/лицензий и всё, что когда‑нибудь «протухнет».
Нагрузочное тестирование и «правильные» учения
Учения и нагрузка — самая недооценённая часть надёжности: все про них говорят, но мало кто делает это регулярно и по уму.
- Учения без подготовки — must‑have: либо автоматика работает, либо в ходе учений становится ясно, что её нет и её надо сделать.
- Сценарии учений надо рандомизировать и пересматривать, иначе это будет не Chaos Engineering, а театральная постановка «все всё знают заранее».
- Нагрузочные тесты с одинаковыми результатами — тревожный знак: значит, тесты устарели или слишком аккуратно обходят острые углы.
Система с «отличными» нагрузочными тестами, которые никогда ничего не ломают, обычно падает от первого же реального всплеска.
Failover, расселение сервисов и «слон с моськой»
Любая история про отказоустойчивость со временем приходит к трем вопросам: где у тебя точки отказа, кто с кем соседствует и как ты это всё переключаешь.
- Failover дороже, чем кажется: нужен не только второй инстанс, но и координатор, логика консенсуса и вся инфраструктура вокруг.
- Не сажай «слона и моську» в одну базу: не смешивай критичные сервисы с теми, у кого неконтролируемый трафик (сбор аналитики, события с фронта и т.п.).
- Микросервисный подход с явной разметкой по критичности: выделенные ресурсы для разных классов сервисов.
Критичный сервис плюс «шумный» некритичный — идеальный рецепт для самодельной DDoS‑атаки на самого себя.
Capacity Management и FinOps: сколько мощности тебе реально нужно
«Просто добавить ресурсов» — худшая из возможных стратегий, особенно в облаке.
- Любой запас мощности должен быть осмысленным: под какой сценарий он нужен, на какой срок и при каких ограничениях по бюджету.
- Capacity‑планирование нужно делать по CUJ (Critical User Journey): самые важные клиентские маршруты должны иметь понятный запас.
- Это не только про железо, но и про архитектуру: где узкие места, какой компонент ограничивает пропускную способность и как быстро ты можешь масштабироваться.
По сути, это чистый FinOps: договариваешься с бизнесом, какой трафик обязан выдерживать, а какой — нет, и уже под это строишь схему резервирования и бюджетов.
GitOps, версии и «самодостаточный релиз»
Очень много боли в инцидентах рождается не из багов в коде, а из конфигов и «плавающих» зависимостей.
- Всё, что имеет ценность и выглядит как файл, должно жить в VCS: скрипты, конфиги, инфраструктурные артефакты.
- GitOps‑подход: релиз — это не только «бинарь» или образ, но и конфиги, секреты, схемы, миграции, всё с версионированием.
- Самодостаточный релиз должен гарантированно уметь работать сам по себе и уметь откатываться вместе с конфигами и внешними зависимостями.
Отдельная боль — изменения «на проде руками без бэкапа»: перед любым вмешательством в БД или конфиги должен быть свежий бэкап или хотя бы сохранённая копия файла с суффиксом даты.
Фичатогглы, canary, whitelist/blacklist
Любая новая фича потенциально ломает прод — вопрос только в том, насколько контролируемо.
- Фичи надо выкатывать выключенными и включать через конфиги/рубильники: это даёт быстрый roll‑back без пересборки.
- Whitelist/blacklist помогают управлять долей трафика: сначала включаешь фичу на сегмент, потом расширяешь, потом можешь точечно отключать.
- В стабилизированном состоянии прод должен иметь одну версию сервиса: параллельные версии «Ok» только на время A/B и canary, а не «так и живём».
Фичи, которые нельзя быстро и адресно отключить — это не фичи, а долговые ямы для дежурных.
Процессы, инструкции и «Людочка на ресепшене»
Хорошие процессы — это не бюрократия, а защита от хаоса в самый неподходящий момент.
- Стандартизированные процессы с чёткими, зафиксированными шагами — лучший фундамент для будущей автоматизации.
- Инструкция должна быть такова, чтобы её могла выполнить «Людочка» или условная секретарша: копировать команды, открывать ссылки и получать предсказуемый результат.
- Плановые работы должны делаться по регламенту, без «давай заодно тут поправим, пока уже всё отключили».
Сюда же — план Б на каждое нетипичное вмешательство: если «всё пойдёт не так», должен быть понятный сценарий возврата в состояние «как было».
Люди, психология и работа в стрессе
Любой серьёзный инцидент — это ещё и психологическая нагрузка, и к ней тоже надо готовиться.
- У каждого свой «деструктор» в стрессе: кто‑то начинает хаотично нажимать всё подряд, кто‑то «замерзает», кто‑то исчезает из коммуникации.
- Личный чек‑лист дежурного («подышать», «записать идеи действий», «пройтись», «открыть инструкцию по оповещению») — очень мощный инструмент.
- Интуицию стоит слушать: если внутри зудит «сделать бэкап» или «снять трафик» — лучше перебдеть, чем недобдеть.
Отдельная история — групповые дежурства: если «ответственность на всех», то по факту не отвечает никто, поэтому нужны конкретные фамилии в графике.
Коммуникация: смежники, продакты, пользователи твоих инструментов
Надёжность ломается не только в коде, но и на стыках людей и команд.
- Если сервис А положил сервис Б десятикратным ростом запросов — виноваты оба: А не ограничил нагрузку, Б не предусмотрел верхнюю границу того, что он может переварить.
- Разборы инцидентов должны быть публичными: любой участник должен иметь возможность задать вопрос, особенно из смежных команд.
- С теми, кто пользуется твоими панелями и инструментами, надо регулярно говорить и смотреть «их глазами» на интерфейс — очень часто это приносит внезапные открытия, потому что очевидное для тебя — неочевидно для других.
Плюс базовая дисциплина: общий календарь маркетинговых запусков и регламентных работ, понятные термины и общий словарь.
Безопасность как часть надёжности
Про ИБ легко забыть, пока не прилетело.
- Требования информационной безопасности — это не внешняя бюрократия, а часть надёжности и доступности.
- Чем раньше ты начнёшь приводить сервис к ИБ‑гайдам, тем меньше будет боли потом: всё равно придётся, но лучше не в режиме горящей пятой точки.
- Debug‑режимы, скрытые параметры, хардкод в фронтенде, незащищённые «магические» урлы — всё это при первом же fuzzing’е превращается в инцидент.
ИБ — просто ещё один класс рисков для надёжности, и игнорировать его — то же самое, что не мониторить диск или БД.
Несколько практических выводов
Соберём самое важное в виде коротких тезисов — то, что полезно прямо взять и примерить к своему проекту:
- Формализуй принципы команды. Пойми, что для вас нормально, а что — нет, и как вы принимаете решения в проде.
- Строй иммунитет системы. Собирай данные об инцидентах, запускай учения, внедряй DIS, GD и fallback как связанный комплекс.
- Наведи порядок в мониторинге. Абсолютные значения + тренды, min/max + перцентили, резервный мониторинг и внешние проверки.
- Инвестируй в процесс. Стандартизированные инструкции, регламенты, планы отката, регулярные учения по релизам и rollback’ам.
- Живи через GitOps и версии. Всё важное — в VCS, релиз самодостаточен, откат — быстрый и предсказуемый.
- Не забывай про людей. Психология дежурств, личные чек‑листы, явные дежурные, нормальная коммуникация с продактами и смежниками.
Если всё это собрать вместе, то «чинить прод» перестаёт быть вечным героическим подвигом и превращается в спокойную инженерную работу. А это, кажется, ровно то, к чему хочется прийти.
PS: Читать книгу “SRE. Рецепты выживания в продакшне для инженера по надежности” за авторством Натальи Савенковой было и смешно и грустно одновременно. Но главная ценность лично для меня — я увидел, что я не одинок в своих выводах!
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.
О способах отблагодарить автора можно почитать на странице “Донаты”.
