Добавить в корзинуПозвонить
Найти в Дзене
◼ ОБО ВСЁМ ◼

Как Борис стер базу данных крупного ритейлера и что из этого вышло

Когда Борис нажал кнопку «Удалить базу данных», в московском офисе наступила гробовая тишина. Ошибка стоимостью в годовой бюджет компании произошла из-за обычной невнимательности. Но самое интересное началось потом... Шел третий час ночи. Офис крупного маркетплейса на тридцатом этаже «Башни на Набережной» в Москва-Сити был пуст, если не считать дежурную смену системных администраторов и Бориса — ведущего инженера по автоматизации. За плечами у Бориса было тридцать шесть часов без сна. Компания проводила глобальную миграцию данных, и всё, что могло пойти не так, пошло не так еще в девятнадцать ноль-ноль. Борис сидел перед тремя огромными мониторами. Глаза нещадно резало от сухости, а третья за ночь банка энергетика неприятно горчила. В терминале были открыты две вкладки с одинаковым черным фоном. В одной — тестовый контур (песочница, где можно ломать всё что угодно), в другой — «прод», живая база данных, через которую в эту самую секунду совершали покупки десятки тысяч людей по всей стр
Оглавление

Когда Борис нажал кнопку «Удалить базу данных», в московском офисе наступила гробовая тишина. Ошибка стоимостью в годовой бюджет компании произошла из-за обычной невнимательности. Но самое интересное началось потом...

Ошибка ценой в миллионы

Шел третий час ночи. Офис крупного маркетплейса на тридцатом этаже «Башни на Набережной» в Москва-Сити был пуст, если не считать дежурную смену системных администраторов и Бориса — ведущего инженера по автоматизации. За плечами у Бориса было тридцать шесть часов без сна. Компания проводила глобальную миграцию данных, и всё, что могло пойти не так, пошло не так еще в девятнадцать ноль-ноль.

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

Борис хотел очистить тестовые таблицы. Он лениво скопировал команду DROP DATABASE..., переключился на соседнее окно, как ему казалось, тестового сервера, и нажал Enter.

Монитор на секунду задумался, а затем выдал короткую зеленую строчку: Query OK, 0 rows affected.

В этот же момент на стене отдела мониторинга вспыхнул огромный экран. График успешных заказов, секунду назад напоминавший ровное плато, вертикально рухнул вниз. Значение упало до нуля.

Сидевший рядом дежурный админ Игорь замер с кружкой кофе в руке. Медленно, очень медленно он повернул голову к Борису.

— Борь... ты сейчас что сделал?
— Базу в тесте чистанул, — глухо ответил Борис, но в груди уже начал разрастаться холодный, липкий ком.
— Борь, тест на порту 8080. А ты только что грохнул продакшн. Основной кластер. По всей России.

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

Когда бэкапы превращаются в тыкву

Через пятнадцать минут в офисе были все: от технического директора до генерального. Руководитель IT-департамента, Эдуард, влетел в кабинет в расстегнутом пальто поверх домашней футболки.

-2

— Сколько? — коротко спросил он, глядя на пустые графики.
— Всё, Эдуард Сергеевич. Чистый лист. Приложения лежат, сайт выдает 500-ю ошибку, — доложил Игорь.
— Разворачивайте бэкапы. Живо. Потери за пару часов бизнес нам простит.

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

Когда Игорь попытался запустить восстановление из резервной копии, сервер выдал ошибку: Backup file is corrupted.

Оказалось, что полгода назад один из архиваторов обновили, и всё это время система создавала «битые» файлы бэкапов. Никто этого не замечал, потому что автоматическую проверку восстановления никто так и не настроил. Компания жила в иллюзии безопасности, пока Борис не нажал злополучную кнопку.

Генеральный директор, суровый мужчина по имени Виктор Петрович, молча смотрел на цифры убытков, которые обновлялись на его планшете в реальном времени. Каждая минута простоя обходилась компании в сотни тысяч рублей. Прямо сейчас горели рекламные бюджеты, логистические центры в Подмосковье и Новосибирске встали, потому что кладовщики не видели, куда отгружать товар. Годовой бюджет развития компании таял на глазах.

