БД для исторических данных

kataich

Здравствуйте,
посоветуйте, пожалуйста, какую БД для хранения исторических данных лучше всего развернуть, удовлетворяющую
следующим условиям:
- хочется иметь возможность хранить данные с тиковой частотой на довольно больших
временных промежутках ( до 10 лет).
- быстрота работы при нагрузках (к примеру, каждую секунду происходит добавление/извлечение 200-300 новых/уже существующих элементов)
- возможность соединения со сторонними приложениями (C#)
- конечно, хотелось бы все бесплатно :) .
Я смотрел в три стороны: mysql, mssql compact и kdb+. Читал мнения, что sql не очень подходит
для исторических данных. Но, вполне возможно, что я и не много прошу :)
Буду благодарен за советы практиков.

okis

Давай попробуем разобраться в задаче. У тебя эти данные откуда: результаты эксперимента, импорт из другого источника?
Какие запросы будут к данным? Если много агрегации, то с большой вероятностью подойдёт nosql кластер (mongodb, couchdb).
По предложенным вариантам: mssql compact — упрёшься в 4гб лимит размера (ну, или сколько там).
kdb+ — интересный вариант, но вряд ли кто здесь пробовал с ним работать, эксперименты придётся самостоятельно провести. И по-моему она платная.

AlexV769

Ещё не хватает определения кол-ва тиков в секунду и объема данных за один тик. Чтобы хотя бы примерно оценить объем хранимых данных.

Serab

для истерических

kataich

