Введение
Инвесторы, трейдеры и аналитики давно поняли: данные — это новая нефть. Но что делать, когда эта нефть накапливается четверть века? Хранение 25 лет истории стоимости акций — задача нетривиальная. Это терабайты временных рядов, миллиарды записей и постоянный поток новых данных. Недавно на Habr появилась статья, в которой разработчики поделились своим опытом построения такой системы на трёх разных технологиях: MinIO, MongoDB и PostgreSQL. Материал вызвал бурное обсуждение в сообществе, и это неудивительно — выбор правильного хранилища для исторических финансовых данных напрямую влияет на скорость анализа и стоимость инфраструктуры.
Проблема: объём и скорость
Финансовые данные — это не просто цифры. Каждая запись о стоимости акции включает в себя дату, время, цену открытия, закрытия, максимум, минимум, объём торгов. За 25 лет набегает внушительный массив. В статье авторы отмечают, что основная сложность заключалась не только в хранении, но и в обеспечении быстрого доступа к историческим срезам. Типичный запрос выглядит так: «Покажи динамику цены акции Apple за последние 10 лет с шагом в 1 день». Без правильной архитектуры такой запрос может выполняться минутами, что неприемлемо для аналитики.
Решение: три подхода к хранению
Разработчики решили не выбирать что-то одно, а протестировать три популярные системы — MinIO, MongoDB и PostgreSQL. Каждая из них заняла свою нишу.
MinIO: холодное хранение сырых данных
MinIO — это S3-совместимое объектное хранилище. Оно идеально подходит для хранения «сырых» данных в формате Parquet или CSV. В статье описывается, как MinIO использовали для бэкапов и долгосрочного архива. Данные за 25 лет занимают относительно немного места благодаря сжатию. Главный плюс — низкая стоимость хранения и возможность масштабирования до петабайт. Однако для оперативных аналитических запросов MinIO не подходит — время доступа к отдельной записи слишком велико.
MongoDB: гибкость для временных рядов
MongoDB — документо-ориентированная база данных. Разработчики применили её для хранения «горячих» данных последних 5 лет. Одна запись — один документ с датой и массивом цен за день. MongoDB позволяет быстро выбирать данные по диапазону дат и агрегировать их на стороне сервера. Результаты тестов показали, что MongoDB справляется с выборкой 10 лет истории за 2-3 секунды, если правильно настроены индексы. Но есть нюанс: при большом количестве одновременных запросов производительность падает.
PostgreSQL: надёжность и SQL
PostgreSQL использовали как эталон. Реляционная модель с чёткой схемой таблиц — классика для финансовых данных. Разработчики создали таблицу с партиционированием по годам. Это ускорило запросы: выборка за 5 лет занимала менее 1 секунды. PostgreSQL также обеспечила строгую целостность данных — никаких дубликатов или пропусков. Однако при попытке загрузить все 25 лет в одну таблицу без партиционирования производительность резко падала.
Сравнение производительности
В статье приведены конкретные цифры. Для чистоты эксперимента использовались одинаковые наборы данных — 5 млрд записей за 25 лет. Тестировался запрос на получение средней цены закрытия за каждый год для трёх случайных акций.
| Система | Время выполнения | Примечание |
|---|---|---|
| MinIO | 45 сек | Чтение Parquet через Presto |
| MongoDB | 2.3 сек | С агрегацией на стороне БД |
| PostgreSQL | 0.8 сек | С партиционированием по годам |
Вывод: PostgreSQL оказался быстрее для точных SQL-запросов, MongoDB — удобнее для гибкой схемы, MinIO — дешевле для хранения.
Как это применить на практике
Для тех, кто строит свою систему хранения финансовых данных, авторы статьи советуют гибридный подход:
- MinIO — для хранения исходных данных и бэкапов.
- MongoDB или PostgreSQL — для оперативной аналитики.
- Связка через ETL-процессы, которые периодически перекладывают данные из MinIO в БД.
Это снижает стоимость хранения и ускоряет запросы. Например, данные до 2020 года можно хранить только в MinIO, а последние 5 лет — в MongoDB. При необходимости старые данные загружаются из MinIO по запросу.
Заключение
25 лет истории акций — это не предел. С ростом количества инструментов и частоты торгов объёмы будут только расти. Выбор между MinIO, MongoDB и PostgreSQL зависит от приоритетов: скорость, стоимость или гибкость. Лучший вариант — комбинация всех трёх систем, как показано в статье на Habr. Такой подход позволяет получить и быстрые ответы на запросы, и надёжное долгосрочное хранение.
Если вы работаете с финансовыми данными и хотите автоматизировать сбор и анализ, обратите внимание на инструменты, которые умеют подключаться к разным источникам. ASI Biont поддерживает подключение к MongoDB и PostgreSQL через API — подробнее на asibiont.com/courses. Это может упростить интеграцию исторических данных в вашу аналитическую систему.
Комментарии