— Ну что, господа инженеры, — тихо сказал Виктор Петрович. — Мы банкроты? Кто виноват, я уже вижу по лицу. Вопрос — что делать?

Безумный план в четыре утра

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

— Есть один шанс, — хриплым от сигарет и энергетика голосом произнес Борис.
— Говори, — Эдуард Сергеевич скрестил руки на груди.
— Три дня назад я разворачивал локальную реплику базы на одном из старых серверов в подвале нашего офиса. Я тестировал там новые индексы для аналитиков. Данные там не первой свежести, отстают дня на три. Но это лучше, чем ничего.

— Три дня? — закричал коммерческий директор. — Да за три дня у нас прошли сотни тысяч транзакций! Как мы восстановим остальное?

-3

— По логам, — Борис поднял глаза и посмотрел прямо на генерального. — Логи транзакций шлюзов оплаты хранятся на сторонних серверах банков-партнеров. Плюс у нас есть сырые логи веб-серверов в Yandex Cloud, они не пострадали. Если написать скрипт, который распарсит эти логи и «накатит» все действия пользователей за последние 72 часа поверх моей старой копии, мы восстановим базу.

— Сколько времени нужно на скрипт? — спросил Виктор Петрович.
— В нормальных условиях — неделя. У меня есть три часа до открытия Сибири, пока там не проснулись региональные склады.

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

— Делай, — коротко отрезал генеральный директор. — Терять нам всё равно уже нечего. Игорь, помогай ему.

Хроники кодинга на выживание

Следующие три часа Борис не помнил. Пальцы летали по клавиатуре со скоростью пулемета. Код на Python рождался прямо из головы, без черновиков и тестирования. Игорь тем временем связывался с техподдержкой банка, выбивая из них выписки по транзакциям в формате JSON.

Вокруг Бориса стояли люди: топ-менеджеры, начальники отделов, сисадмины. Никто не уходил. Атмосфера напоминала Центр управления полетами во время критической аварии на орбите.

В пять тридцать утра скрипт был запущен. На экранах поползли миллионы строк логов. Первые сто тысяч операций прошли успешно. На двухсоттысячной скрипт споткнулся об измененный формат данных одного из банков. На часах было 05:45. Борис переписал регулярное выражение за сорок секунд прямо «на горячую». Скрипт продолжил работу.

В 06:15 Сибирь начала просыпаться. На склады начали приходить первые машины за товаром.

В 06:40 скрипт завершил работу. Борис нажал комбинацию клавиш проверки целостности таблиц. На экране появилось долгожданное: Verification successful. 0 errors found.

-4

— Запускай фронтенд, — прошептал Борис Игорю.

Игорь кликнул мышкой. График мониторинга ожил. Сначала робко, а затем всё увереннее кривая заказов поползла вверх. Пошли первые транзакции из Владивостока и Хабаровска. База данных была восстановлена на 99,8%. Были потеряны данные всего о нескольких десятках корзин, которые пользователи собирали именно в момент падения.

Почему Бориса не уволили?

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

К его столу подошел Виктор Петрович. Генеральный директор молча посмотрел на убирающего вещи инженера, а затем положил руку ему на плечо.

— Куда собираешься, Борис?
— Писать заявление, Виктор Петрович. По собственному. Я же понимаю...
— Какое заявление? — искренне удивился директор. — Я только что инвестировал в твое обучение несколько миллионов рублей простоя компании. Теперь ты — единственный человек в этой фирме, который точно знает, почему нельзя держать открытыми две одинаковые вкладки терминала, и как поднять бизнес из пепла за три часа.

Борис замер с кружкой в руке.

— С завтрашнего дня, — продолжил Виктор Петрович, — ты назначаешься руководителем отдела архитектуры безопасности данных. Твоя первая задача — сделать так, чтобы бэкапы проверялись каждый день, а на боевые серверы нельзя было зайти без тройного подтверждения и под присмотром коллеги. Иди спать, архитектор.