У тебя эти данные откуда: результаты эксперимента, импорт из другого источника?
Данные, которые сейчас представляют собой набор файлов (по большей части excel
необходимо агрегировать в одном месте. Каждый файл - это данные по одному инструменту,
например, цена определенной акции. Таким образом, файл представляет собой три колонки,
первая - дата, вторая - время, третья - цена. Частота ~ 1 сек.
Какие запросы будут к данным?
Запросы планируются следующие - добавить новую запись по определенному инструменту;
извлечь данные по акции, удовлетворяющие определенным временным промежуткам,
например, конкретный день с 12:00:00 до 12:00:05.
mssql compact — упрёшься в 4гб лимит размера (ну, или сколько там).
Спасибо, что предупредил - 4гб - ни в какие рамки не лезет. Хочется от нескольких терабайт.
kdb+ — интересный вариант, но вряд ли кто здесь пробовал с ним работать, эксперименты придётся самостоятельно провести. И по-моему она платная.
Там есть 32битная - условно бесплатная - но она лишь на 90 дней, после необходимо перерегистрировать/переустанавливать. Поэтому тоже не айс.
А как насчет mysql?

kataich

Спасибо за уточнение.
Пусть 1тик = 1 сек.
Объем данных за 1 тик, 200-300 float'ов.

Marinavo_0507

Запросы планируются следующие - добавить новую запись по определенному инструменту;
извлечь данные по акции, удовлетворяющие определенным временным промежуткам,
например, конкретный день с 12:00:00 до 12:00:05.
Добавлять данные в текстовый файл, каждые сутки новый :grin:

Maurog

какую БД для хранения исторических данных лучше всего развернуть
http://www.realcoding.net/article/view/4495
ключевое слово "секционирование данных". ы?

okis

А как насчет mysql?
А вот хз. По мускулю я не эксперт. Но всё кажется просто: создай схему с индексом (словами ты её уже описал нагенерируй пару ТБ мусора, посмотри, с какой скоростью они записываются-считываются.
А какая latency допускается для запроса на выборку?

okis

В мускуле есть. Partitioning.

Hastya

Любая SQL-база с partitioning по дате.

AlexV769

А как насчет mysql?
Если считать 500 записей в секунду, то это получается под два миллиона в час.
Можно попробовать посмотреть, как себя ведет innodb и myisam, если включить почасовое партиционирование. Если запросов к этой БД будет мало (тут надо детально смотреть то я бы вообще оставил эту всю штуку без индексов на full scan - сильно выиграешь по скорости при записи.

AlexV769

В мускуле есть. Partitioning.
Печально, что они для партиционированных таблиц выключили INSERT DELAYED @ MyISAM.

katrin2201

> Пусть 1тик = 1 сек. Объем данных за 1 тик, 200-300 float'ов.
Если примем флоат за 4 байта, таймстэмп за 8, это будет (8+4) х 500 х 9 х 3600 (бизнес открыт 9 часов из 24х, флоатов взял 500 за тик с запасом) ~= 180MiB/сутки.
Такими темпами первый терабайт ты наберешь только через 15 лет.
Для выбора очень важно понимать, какая нагрузка будет по выборкам. Queries per second? Насколько большой рэндж по датам в выборке? Какое время отводится на ответ?
Вообще, если особых требований к выборкам нету, то велосипедная реализация, как заметил , пожалуй, будет оптимальна.
Данные поступают в заранее отсортированном порядке, будучи один раз записанными никогда не меняются. Выборки идут по протяженным кускам. Рай =)
Пишем, скажем, по файлу на неделю - это будет порядка 200к строчек на файл.
Банальный бинарный поиск справится за <20 итераций. То есть это 20х10ms_seek_time ~= 200ms на поиск данных и еще сколько то на вычитывание ренджа. Соотв на небольших ренджах в 300мс уложишься.
Решение отлично масштабируется по объему данных - ему на него просто чихать.

Sharp

Есть еще http://www.scidb.org/, но он больше под "научные данные" заточен.
Ты бы конкретизировал, что за исторические данные, в каком объеме и что ты с ними планируешь делать.

Sharp

Прочитал описание твоей задачи — имхо http://www.postgresql.org/ тебе нужен.

Papazyan

kdb+ — интересный вариант, но вряд ли кто здесь пробовал с ним работать, эксперименты придётся самостоятельно провести. И по-моему она платная.
Я работал, но в случае топикстатера это как томагавком по комару пулять.

kataich

как томагавком по комару пулять

Все равно не попадешь? :)

Papazyan

Задача топикстартера решается в ней условно говоря за 1 минуту.

kataich

Спасибо, можешь пояснить, почему ты так думаешь?
Прозвучавшие в треде (и не только) кандидаты:
- mssql
- mysql
- sqllite
- postgresql
Не могли бы вы сказать, в чем отличие этих четырех?
Еще кандидаты:
- Plain text/csv/binary files
- HDF5
- KDB
Заранее благодарю.

kataich

Она и стоит...

Papazyan

Не для нищебродов, это верно. Но позволить себе роскошь иметь данные с рынков за несколько лет могут только богатые финорганизации, вот и цены такие.

Sharp

mssql забесплатно не поддерживает Терабайты данных как тебе хочется. Не факт, что тебе это нужно, ну да ладно.
mysql не богат на функционал. Не факт, что тебе в действительности потребуются различные фичи SQL, которых нет в MySQL, ну да ладно. Кстати, у MySQL-я тоже не понятно, что будет с платность/бесплатностью. Есть его ветка MariaDB — будет всегда бесплатная, но она отделилась порядка двух лет назад, что будет в будущем не очень понятно.
sqlite — легкий, но ограниченный.
postgresql — медленее MySQL, но поддерживает много фич.
Ну вот это если вкратце. А вообще выбери что-то одно, попробуй — если не будешь сильно выходить за пределы "стандартного" SQL, то поменять базу данных будет несложно.
В итоге выберешь что именно тебе подходит.
У меня было одно решение, когда одни данные хранились в SQLite, часть писалась в MySQL, а потом это все оттуда и из бинарных файлов обсчитывалось вместе, и результаты писались в Postgres, где уже была сделана бизнес-логика.

kataich

Спасибо,
postgresql - медленее MySQL
?
это официальное мнение или повод для холивара? :)

Sharp

Это мое личное мнение.
Ну то есть в том "мега-проекте" что я описал до этого, в MySQL писались некоторые данные, которые если писать их сразу в Postgres, то система не справлялась.
Попутно встречал подобное решение MySQL + Postgres в интернете несколько раз, поэтому и считаю его правильным.

Dasar

А вообще выбери что-то одно, попробуй — если не будешь сильно выходить за пределы "стандартного" SQL, то поменять базу данных будет несложно.
если нужна скорость, то придется выходить за пределы sql.
как минимум для быстрой заливки данных в БД, каждый движок предлагает свою функциональность.
зы
мы делаем на mssql, при правильном его использовании - получается лить миллион записей в минуту

pilot

это официальное мнение или повод для холивара? :)
Повод для холивара.

FRider

при правильном его использовании
а можно поконкретнее

Dasar

часть советов в треде уже было.
partition, по минимуму индексов, заливка данных через bulk insert или аналог

Marinavo_0507

мы делаем на mssql, при правильном его использовании - получается лить миллион записей в минуту
это много что ли :ooo:

Dasar

это много что ли :ooo:
не очень, но под наши задачи хватает. быстрее не разгоняли.
это было написано к тому, что у ТС в минуту будет литься 30к записей, что дает ему 30 кратный запас прочности

Dasar

это много что ли :ooo:
кстати до какой скорости можно разогнать на desktop-ном железе?
SSD ощутимый выигрыш дает? и в каких сценариях?

AlexV769

кстати до какой скорости можно разогнать на desktop-ном железе?
1) Desktop'ное железо бывает разное.
2) Технология INSERT DELAYED и подобных фич в других СУБД упирается не в диски, а в объем и скорость ОЗУ.

Dasar

2) Технология INSERT DELAYED и подобных фич в других СУБД упирается не в диски, а в объем и скорость ОЗУ.
так если нагрузка постоянная, а не пиковая, на диск-то все равно рано или поздно придется писать.
как здесь insert delayed помогает?
зы
млн/минута - это именно постоянная нагрузка, из-за дня в день

Dasar

1) Desktop'ное железо бывает разное.
разница в 2-3 раза, на порядок разница уже едва ли будет

AlexV769

так если нагрузка постоянная, а не пиковая, на диск-то все равно рано или поздно придется писать.
это позволяет снизить кол-во записей на диск, дав возможность SQL движку самому решать, когда надо данные флашить.

Dasar

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

AlexV769

на определенном характере нагрузки такая стратегия даёт очень большой выигрыш.
у меня перед глазами пример, когда отложенная запись (INSERT DELAYED) на диск, расположенный в ОЗУ (memory-mapped), экономит примерно 30% времени работы программы, которая снимает очень много данных (1M датчиков) с кучи коробок по SNMP.

Dasar

которая снимает очень много данных (1M датчиков) с кучи коробок по SNMP.
какой период съема данных?

AlexV769

раз в 5 минут.
зависимость времени исполнения от кол-во одновременных тредов (1 тред на хост):
Hosts:1741 HostsPerProcess:1741 DataSources:882544
SYSTEM STATS: Time:49.3651 Method:spine Processes:1 Threads:16
SYSTEM STATS: Time:27.2454 Method:spine Processes:1 Threads:32
SYSTEM STATS: Time:23.7068 Method:spine Processes:1 Threads:40
SYSTEM STATS: Time:21.6130 Method:spine Processes:1 Threads:48
SYSTEM STATS: Time:19.5370 Method:spine Processes:1 Threads:64
Если убрать DELAYED из запросов, при росте кол-ва тредов время будет расти (особенность MyISAM)

Dasar

у меня перед глазами пример, когда отложенная запись (INSERT DELAYED) на диск, расположенный в ОЗУ (memory-mapped экономит примерно 30% времени работы программы, которая снимает очень много данных (1M датчиков) с кучи коробок по SNMP.
что с чем сравнивалось?
insert на ram vs insert delayed на ram?
вставка делалась через портянку строковых insert value или хитрее?

AlexV769

что с чем сравнивалось?
insert на ram vs insert delayed на ram
Когда-то давно ещё смотрел MyISAM vs InnoDB vs MyISAM (row_format=FIXED). Последний с учетом работающих DELAYED рвет всех остальных.
вставка делалась через портянку строковых insert value или хитрее?
длинные строковые insert'ы

hwh2010

Попутно встречал подобное решение MySQL + Postgres в интернете несколько раз, поэтому и считаю его правильным.
использовались ли при этом InnoDB-таблицы или только MyISAM?

Dasar

длинные строковые insert'ы
mysql вставлять бинарными пакетами не умеет?

AlexV769

Насколько я знаю, не умеет.
Оставить комментарий
Имя или ник:
Комментарий: