Ведётся с октября 2019

Разбор инцидента: двадцать шесть минут неудачных входов, 19 января 2026

Изменение хранилища сессий, которое мы классифицировали как конфигурацию, заблокировало всем клиентам вход в панель и API на двадцать шесть минут. Запущенные инстансы не пострадали.

Сводка

19 января 2026 года, с 14:02 до 14:28 UTC, примерно две трети всех попыток входа в панель или аутентификации через API завершались ошибкой. Существующие сессии также аннулировались случайным образом. Работающие инстансы, их сеть и трафик оставались нетронутыми на протяжении всего времени. Подготовка инстансов приостановилась на двадцать шесть минут, а затем очередь рассосалась; ни один заказ не потерян.

Хронология

Все время UTC, 19 января 2026.

ВремяСобытие
14:02Изменение схемы токена сессии применено к control plane. Развертывание помечено как конфигурация, поэтому оно ушло на все шесть узлов панели одновременно.
14:03Уровень ошибок при входе вырос с почти нуля до 61%. Автоматические оповещения имеют двухминутное окно и пока не срабатывают.
14:06Сработало оповещение. Вызван дежурный инженер.
14:08Первый ответивший инженер видит уровень ошибок, но в журнале кода нет деплоя, и начинает смотреть базу данных.
14:14Подключается второй инженер, проверяет журнал изменения конфигурации, а не журнал кода, и находит запись 14:02.
14:16Причина понятна: два узла проверяют токены старым чтением.
14:19Начат откат.
14:24Токены выпускаются и проверяются корректно на всех шести узлах. Уровень ошибок падает до нуля.
14:28Очередь заданий на подготовку рассасывается. Восстановление завершено.
15:10Страница статуса обновлена. На 42 минуты позже — это отдельный сбой, и он рассмотрен ниже.

Корневая причина

Токен сессии получил новое поле. Писатели сразу стали использовать новый формат; читатель на двух из шести узлов панели не был перезапущен и отвергал всё, содержащее новое поле. Запросы распределяются по всем шести узлам, поэтому сессия, созданная на новом узле, с вероятностью примерно один к трём проверялась старым при каждом запросе. Результат выглядел как перемежающаяся ошибка, из-за чего первые шесть минут диагностики были посвящены базе данных, а не журналу деплоев.

Более глубокая причина — правило, которое мы написали в 2023 году. Изменения, затрагивающие файл схемы, а не код приложения, были классифицированы как конфигурация, и для конфигурации канареечная стадия (canary) пропускалась на том основании, что это, цитата, «просто значения». Это правило было разумным, когда файлами схемы были только флаг-фичи. Никто не пересмотрел его, когда определение файла схемы расширилось, и это изменение было корректно классифицировано по правилу, которое тихо перестало быть правильным.

Это не ошибка инженера, который его применил. Классификация была выполнена точно так, как написано.

Радиус поражения

  • Входы в панель: 61% отказов в течение 26 минут.
  • API-токены: такой же уровень отказов в том же окне. Идемпотентные ключи гарантировали, что повторные создания не дублировались.
  • Работающие инстансы: не затронуты. Не было потерь пакетов, перезагрузок или влияния на хранилище.
  • Подготовка инстансов: приостановлена, но не провалена. Четыре заказа, попавшие в окно, завершились к 14:28.

Что мы изменили

  1. Канареечная стадия теперь безусловна. Всё, что развертывается, любого класса, сначала отправляется на один узел на пять минут с синтетическим трафиком до того, как пойти куда-либо ещё. Сделано 21 января.
  2. Читатели принимают предыдущий формат в течение 30 дней. Проверка токенов теперь явно версионируется с перекрывающимся окном, так что частично развернутое изменение деградирует до полного отсутствия. Сделано 23 января.
  3. Синтетический вход выполняется каждые 15 секунд из-за пределов нашей сети, в трёх регионах, и вызывает оповещение на второй подряд сбой, а не после двухминутного окна усреднения. Сделано 22 января.
  4. Страница статуса публикуется автоматически при двукратном сбое синтетического входа, не дожидаясь, пока человек напишет текст. Человеческий текст следует за этим. Сделано 26 января.

Что мы не изменили и почему

Мы по-прежнему не логируем IP-адреса клиентов или тела запросов для трафика панели. Наличие их позволило бы сразу увидеть распределение один к трём между узлами и, вероятно, сэкономило бы девять минут. Девять минут не стоят постоянной записи о том, откуда каждый клиент входит в систему. Таблица срока хранения на странице логирования остаётся без изменений.

Мы не переносили сессии в общее хранилище на все сайты. Единое хранилище сессий, охватывающее все сайты, решило бы проблему смешанных читателей, используя только один читатель. Оно также создало бы именно ту централизованную, постоянно горячую запись о том, кто к чему подключён, которую мы шесть лет не строим.

Мы не добавили канал объявления об инцидентах вне страницы статуса. Несколько человек предложили социальные сети. Страница статуса — единственное, чем мы управляем и можем гарантировать её точность; добавление второй поверхности означает вторую поверхность, которая будет устаревать.

Компенсация

SLA покрывает доступность инстансов. Инстансы были доступны все 26 минут, поэтому по контракту кто-либо не должен был получить компенсацию. Мы применили кредит на один день каждому аккаунту, который имел неудачную аутентификацию в этом окне, что составило около трёх тысяч ста евро, потому что спорить о различии с людьми, которые не могли подключиться к своим серверам, — худшее использование чьего-либо вечера.

Готовы, когда вы готовы

Выберите город. Выберите размер. Оплатите монетой.

Никаких форм о том, кто вы, никакого ожидания одобрения человеком, никаких звонков для проверки. Счёт оплачен — и учётные данные приходят на почту.