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

Разбор инцидента: партия плохой прошивки и зеркало, которое им не было

Сорок один NVMe-диск из одной производственной партии перестал отвечать при одинаковом количестве часов работы. Два клиентских инстанса потеряли данные, и ошибка с партией полностью наша.

Итог

С 29 октября по 1 ноября 2024 года сорок один корпоративный NVMe-диск в четырёх центрах обработки данных перестал принимать команды при фиксированном количестве часов наработки — дефект прошивки в одной производственной партии. Зеркалирование поглотило тридцать девять из этих отказов без влияния на клиентов. Один узел в Варшаве потерял обе половины зеркала в течение сорока минут, потому что оба диска были из одной партии и установлены в один день. Два экземпляра на этом узле потеряли данные. Эта вторая часть была нашей виной, а не виной вендора.

Хронология

Всё время UTC.

ВремяСобытие
29 окт 03:11Диск отключается от шины на варшавском узле. Зеркало деградирует, горячий резерв начинает перестройку. Обыденно, без пейджера.
29 окт 03:49Второй диск в том же зеркале отключается. Узел теряет корневой пул и останавливается.
29 окт 03:52Срабатывает пейджер. Дежурный на связи в 03:55.
29 окт 04:20Узел признан невосстановимым на месте. Перестройка с горячего резерва невозможна; резерв был в процессе перестройки с источника, который больше не отвечает.
29 окт 05:40Инженер, просматривая журналы дисков, замечает, что два отказа разделены восемнадцатью часами наработки, а не восемнадцатью месяцами. Подозрение переходит от невезения к когорте.
29 окт 06:15Общепарковый запрос по идентификатору партии и часам наработки. В поражённой партии двести шесть дисков. Тридцать один уже прошёл счётчик и отказал; остальные находятся от сорока до девятисот часов до него.
29 окт 07:30Связь с вендором. Дефект подтверждён в течение четырёх часов: счётчик в телеметрии выравнивания износа переполняется при 1 536 часах наработки и заклинивает контроллер. Исправление прошивки, решающее проблему, было выпущено тихо шестью неделями ранее.
29 окт 09:00Начинается роллинг-обновление прошивки, приоритет по оставшимся часам.
30 окт 22:40Последний диск в партии обновлён или заменён.
1 ноя 14:00Поражённые экземпляры клиентов восстановлены или возвращены средства.

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

Две причины, и только одна из них принадлежит производителю дисков.

Их: счётчик телеметрии переполнился при фиксированном количестве часов наработки и подвесил контроллер. Диск переживает цикл питания, возвращается и снова заклинивает в течение минут. Данные на пластинах целы и недоступны, что является худшим сочетанием для любого, кто пытается диагностировать это в четыре утра.

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

Мы знали об этом в принципе годами. Никто не записал это в процедуру сборки, а процедура сборки — это то, чему следуют в два часа ночи под давлением сроков поставки.

Влияние

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

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

  1. Партии закупок разделены. Ни один два диска из одной партии не могут образовать зеркало, а горячий резерв, защищающий пару, поступает из третьей партии. Принудительно инструментарием сборки, а не документом. Сделано 4 ноября.
  2. Оповещение о когорте по часам наработки. Теперь мы оповещаем, когда более четырёх дисков, имеющих одинаковый идентификатор партии, находятся в пределах ста часов друг от друга и приближаются к любому круглому числу часов. Это грубая эвристика, и она поймала бы этот случай за девятнадцать дней до события.
  3. Выдержка прошивки перед производством. Новое семейство дисков проходит две тысячи часов наработки в тестовой стойке, прежде чем несёт данные клиентов. Этот дефект проявился бы на 1 536.
  4. Мы теперь читаем примечания к выпуску прошивок вендора по расписанию. Исправление существовало за шесть недель до того, как оно нам понадобилось. Никому не было поручено смотреть, поэтому никто не смотрел.

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

Мы не сменили семейство дисков или вендора. Дефект был реальным, а раскрытие было плохим, но наша потеря произошла из-за коррелированной пакетной поставки, которую мы бы воспроизвели с любым производителем. Смена показалась бы решительной и ничего бы не исправила.

Резервное копирование вне узла остаётся дополнительной опцией за девять евро за пятьсот гигабайт. Сделать его универсальным означает выставлять счёт каждому клиенту за услугу, которую большинство из них дублируют сами, и мы не собираемся выставлять счёт людям за видимость безопасности. Что изменилось, так это форма заказа, которая теперь прямо указывает, что хранилище экземпляра зеркалируется, а зеркалирование — это не резервная копия, и шаг подтверждения больше не позволяет молча пропустить это предложение.

Мы не перешли на тройное зеркалирование. Это стоит на треть больше за гигабайт и не решает проблему коррелированного отказа, который был фактическим механизмом здесь. Два независимых домена лучше, чем три зависимых.

Два клиента

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

Ни один из этих исходов не был в нашей власти. Единственное, что было в нашей власти, — это правильно построить зеркало, и мы этого не сделали.

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

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

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