Сводка
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.
Что мы изменили
- Канареечная стадия теперь безусловна. Всё, что развертывается, любого класса, сначала отправляется на один узел на пять минут с синтетическим трафиком до того, как пойти куда-либо ещё. Сделано 21 января.
- Читатели принимают предыдущий формат в течение 30 дней. Проверка токенов теперь явно версионируется с перекрывающимся окном, так что частично развернутое изменение деградирует до полного отсутствия. Сделано 23 января.
- Синтетический вход выполняется каждые 15 секунд из-за пределов нашей сети, в трёх регионах, и вызывает оповещение на второй подряд сбой, а не после двухминутного окна усреднения. Сделано 22 января.
- Страница статуса публикуется автоматически при двукратном сбое синтетического входа, не дожидаясь, пока человек напишет текст. Человеческий текст следует за этим. Сделано 26 января.
Что мы не изменили и почему
Мы по-прежнему не логируем IP-адреса клиентов или тела запросов для трафика панели. Наличие их позволило бы сразу увидеть распределение один к трём между узлами и, вероятно, сэкономило бы девять минут. Девять минут не стоят постоянной записи о том, откуда каждый клиент входит в систему. Таблица срока хранения на странице логирования остаётся без изменений.
Мы не переносили сессии в общее хранилище на все сайты. Единое хранилище сессий, охватывающее все сайты, решило бы проблему смешанных читателей, используя только один читатель. Оно также создало бы именно ту централизованную, постоянно горячую запись о том, кто к чему подключён, которую мы шесть лет не строим.
Мы не добавили канал объявления об инцидентах вне страницы статуса. Несколько человек предложили социальные сети. Страница статуса — единственное, чем мы управляем и можем гарантировать её точность; добавление второй поверхности означает вторую поверхность, которая будет устаревать.
Компенсация
SLA покрывает доступность инстансов. Инстансы были доступны все 26 минут, поэтому по контракту кто-либо не должен был получить компенсацию. Мы применили кредит на один день каждому аккаунту, который имел неудачную аутентификацию в этом окне, что составило около трёх тысяч ста евро, потому что спорить о различии с людьми, которые не могли подключиться к своим серверам, — худшее использование чьего-либо вечера.