В идеальном мире инженера архитектура всегда прекрасна. В реальном мире высоконагруженных систем приходится идти на компромиссы. Одна из фундаментальных проблем, о которой инженер должен думать с самого начала, это жестокий компромисс между скоростью записи и скоростью чтения.
Обычно жертвуют одним ради другого. Но в нашем случае, работая с петабайтами данных в AWS, этот компромисс ударил не по скорости, а по кошельку.
Мы создали систему, которая идеально записывала данные, но каждый раз, когда она читала из архива, бюджет сгорал самым болезненным образом. В конце концов, чтение петабайтов из AWS стоит денег за передачу данных, количество запросов и извлечение из класса хранения... Много денег!
Это история о том, как мы оптимизировали систему, чтобы сделать ее более эффективной и экономичной!
Реальная история: несколько месяцев назад один из наших архитекторов решений хотел получить образец экспорта с редкого, малопосещаемого сайта, чтобы продемонстрировать продукт потенциальному клиенту. Из-за ошибки в API не был применен лимит безопасности на количество файлов.
Поскольку данные для этого "редкого" сайта были разбросаны по миллионам архивов вместе с высоконагруженными сайтами, система попыталась восстановить почти половину всего нашего исторического хранилища, чтобы найти эти несколько страниц.
Эта честная ошибка в итоге стоила нам почти 100 000 $ комиссий AWS!
Я немедленно исправил ошибку API (и добавил строгие ограничения), но архитектурная уязвимость осталась. Это была бомба замедленного действия...
Позвольте рассказать историю архитектуры Веб-архива Bright Data: как я загнал систему в ловушку "дешевого" хранилища и как я выбрался, используя Конвейер перестановки.
Когда я начал работать над Веб-архивом, система уже обрабатывала огромный поток данных: миллионы запросов в минуту, десятки терабайт в день. Фундаментальная архитектура была построена с основной целью: захватить всё без потери данных.
Она опиралась на самую надежную стратегию для высокопроизводительных систем: Журнал только для добавления.
Для фазы приема данных этот дизайн был безупречен. Хранение данных в Deep Archive стоит копейки, а пропускная способность записи практически не ограничена.
Архитектура идеально работала для записи... пока клиенты не начали запрашивать исторические данные. Именно тогда я столкнулся с фундаментальным противоречием:
cnn.com, google.com и shop.xyz.cnn.com за последний год."Здесь кроется ошибка, вдохновившая эту статью. Как и многие инженеры, я привык думать о задержке, IOPS и пропускной способности. Но я упустил из виду модель выставления счетов AWS Glacier.
Я думал: "Ну, извлечение нескольких тысяч архивов медленное (48 часов), но не такое уж дорогое."
Реальность: AWS взимает плату не только за вызов API, но и за объем восстановленных данных ($ за извлеченный ГБ).
Представьте, что клиент запрашивает 1 000 страниц с одного домена. Поскольку логика записи была хронологической, эти страницы могут быть распределены по 1 000 различным TAR-архивам.
Чтобы предоставить клиенту эти 50 МБ полезных данных, происходит катастрофа:
Мы платили за восстановление терабайтов мусора только для извлечения крупиц золота. Это была классическая проблема локальности данных, превратившаяся в финансовую черную дыру.
Я не мог быстро изменить метод приема данных – входящий поток слишком параллельный и массивный, чтобы сортировать его "на лету" (хотя я работаю над этим), и мне нужно было решение, которое работало бы и для уже архивированных данных.
Поэтому я разработал Конвейер перестановки, фоновый процесс, который "дефрагментирует" архив.
Это асинхронный ETL-процесс (Extract, Transform, Load) с несколькими критически важными компонентами:
Выбор: Нет смысла сортировать данные, которые клиенты не запрашивают. Поэтому я направляю все новые данные в конвейер, а также данные, которые клиенты специально просили восстановить. Мы переплачиваем за извлечение в первый раз, но это никогда не происходит во второй раз.
\
Перетасовка (Группировка): Несколько рабочих процессов параллельно загружают несортированные файлы и организуют буферы по доменам. Поскольку система асинхронная, я не беспокоюсь о том, что входящий поток перегрузит память. Рабочие процессы обрабатывают нагрузку в своем темпе.
\
Перезапись: Я записываю отсортированные файлы обратно в S3 под новым префиксом (чтобы отличать отсортированные файлы от необработанных).
2024/05/05/random_id_ts.tar → [cnn, google, zara, cnn]2024/05/05/cnn/random_id_ts.tar → [cnn, cnn, cnn...] MERGE INTO или UPDATE непомерно дорого.Это изменение радикально изменило экономику продукта:
cnn.com, система восстанавливает только те данные, где находится cnn.com.Bright Data масштабирует Веб-архив еще дальше. Если вам нравится:
Тогда я буду рад поговорить.
Мы нанимаем сильных инженеров Node.js, чтобы помочь создать следующее поколение Веб-архива. Наличие опыта в инженерии данных и ETL является большим преимуществом. Не стесняйтесь отправлять свое резюме на [email protected].
Больше обновлений будет по мере того, как я продолжаю масштабировать архив — и по мере того, как я продолжаю находить новые и творческие способы его сломать!
\


