Когда кто-то говорит: «База данных упала», начните с четырёх вопросов: что именно отказывает? кто или что затронуто? когда это началось? что изменилось или коррелируется с этим моментом? Затем позвольте доказательствам определить следующий шаг. Остановись. Определи масштаб. Сопоставь. Устраняй с доказательствами.
Когда начинается критический производственный инцидент, первое сообщение, которое мы часто получаем, звучит примерно так: «База данных упала».
В этот момент всё внезапно становится срочным.
- Инженеры открывают панели мониторинга.
- Кто-то начинает проверять журналы.
- Другой просматривает CPU и память.
- Кто-то ещё спрашивает, было ли развёртывание.
- Тестируются соединения.
- Запрашиваются метрики.
- Связываются с командами.
Все эти действия в конечном итоге могут быть необходимы. Но есть более важный вопрос, на который нужно ответить сначала: что именно означает «упала»?
Поработав над множеством производственных инцидентов, один урок становится всё более очевидным: первые 60 секунд — это не про решение инцидента. Это про определение инцидента.
Расплывчатое описание проблемы может направить диагностику во множество разных сторон. Точная формулировка проблемы резко сокращает пространство расследования.
В этой статье описывается простой подход, который можно применить в первые моменты инцидента: Остановись. Определи масштаб. Сопоставь.
1. Остановись: определите, что на самом деле означает «упала»
Первая ошибка во многих инцидентах — предположение, что все понимают проблему одинаково. Рассмотрим утверждение: «База данных недоступна». Это утверждение может означать много разных вещей:
- Приложения не могут установить новые соединения.
- Существующие соединения всё ещё работают, но новые соединения терпят неудачу.
- Запросы превышают тайм-аут.
- Конкретный логин не может аутентифицироваться.
- Одна база данных недоступна.
- Одно приложение отказывает, в то время как другие приложения работают правильно.
- Деградация производительности заставляет сервис казаться недоступным.
- Приложение возвращает ошибки HTTP 500, но сама база данных здорова.
- Соединения терпят неудачу периодически.
- Происходит отработка отказа.
- Проблемы DNS или сети не позволяют приложению достичь базы данных.
Эти сценарии требуют совершенно разных путей расследования. Прежде чем открывать десять разных инструментов, попробуйте превратить исходное утверждение во что-то более конкретное.
Например: вместо «База данных упала» попробуйте прийти к чему-то вроде: «Примерно с 14:32 UTC новые подключения приложения к базе данных A периодически терпят неудачу с ошибками входа, в то время как существующие сеансы остаются активными».
Теперь у нас есть что-то, что можно расследовать.
Формулировка проблемы содержит:
- временную метку,
- конкретную базу данных,
- конкретный симптом,
- затронутое поведение соединений,
- и указание на то, что проблема может быть периодической.
Это уже гораздо ценнее исходного оповещения.
2. Определи масштаб: определите радиус поражения
Как только мы понимаем симптом, следующий вопрос: кто или что затронуто?
Это иногда называют определением радиуса поражения. Масштаб может немедленно исключить целые категории возможных причин.
Задайте такие вопросы:
- Затронут один пользователь или все пользователи?
- Затронуто одно приложение или несколько приложений?
- Затронута одна база данных или все базы данных?
- Затронуты все типы соединений?
- Существующие соединения здоровы, а новые терпят неудачу?
- Затронуты только конкретные клиенты или драйверы?
Представьте следующую ситуацию. Приложение A сообщает о сбоях подключения к базе данных. Однако:
- Приложение B подключается успешно.
- SSMS подключается успешно.
- Метрики показывают, что база данных доступна.
- Существующие сеансы продолжают выполнять запросы.
Это кардинально меняет расследование. Проблема может быть не в том, что «SQL недоступен». Вместо этого она может быть в том, что «Приложение A не может установить новые соединения». Это различие чрезвычайно важно. Большой процент времени на диагностику можно сэкономить, просто определив правильный масштаб на раннем этапе.
3. Постройте временную шкалу
Следующее критическое измерение — время. Во время инцидента временные метки — это доказательства.
Спросите:
- Когда началась проблема?
- Есть ли точная временная метка?
- Как долго это длилось?
- Проблема непрерывна или периодична?
- Восстановилась ли проблема автоматически?
- Проблема возникла один раз или несколько раз?
- Было ли другое событие непосредственно перед проблемой?
Хорошая временная шкала инцидента может выглядеть так:
14:31:52 UTC – Приложение работает нормально
14:32:08 UTC – Сообщена первая ошибка соединения
14:32:10 UTC – Обнаружена отработка отказа базы данных
14:32:14 UTC – Дополнительные сбои входа
14:32:18 UTC – Новые соединения начинают успешно устанавливаться
14:32:20 UTC – Приложение полностью восстановлено
Теперь расследование больше не основано на предположениях. У нас есть окно в пять-десять секунд, которое можно сопоставить с телеметрией платформы, событиями базы данных, журналами приложений, информацией о сети и историей развёртываний. Без временной шкалы инженеры могут анализировать часы журналов. С временной шкалой расследование становится сфокусированным.
4. Сопоставьте, прежде чем что-либо менять
Следующий шаг — сопоставление. Как только мы понимаем симптом, масштаб и временную шкалу, мы можем спросить: что изменилось в то же время? Полезные источники для сопоставления могут включать:
- развёртывания приложений,
- изменения инфраструктуры,
- изменения конфигурации,
- отработки отказа базы данных,
- операции масштабирования,
- события обслуживания,
- изменения брандмауэра,
- изменения аутентификации,
- сетевые события,
- изменения DNS,
- использование ресурсов,
- регрессии запросов,
- блокировки,
- взаимоблокировки,
- поведение пула соединений,
- обновления драйверов,
- события платформы.
Ключевое слово здесь — сопоставление. Во время инцидента возникает соблазн немедленно что-то изменить. Например:
- перезапустить приложение,
- перезапустить службу,
- масштабировать базу данных,
- очистить пул соединений,
- изменить конфигурацию,
- перестроить индекс,
- обновить статистики,
- изменить запрос,
- выполнить отработку отказа вручную.
Иногда эти действия необходимы. Но каждое изменение также изменяет доказательства. Перезапуск может восстановить сервис, одновременно удалив ценную диагностическую информацию. Всякий раз, когда это возможно: соберите доказательства до изменения среды.
5. Используйте несколько источников доказательств
Производственные инциденты редко дают полный ответ в одном источнике телеметрии. Лучший подход — сопоставлять несколько источников. Для инцидента, связанного с базой данных, мы можем исследовать:
Телеметрия приложения
Журналы приложения могут выявить:
- сбои соединений,
- ошибки аутентификации,
- задержку запросов,
- попытки повтора,
- исключения тайм-аута,
- ошибки HTTP,
- сбои зависимостей.
Метрики платформы
Метрики могут помочь определить:
- доступность сервиса,
- использование CPU,
- давление на хранилище,
- количество соединений,
- троттлинг,
- насыщение ресурсов.
Телеметрия базы данных
Информация на уровне базы данных может включать:
- активные сеансы,
- ожидания,
- блокировки,
- производительность запросов,
- сбои входа,
- события отработки отказа,
- статистику ресурсов.
Query Store
Для инцидентов производительности Query Store может быть чрезвычайно ценным.
Он может помочь выявить:
- регрессии запросов,
- изменения планов,
- увеличение длительности выполнения,
- аномальное потребление CPU,
- изменения частоты выполнения.
История развёртываний
Всегда спрашивайте:
Что изменилось недавно?
Многие инциденты имеют сильную временную связь с:
- развёртываниями приложений,
- изменениями схемы,
- изменениями конфигурации,
- обновлениями инфраструктуры,
- новыми релизами,
- изменениями безопасности.
Цель — не предполагать, что последнее изменение вызвало инцидент.
Цель — определить, коррелируют ли события.
6. Избегайте начинать с инструмента
Один из распространённых шаблонов диагностики: «Откройте мониторинг». Или: «Выполните этот запрос». Или: «Проверьте этот журнал».
Инструменты необходимы, но инструменты должны следовать за стратегией расследования. Расследование должно определять, какой инструмент нам нужен. А не наоборот.
Если проблема в аутентификации, путь расследования может сосредоточиться на:
- ошибках входа,
- конфигурации аутентификации,
- поставщиках удостоверений,
- сопоставлениях пользователей,
- строках подключения.
Если проблема в производительности, расследование может сосредоточиться на:
- Query Store,
- ожиданиях,
- блокировках,
- планах выполнения,
- использовании ресурсов.
Если проблема в связности, мы можем исследовать:
- DNS,
- сетевые пути,
- брандмауэры,
- драйверы,
- повторы подключений,
- пулы соединений.
Чёткое определение проблемы говорит нам, куда смотреть.
7. Задавайте одни и те же вопросы каждый раз
Одно из самых эффективных улучшений, которое могут сделать команды, — стандартизировать первые вопросы, задаваемые во время инцидентов.
Простой начальный контрольный список может быть таким:
- Симптом: что именно отказывает?
- Масштаб: кто или что затронуто?
- Временная шкала: когда это началось?
- Ошибка: какое точное сообщение об ошибке или код ошибки возвращается?
- Частота: проблема непрерывна, периодична или уже восстановилась?
- Изменения: что изменилось непосредственно перед инцидентом?
- Доказательства: какие источники телеметрии могут подтвердить поведение?
Эти вопросы намеренно просты.
Во время инцидента высокой степени серьёзности простота ценна.
8. Структура первых 60 секунд
Мы можем обобщить подход в четырёх шагах.
- Определи: что на самом деле означает заявленный симптом?
- Определи масштаб: определите радиус поражения.
- Временная шкала: определите точно, когда возникла проблема.
- Сопоставь: свяжите симптом с телеметрией, событиями и недавними изменениями.
Только после этих шагов следует определять более глубокий путь диагностики.
9. Скорость важна, но направление важнее
Во время критических инцидентов команды естественно хотят двигаться быстро. Это правильный инстинкт.
Но скорость без направления может создать шум. Десять инженеров, исследующих десять разных теорий одновременно, могут создать огромную активность, не производя ясности. Хорошо определённый инцидент позволяет командам рационально и по умному разделить расследование на части.
Например:
- Один инженер исследует телеметрию приложения.
- Другой проверяет телеметрию базы данных.
- Третий просматривает события платформы.
- Четвёртый исследует недавние развёртывания.
- Пятый строит временную шкалу инцидента.
Все они теперь исследуют одну и ту же определённую проблему.
Это очень отличается от того, когда каждый независимо пытается определить, в чём может быть проблема.
Чеклист от DeepSeek
Древовидная структура: остановись → определи масштаб → построй временную шкалу → сопоставь → действуй
1. ОСТАНОВИСЬ
Цель: превратить расплывчатое «база данных упала» в точную формулировку проблемы.
- ▸ Что именно отказывает?
- ▸ Новые соединения не устанавливаются
- ▸ Существующие соединения работают, новые — нет
- ▸ Запросы превышают тайм-аут
- ▸ Конкретный логин не аутентифицируется
- ▸ Одна база данных недоступна
- ▸ Одно приложение отказывает, другие работают
- ▸ Деградация производительности
- ▸ HTTP 500 при здоровой базе
- ▸ Соединения терпят неудачу периодически
- ▸ Идёт отработка отказа
- ▸ Проблемы DNS или сети
- ▸ Сформулируй точное утверждение
- ▸ ❌ «База данных упала»
- ▸ ✅ «С 14:32 UTC новые подключения приложения A к БД A периодически терпят неудачу с ошибками входа, существующие сеансы активны»
- ▸ Зафиксируй в формулировке
- ▸ Временную метку
- ▸ Конкретную базу данных
- ▸ Конкретный симптом
- ▸ Затронутое поведение соединений
- ▸ Характер проявления (постоянный / периодический / восстановился)
2. ОПРЕДЕЛИ МАСШТАБ (радиус поражения)
Цель: немедленно исключить целые категории возможных причин.
- ▸ Пользователи
- ▸ Один пользователь или все?
- ▸ Конкретная учётная запись или все логины?
- ▸ Приложения
- ▸ Одно приложение или несколько?
- ▸ Все экземпляры или конкретный хост?
- ▸ Конкретные клиенты или драйверы?
- ▸ Базы данных
- ▸ Одна база или все?
- ▸ Конкретный сервер или весь кластер?
- ▸ Все типы соединений?
- ▸ Проверка гипотезы через контраст
- ▸ Приложение B подключается? → проблема не в сервере
- ▸ SSMS подключается? → проблема не в базе
- ▸ Метрики показывают доступность? → проблема вне платформы
- ▸ Существующие сеансы работают? → проблема в установлении новых соединений
3. ПОСТРОЙ ВРЕМЕННУЮ ШКАЛУ
Цель: превратить часы логов в сфокусированное окно в несколько секунд.
- ▸ Зафиксируй ключевые моменты
- ▸ Когда началось?
- ▸ Точная временная метка?
- ▸ Как долго длилось?
- ▸ Непрерывно или периодически?
- ▸ Восстановилось автоматически?
- ▸ Один раз или несколько?
- ▸ Что было непосредственно перед?
- ▸ Формат хорошей шкалы
14:31:52 UTC – нормальная работа 14:32:08 UTC – первая ошибка соединения 14:32:10 UTC – обнаружена отработка отказа 14:32:14 UTC – дополнительные сбои входа 14:32:18 UTC – новые соединения успешны 14:32:20 UTC – полное восстановление
4. СОПОСТАВЬ (корреляция)
Цель: найти событие, совпавшее по времени с инцидентом.
- ▸ Источники корреляции
- ▸ Развёртывания приложений
- ▸ Изменения инфраструктуры
- ▸ Изменения конфигурации
- ▸ Отработки отказа базы данных
- ▸ Операции масштабирования
- ▸ События обслуживания
- ▸ Изменения брандмауэра
- ▸ Изменения аутентификации
- ▸ Сетевые события
- ▸ Изменения DNS
- ▸ Использование ресурсов (CPU, память, I/O)
- ▸ Регрессии запросов
- ▸ Блокировки и взаимоблокировки
- ▸ Поведение пула соединений
- ▸ Обновления драйверов
- ▸ События платформы
- ▸ Правило корреляции
- ▸ ⚠️ Не предполагай, что последнее изменение — причина
- ▸ ✅ Проверяй, совпадают ли события по времени
5. ИСТОЧНИКИ ДОКАЗАТЕЛЬСТВ
Цель: собрать данные из нескольких независимых систем до внесения изменений.
- ▸ Телеметрия приложения
- ▸ Сбои соединений
- ▸ Ошибки аутентификации
- ▸ Задержка запросов
- ▸ Попытки повтора
- ▸ Исключения тайм-аута
- ▸ Ошибки HTTP
- ▸ Сбои зависимостей
- ▸ Метрики платформы
- ▸ Доступность сервиса
- ▸ Использование CPU
- ▸ Давление на хранилище
- ▸ Количество соединений
- ▸ Троттлинг
- ▸ Насыщение ресурсов
- ▸ Телеметрия базы данных
- ▸ Активные сеансы
- ▸ Ожидания (wait stats)
- ▸ Блокировки
- ▸ Производительность запросов
- ▸ Сбои входа
- ▸ События отработки отказа
- ▸ Статистика ресурсов
- ▸ Query Store
- ▸ Регрессии запросов
- ▸ Изменения планов
- ▸ Рост длительности выполнения
- ▸ Аномальное потребление CPU
- ▸ Изменения частоты выполнения
- ▸ История развёртываний
- ▸ Развёртывания приложений
- ▸ Изменения схемы
- ▸ Изменения конфигурации
- ▸ Обновления инфраструктуры
- ▸ Новые релизы
- ▸ Изменения безопасности
6. ВЫБОР ИНСТРУМЕНТА ПО СИМПТОМУ
Правило: стратегия расследования определяет инструмент, а не наоборот.
- ▸ Проблема аутентификации
- ▸ Ошибки входа
- ▸ Конфигурация аутентификации
- ▸ Поставщики удостоверений
- ▸ Сопоставления пользователей
- ▸ Строки подключения
- ▸ Проблема производительности
- ▸ Query Store
- ▸ Ожидания (wait stats)
- ▸ Блокировки
- ▸ Планы выполнения
- ▸ Использование ресурсов
- ▸ Проблема связности
- ▸ DNS
- ▸ Сетевые пути
- ▸ Брандмауэры
- ▸ Драйверы
- ▸ Повторы
- ▸ Пулы соединений
7. СТАНДАРТНЫЕ ВОПРОСЫ (чеклист на каждый инцидент)
- ▸ Симптом: что именно отказывает?
- ▸ Масштаб: кто или что затронуто?
- ▸ Временная шкала: когда это началось?
- ▸ Ошибка: какое точное сообщение или код?
- ▸ Частота: непрерывно, периодически или восстановилось?
- ▸ Изменения: что изменилось непосредственно перед?
- ▸ Доказательства: какие источники телеметрии подтверждают поведение?
8. ПРАВИЛА ДЕЙСТВИЙ
- ▸ ДО изменений
- ▸ ✅ Собери доказательства
- ▸ ✅ Зафиксируй временную шкалу
- ▸ ✅ Определи масштаб
- ▸ ✅ Проверь корреляции
- ▸ ПОСЛЕ определения проблемы
- ▸ ✅ Раздели расследование между инженерами
- ▸ ✅ Каждый исследует свою область одной проблемы
- ▸ ✅ Вноси изменения только при необходимости
- ▸ ✅ Помни: перезапуск удаляет доказательства
- ▸ Чего избегать
- ▸ ❌ Начинать с открытия инструмента
- ▸ ❌ Менять что-либо до сбора доказательств
- ▸ ❌ Десять инженеров — десять разных теорий
- ▸ ❌ Предполагать, что последнее изменение — причина
9. СТРУКТУРА ПЕРВЫХ 60 СЕКУНД
┌─────────────────────────────────────────────┐
│ 1. ОПРЕДЕЛИ │
│ Что на самом деле означает симптом? │
├─────────────────────────────────────────────┤
│ 2. ОПРЕДЕЛИ МАСШТАБ │
│ Радиус поражения │
├─────────────────────────────────────────────┤
│ 3. ПОСТРОЙ ВРЕМЕННУЮ ШКАЛУ │
│ Точное окно события │
├─────────────────────────────────────────────┤
│ 4. СОПОСТАВЬ │
│ Телеметрия + события + изменения │
├─────────────────────────────────────────────┤
│ ▼ │
│ Только теперь — глубокое расследование │
└─────────────────────────────────────────────┘
10. РАСПРЕДЕЛЕНИЕ РОЛЕЙ В КОМАНДЕ
После определения проблемы:
- ▸ Инженер 1 → телеметрия приложения
- ▸ Инженер 2 → телеметрия базы данных
- ▸ Инженер 3 → события платформы
- ▸ Инженер 4 → недавние развёртывания
- ▸ Инженер 5 → построение временной шкалы
Все исследуют одну определённую проблему, а не десять разных гипотез.
Скорость важна, но направление важнее. Точная формулировка проблемы сокращает пространство расследования в разы.

Комментариев нет:
Отправить комментарий