@immelnikoff
Изучаю БД

Очень быстро лить в БД 1 млн. строк в секунду и настолько же быстро читать их. Как лучше осуществить?

Необходимо:
- лить в таблицу (ticker, price, quantity, oper) ежесекундно ~1 млн. строк (каждая строка идет отдельным INSERT-ом),
- при этом 100-1000 раз в секунду производятся SELECT-ы на выбор вновь прибывших строк.
Важно, чтобы не просто работало.
Очень важно:
- минимизировать время от поступления TCP-пакетов с данными на сетевой интерфейс до получения результата SELECT'а с этими же данными,
- иметь какую-то гарантию (возможно с вероятностью ~0.995), что время между поступлением данных по сети до получения результатов SELECT-а с этими же данными будет не больше некого достаточно малого ε .
Вопросы:
Можно ли это осуществить с помощью MySQL, PostgreSQL или другой классической реляционной СУБД?
Будет ли проффит по времени от использования колоночных СУБД (InfluxDB, ClickHouse, что-то ещё)?
Будет ли быстрее забирать данные с сетевого интерфейса напрямую, минуя БД, а уже после обработки во время простоя ресурсов складывать их в БД? Насколько это будет быстрее?
  • Вопрос задан
  • 2453 просмотра
Решения вопроса 1
@rPman
лить в таблицу (ticker, price, quantity, oper) ежесекундно ~1 млн. строк
колись, у какого брокера и за какие деньги ты получаешь эти данные такого объема?

Есть данные типа level2/3 (когда вместе с событиями trade тебе льют depth update, изменения в стакане или сами события в стакане, это данные дорогие, доступ на большом рынке тебе дадут только с машины в датацентре брокера, где надо платить еще и дорогую аренду сервера. В мире криптовалют эти данные пока бесплатны, к примеру один binance (крупнейший поставщик биржевых событий, сравним с ними coinbase точнее gdax остальные в сумме наверное от силы столько же дадут) и тот дает порядка 4 тысяч событий в секунду, максимум что я от них видел.

По теме вопроса, всегда, в первую очередь нужно задавать вопрос не как и где хранить данные а как ты их будешь читать. Судя по теме с высокой вероятностью тебе не нужены отдельные случайные события, а нужны данные блоками, на интервале, поэтому и в базе хранить данные лучше этим блоками (вот тут уже надо считать, проводить бенчи на основе твоих данных и твоих мощностей), скорее всего тебе хватит почасовые массивы, тогда при любом запросе потока на момент времени x-y тебе нужно читать минимум две записи, это сотни миллисекунд, плюс фильтрация, на эту уходят десятки миллисекунд даже на php, если в базе данные удобно сериализованы, дольше передавать и обрабатывать будешь.

Голову потока данных (текущая минута-час) храни в локальном кеше бакэнда, в памяти, чтобы эти данные выдавать сразу но маловероятно что тебе это нужно, обычно нужна агрегация а не сырые данные.

Так вот, хранить данные можно буквально в файлах, файловая система - отличная key value база данных (дели по файлам и каталогам на основе валютной пары, биржи, и временного интервала, но на время лучше индекс заводить), работать с такой базой неудобно только при обслуживании (backup/restore) но если изначально организовать хранилище в отдельном разделе, то и работать с ним напрямую.

Одно время я хранил данные в gzip json, но недавно открыл для себя igbinary, чудесная вещь, бинарный при этом тоже пакуется, файлы храни на btrfs со включенным сжатием zstd ultra.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Выглядит так, будто вам нужно что-нибудь вроде Kafka.
Ответ написан
Комментировать
@Yury093
Конечно может, вопрос в железе. И микроскопом можно забить гвоздь.
Но на слова "хочу быстро вставлять и быстро читать потоком" так и хочется ответить "а зачем тебе БД?"

Поэтому хотелось бы уточнить у автора: а вот кроме описанного "вставить миллион, считать миллион" - что предполагается делать с данными? Менять их построчно? Искать по какому-то ключу? это все надо? Если нет - я бы все же рекомендовал не использовать БД.

Тут следует понимать что любая нормальная БД это [почти] всегда двойная запись на диск: вы пишите в таблицу И в лог базы данных. Именно поэтому файл или Kafka или иной MQ будет всегда быстрее.

Ну а если БД все равно нужно - ну тогда BULK режимы вам в помощь. Обычно они используются для пакетной инициализирующей загрузки. В некоторых БД они на время своей работы могут отключать какие-то фичи или даже логирование в лог транзакций.
----------------------------
Вообще по всем признакам в вашем случае идеальным будет вариант писать в MQ (RabbitMQ или Kafka или см аналоги), а уже из нее в БД. "Все так делают", по крайней мере в крупных компаниях это довольно типовое решение для подобных вашей задач. Причем БД в этой истории нужна только если вам потом нужно хранить и селектить. Если после первой операции данные вам более не нужны, либо нужен только бэкап, то БД не нужна - пишите в файл, пакуйте в zip (в энтерпрайзе - кидайте файлы в Hadoop в каком нибудь Parquet формате).
Ответ написан
ushliy
@ushliy
nix-админ
ИМХО, про Clickhouse незаслуженно забыли, если нужно хранить и какую-то аналитику использовать. А ведь он реально не тормозит, скорость сравнима с простым сбросом сырых логов на диск. Горячие данные на SSD или вовсе в памяти, во временных таблицах можно держать. Главное, батчами вставлять данные, но мелкие вставки ни одна база по моему не любит. Если для гарантированной доставки кафка или кролик будет юзаться - они нативно поддерживаются, но следует учитывать, что дополнительный слой == дополнительные просадки по времени.

если нужно хранить условно за час, то и вовсе стоит смотреть на Aerospike, да и вообще, если этот же час нужно держать в близком доступе, он будет полезен. его незаслуженно мало упоминают в русскоязычном сообществе, а по факту он на голову превосходит всякие редисы, даже бесплатная версия. А также он умеет в постоянное хранение, комбинированное и даже с диском, как с блочным устройством напрямую работать, без ФС

Инфлюкс - он и вовсе про другое, это временные ряды, метрики. Как и Prometheus и Victoriametrics

P.S.: не ради срача и троллинга, но все же староверов, которые в файловой системе хранить все предлагают, мне хочется спросить: Господа хорошие, а вы свои проекты наверно до сих пор храните в виде Новая_Папка, Новая_Папка1, Новая_Папка2 и т.д.? Нужно все таки смотреть на алгоритмы записи, работы с железом и прочее, они меняются и развиваются. Ваш, да и мой тоже 2007 не вернуть
Ответ написан
Комментировать
@ComodoHacker
>Будет ли быстрее забирать данные с сетевого интерфейса напрямую, минуя БД, а уже после обработки во время простоя ресурсов складывать их в БД?

Скорее всего, так и нужно делать.
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
НЕ экспертное мнение: Вроде как раз для таких гибридных задач писали тарантул, горячая часть бд в памяти, холодная катается на диск. Имхо как раз ваш случай...
Ответ написан
@Afatar
kafka или elasticsearch
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы