У меня есть данные научных измерений, которые следует постоянно хранить в каком-то хранилище данных.
Я ищу способ хранить измерения от 100 000 датчиков с накоплением данных измерений за годы до примерно 1 000 000 измерений на датчик. Каждый датчик выдает показания раз в минуту или реже. Таким образом, поток данных невелик (около 200 измерений в секунду в полной системе). Датчики не синхронизированы.
Сами данные представлены в виде потока троек: [отметка времени] [номер датчика] [значение], где все может быть представлено как 32-битное значение.
В простейшей форме этот поток будет сохранен как есть в одной таблице с тремя столбцами. Тогда запрос будет:
SELECT timestamp,value
FROM Data
WHERE sensor=12345 AND timestamp BETWEEN '2013-04-15' AND '2013-05-12'
ORDER BY timestamp
К сожалению, для строковых СУБД это даст очень низкую производительность, так как объем данных велик, и данные, которые нам нужны, распределены по нему почти равномерно. (Попытка выбрать несколько сотен тысяч записей из миллиардов записей.) Что мне нужно с точки зрения производительности, так это разумное время отклика для человеческого потребления (данные будут отображаться в виде графика для пользователя), то есть несколько секунд плюс передача данных.
Другой подход - хранить данные с одного датчика в одной таблице. Тогда запрос будет выглядеть следующим образом:
SELECT timestamp,value
FROM Data12345
WHERE timestamp BETWEEN '2013-04-15' AND '2013-05-12'
ORDER BY timestamp
Это обеспечит хорошую производительность чтения, так как результатом будет ряд последовательных строк из относительно небольшой (обычно менее миллиона строк) таблицы.
Однако в СУБД должно быть 100 000 таблиц, которые используются в течение нескольких минут. Это не представляется возможным в обычных системах. С другой стороны, СУБД не кажется подходящим инструментом, поскольку в данных нет связей.
Я смог продемонстрировать, что один сервер может справиться с нагрузкой, используя следующую систему mickeymouse:
- У каждого датчика есть свой файл в файловой системе.
- Когда поступает фрагмент данных, его файл открывается, данные добавляются, а файл закрывается.
- Запросы открывают соответствующий файл, находят начальную и конечную точки данных и читают все, что между ними.
Очень мало строк кода. Производительность зависит от системы (типа хранилища, файловой системы, ОС), но особых препятствий нет.
Однако, если я пойду по этому пути, я в конечном итоге напишу свой собственный код для разделения, резервного копирования, перемещения старых данных глубже в хранилище (облако) и т. Д. Тогда это звучит как развертывание моей собственной СУБД, что звучит как новое изобретение колесо (снова).
Есть ли стандартный способ хранения данных, которые у меня есть? Какой-нибудь хитрый трюк с NoSQL?