Хранение данных временных рядов, реляционных или нет?
Я создаю систему, которая опрашивает устройства для получения данных по различным показателям, таким как использование процессора, использование диска, температура и т. д. с (вероятно) 5-минутными интервалами с использованием SNMP. Конечная цель заключается в предоставлении визуализации пользователю системы в виде графиков временных рядов.
я рассматривал использование RRDTool в прошлом, но отклонил его, поскольку хранение захваченных данных на неопределенный срок важно для моего проекта, и я хочу более высокий уровень и более гибкий доступ к захваченные данные. Так что мой вопрос действительно:
что лучше, реляционная база данных (например, MySQL или PostgreSQL) или нереляционная или NoSQL база данных (например, MongoDB или Redis) в отношении производительности при запросе данных для построения графиков.
реляционных
учитывая реляционную базу данных, я бы использовал data_instances таблица, в которой будет храниться каждый экземпляр данных, захваченных для каждой измеряемой метрики для всех устройств, с следующие поля:
поля: idfk_to_devicefk_to_metricmetric_valuetimestamp
когда я хочу нарисовать график для конкретной метрики на конкретном устройстве, я должен запросить эту сингулярную таблицу фильтрация другие устройства и другие показатели, анализируемые для этого устройства:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
количество строк в этой таблице будет такой:
d * m_d * f * t
здесь d число устройства,m_d - это накопительный количество метрик записывается для всех устройств, f - это частота при котором данные опрашиваются Для и t - общая сумма времени система сбора данных.
для пользователя, записывающего 10 метрик для 3 устройств каждые 5 минут в течение года, у нас было бы чуть меньше 5 млн. записей.
индексы
без индексов на fk_to_device и fk_to_metric сканирование этой постоянно расширяющейся таблицы займет слишком много времени. Поэтому индексирование вышеупомянутых полей, а также timestamp (для создания графиков с локализованными периодами) является обязательным требованием.
Нереляционные (NoSQL)
MongoDB имеет понятие коллекция, в отличие от таблиц, они могут быть созданы программно, без установки. С их помощью я мог бы разделить хранение данных для каждого устройства или даже каждую метрику, записанную для каждого устройство.
у меня нет опыта работы с NoSQL и не знаю, предоставляют ли они какие-либо функции повышения производительности запросов, такие как индексация, однако в предыдущем абзаце предлагается выполнять большую часть традиционной реляционной работы с запросами в структуре, с помощью которой данные хранятся в NoSQL.
не определились
будет ли реляционное решение с правильной индексацией уменьшаться до обхода в течение года? Или структура на основе коллекции подходов NoSQL (которая соответствует моей ментальной модели хранимых данных) обеспечивают заметную выгоду?
10 ответов:
Наверняка Реляционной. Неограниченная гибкость и расширение.
две поправки, как в концепции, так и в применении, а затем высота.
коррекция
это не "фильтрация ненужных данных"; это выбор только необходимые данные. Да, конечно, если у вас есть индекс для поддержки столбцы, указанные в предложении where, это очень быстро, и запрос не зависит от размера таблица (захват 1000 строк из 16 миллиардов строк таблицы происходит мгновенно).
у вашего стола есть одно серьезное препятствие. Учитывая ваше описание, фактический PK (устройство, Метрика, Дата-Время). (Пожалуйста, не называйте это меткой времени, это означает что-то еще, но это незначительная проблема.) Уникальность row определяется:
(Device, Metric, DateTime)
The
Idстолбец ничего не делает, он полностью и полностью избыточен.
- An
Idстолбец никогда не является ключом (повторяющиеся строки, которые запрещены в реляционной базе данных, должны быть предотвращены другими средствами).The
Idстолбец требует дополнительного индекса, который, очевидно, препятствует скоростиINSERT/DELETE, и добавляет к используемому дисковому пространству.вы можете избавиться от него. Пожалуйста.
Высота
- ответ с что такое шестая нормальная форма ? движется вперед.
(у меня есть один индекс только, не три; на не-SQLs вам может понадобиться три индекса).
у меня точно такая же таблица (без
Id"ключ", конечно). У меня есть дополнительный столбецServer. Я поддерживаю несколько клиентов удаленно.
(Server, Device, Metric, DateTime)таблица может быть использована для поворота данных (т. е.
Devicesсверху иMetricsвниз по стороне, или повернутый), используя точно такой же код SQL (да, переключите ячейки). Я использую таблицу чтобы построить неограниченное разнообразие графиков и диаграмм для клиентов повторно их производительность сервера.
Модель Данных Статистики Монитора.
(Слишком большой для встроенного; некоторые браузеры не могут загрузить встроенный; нажмите на ссылку. Также это устаревшая демо-версия, по понятным причинам, я не могу показать вам коммерческий продукт DM.)это позволяет мне выпускать Графики Это, шесть нажатий клавиш после получения сырого файла статистики мониторинга от клиента, используя одна команда выбора. Обратите внимание на сочетание и совпадение; ОС и сервер на одной диаграмме; различные повороты. Конечно, нет предела количеству статистических матриц, а значит и диаграмм. (Используется с доброго разрешения клиента.)
читатели, незнакомые со стандартом моделирования реляционных баз данных, могут найти нотации IDEF1X полезная.
Еще Одна Вещь
и последнее, но не менее важное: SQL является стандартом IEC/ISO/ANSI. Бесплатная программа на самом деле не является SQL; это мошенничество, чтобы использовать термин SQL, если они не предоставляют стандарт. Они могут предоставлять "дополнительные услуги", но в них отсутствуют основы.
нашел очень интересные ответы выше. Пытаясь добавить еще пару соображений здесь.
1) старение данных
управление временными рядами обычно необходимо для создания политики старения. Типичный сценарий (например, процессор сервера мониторинга) требует хранения:
1-с образцы сырья в течение короткого периода (например, в течение 24 часов)
5-мин детализируйте агрегатные образцы на средний период (например 1 неделя)
1 час подробно об этом (например, до 1 года)
хотя реляционные модели позволяют наверняка (моя компания реализовала массивные централизованные базы данных для некоторых крупных клиентов с десятками тысяч рядов данных) управлять им надлежащим образом, новое поколение хранилищ данных добавляет интересные функциональные возможности для изучения, такие как:
автоматизированные данные продувки (см. Рэдис истечения срока действия команда)
многомерные агрегации (например, map-reduce jobs a-la-Splunk)
2) коллекция в реальном времени
Что еще более важно, некоторые нереляционные хранилища данных по своей сути распределены и позволяют гораздо более эффективно собирать данные в реальном времени (или почти в реальном времени), что может быть проблемой с СУБД из-за создания горячих точек (управление индексированием при вставке в одну таблицу). Эта проблема в СУБД пространство обычно решается возвращением к процедурам пакетного импорта (мы управляли этим способом в прошлом), в то время как технологии no-sql преуспели в массовом сборе и агрегации в реальном времени (см. Splunk, например, упомянутый в предыдущих ответах).
вы в таблице есть данные в одной таблице. Таким образом, реляционный против нереляционного-это не вопрос. В основном вам нужно прочитать много последовательных данных. Теперь, если у вас достаточно оперативной памяти для хранения данных на несколько лет, то ничего подобного с помощью Redis/MongoDB и т. д.
в основном базы данных NoSQL будут хранить ваши данные в одном и том же месте на диске и в сжатом виде, чтобы избежать множественного доступа к диску.
NoSQL делает то же самое, что и создание индекса на идентификаторе устройства и идентификаторе метрики, но в своем собственном путь. С базой данных, даже если вы это сделаете, индекс и данные могут быть в разных местах, и будет много дискового ввода-вывода.
такие инструменты, как Splunk, используют NoSQL backends для хранения данных временных рядов, а затем используют map reduce для создания агрегатов (что может быть тем, что вы хотите позже). Поэтому, на мой взгляд, использовать NoSQL-это вариант, поскольку люди уже пробовали его для подобных случаев использования. Но будет ли миллион строк приносить базу данных для обхода (возможно, нет, с приличным оборудованием и правильным настойки.)
Если вы смотрите на пакеты GPL,RRDTool это хорошо, чтобы посмотреть. Это хороший инструмент для хранения, извлечения и построения графиков данных временных рядов. Ваш прецедент выглядит точно так же, как данные временных рядов.
создайте файл, назовите его 1_2.данные. у нас есть идея? что вы получаете:
- вы экономите до 50% пространства, потому что вам не нужно повторять значение fk_to_device и fk_to_metric для каждой точки данных.
- вы экономите еще больше места, потому что вам не нужны никакие индексы.
- сохраните пары (timestamp, metric_value) в файл, добавив данные, чтобы вы получили заказ по отметке времени бесплатно. (предполагая, что ваши источники не отправляют данные из строя для a устройство)
=> запросы по метке времени выполняются удивительно быстро, потому что вы можете использовать двоичный поиск, чтобы найти нужное место в файле для чтения.
Если вам это нравится еще больше оптимизирован начать думать о разделении файлов, как это;
- 1_2_january2014.данные
- 1_2_february2014.данные
- 1_2_march2014.данные
или использовать kdb+ from http://kx.com потому что они делают все это для вас:) колонка ориентирована на то, что может помочь вам.
появляется облачное решение, ориентированное на столбцы, поэтому вы можете взглянуть на: http://timeseries.гуру
это проблема, которую мы должны были решить в ApiAxle. Мы написал сообщение в блоге о том, как мы это сделали с помощью Redis. Это не было там очень долго, но это доказывает свою эффективность.
Я также использовал RRDTool для другого проекта, который был превосходным.
Я думаю, что ответ на этот вопрос должен в основном вращаться вокруг того, как Ваша база данных использует хранилище. Некоторые серверы баз данных используют ОЗУ и диск, некоторые используют только ОЗУ (необязательно диск для сохранения) и т. д. Наиболее распространенные решения для баз данных SQL используют память+дисковое хранилище и записывают данные в макет на основе строк (каждый вставленный raw записывается в том же физическом расположении). Для магазинов timeseries в большинстве случаев рабочая нагрузка выглядит примерно так: относительно низкий интервал огромное количество вставок, в то время как чтение основано на столбце (В большинстве случаев вы хотите прочитать диапазон данных из определенного столбца, представляющего метрику)
Я нашел столбчатые базы данных (google it, Вы найдете MonetDB, InfoBright, parAccel и т. д.) делают потрясающую работу для временных рядов.
Что касается вашего вопроса, который лично я считаю несколько недействительным (так как все обсуждения используют термин ошибки NoSQL-IMO): Вы можете использовать сервер баз данных, который может говорить SQL на одном рука, что делает вашу жизнь очень легко, как все знают SQL в течение многих лет, и этот язык был усовершенствован снова и снова для запросов данных; но по-прежнему использовать оперативную память, кэш процессора и диск в столбчатой ориентированной образом, что делает ваше решение лучше всего подходят временные ряды
5 миллионов строк-это не для сегодняшних проливных данных. Ожидайте, что данные будут в ТБ или PB всего за несколько месяцев. На этом этапе СУБД не масштабируются до задачи, и нам нужна линейная масштабируемость баз данных NoSql. Производительность будет достигнута для столбчатого раздела, используемого для хранения данных, добавляя больше столбцов и меньше строк, чтобы повысить производительность. Используйте открытую работу TSDB, выполненную поверх HBASE или MapR_DB и т. д.
Я регулярно сталкиваюсь с подобными требованиями и недавно начал использовать Zabbix для сбора и хранения данных этого типа. Zabbix имеет свои собственные графические возможности, но это достаточно легко извлечь данные из базы данных Zabbix и обрабатывать его, как вам нравится. Если вы еще не проверили Zabbix, вы можете найти это стоит вашего времени, чтобы сделать это.
вы должны посмотреть в база данных временных рядов. Он был создан для этой цели.
база данных временных рядов (TSDB) - это программная система, оптимизированная для обработки данных временных рядов, массивов чисел, индексированных по времени (datetime или диапазон datetime).
популярный пример базы данных временных рядов InfluxDB
Comments