Предоставляют ли реляционные базы данных реальный бэкенд для историка процесса? - PullRequest
4 голосов
/ 03 февраля 2010

В обрабатывающей промышленности большое количество данных считывается, часто с высокой частотой, из нескольких различных источников данных, таких как приборы NIR, а также обычные приборы для измерения pH, температуры и давления. Эти данные часто хранятся в истории процесса, обычно в течение длительного времени.

В связи с этим историки процессов предъявляют другие требования, чем реляционные базы данных. Для выполнения большинства запросов к историку процесса требуются либо метки времени, либо диапазоны времени, а также набор представляющих интерес переменных.

Часто и много ВСТАВЛЯТЬ, много ВЫБРАТЬ, мало или нет ОБНОВЛЕНИЕ, почти нет УДАЛИТЬ.

Q1. Является ли реляционные базы данных хорошим бэкендом для историка процессов?


Очень наивная реализация истории процессов в SQL может выглядеть примерно так.

+------------------------------------------------+
| Variable                                       |
+------------------------------------------------+
| Id : integer primary key                       |
| Name : nvarchar(32)                            |
+------------------------------------------------+

+------------------------------------------------+
| Data                                           |
+------------------------------------------------+
| Id : integer primary key                       |
| Time : datetime                                |
| VariableId : integer foreign key (Variable.Id) |
| Value : float                                  |
+------------------------------------------------+

Эта структура очень проста, но, вероятно, медленна для обычных операций исторического процесса, поскольку в ней отсутствуют «достаточные» индексы.

Но, например, если таблица переменных будет состоять из 1000 строк (довольно оптимистичное число), и данные для всех этих 1000 переменных будут выбираться один раз в минуту (также оптимистическое число), тогда таблица данных будет расти с 1.440.000 строк в день. Продолжим пример. Предположим, что каждая строка будет занимать около 16 байт, что дает примерно 23 мегабайта в день, не считая дополнительного пространства для индексов и других служебных данных.

23 мегабайта как таковых, возможно, не так много, но имейте в виду, что число переменных и выборок в примере было оптимистичным и что система должна быть работоспособной 24/7 / 365.

Конечно, на ум приходят архивация и сжатие.

Q2. Есть ли лучший способ сделать это? Возможно, используя какую-то другую структуру таблицы?

Ответы [ 12 ]

4 голосов
/ 04 февраля 2010

Я работаю с базой данных SQL Server 2008, которая имеет сходные характеристики; тяжело на вставку и выделение, свет на обновление / удаление. Около 100 000 «узлов» всех выборок, по крайней мере, один раз в час. И есть поворот; все входящие данные для каждого «узла» должны быть сопоставлены с историей и использованы для проверки, прогнозирования и т. д. О, есть еще один поворот; данные должны быть представлены четырьмя различными способами, поэтому, по сути, существует 4 различных копии этих данных, ни одна из которых не может быть получена из каких-либо других данных с разумной точностью и в разумные сроки. 23 мегабайта были бы легкой прогулкой; мы говорим здесь сотни гигабайт с терабайтами.

Вы узнаете много нового о масштабах процесса, о том, какие методы работают, а какие нет, но современные базы данных SQL, безусловно, соответствуют этой задаче. Эта система, которую я только что описал? Он работает на 5-летнем IBM xSeries с 2 ГБ ОЗУ и массивом RAID 5 и работает превосходно: никто не должен ждать больше нескольких секунд даже для самых сложных запросов.

Вам нужно оптимизировать, конечно. Вам придется часто денормализовать и поддерживать предварительно вычисленные агрегаты (или хранилище данных), если это является частью ваших требований к отчетности. Возможно, вам придется немного поразмыслить: например, мы используем ряд пользовательских типов CLR для хранения необработанных данных и агрегаты / функции CLR для некоторых из более необычных отчетов о транзакциях. SQL Server и другие механизмы БД могут не предлагать всего , необходимого вам заранее, но вы можете обойти их ограничения.

Вы также захотите кешировать - сильно. Поддерживать ежечасные, ежедневные, еженедельные сводки. Инвестируйте в интерфейсный сервер с достаточным объемом памяти и кэшируйте как можно больше отчетов. Это в дополнение к любому решению хранилища данных, которое вы придумали, если применимо.

Одна из вещей, от которой вы, вероятно, захотите избавиться, - это ключ "Id" в вашей гипотетической таблице Data. Я предполагаю, что Data является листовой таблицей - обычно это происходит в этих сценариях - и это делает его одной из немногих ситуаций, где я рекомендую использовать естественный ключ вместо суррогата. Тот же variable, вероятно, не может генерировать повторяющиеся строки для одной и той же временной метки, поэтому все, что вам действительно нужно, это переменная и временная метка в качестве первичного ключа. По мере того, как таблица становится все больше и больше, наличие отдельного индекса для variable и timestamp (что, конечно, необходимо охватить) приведет к потере огромного количества места - 20, 50, 100 ГБ, легко. И, конечно же, теперь каждый INSERT должен обновить два или более индексов.

Я действительно считаю, что СУБД (или база данных SQL, если вы предпочитаете) способна к этой задаче так же, как и любая другая, если вы проявляете достаточную осторожность и планирование в своем проекте. Если вы просто начнете объединять таблицы без учета производительности или масштаба, то, конечно, у вас возникнут проблемы позже, и когда база данных будет иметь несколько сотен ГБ, вам будет трудно выкопать себя из этой дыры.

Но возможно ли это? Абсолютно. Постоянно следите за производительностью, и со временем вы узнаете, какие оптимизации вам нужно сделать.

2 голосов
/ 03 февраля 2010

Похоже, вы говорите о данных телеметрии (отметки времени, точки данных).

Мы не используем базы данных SQL для этого (хотя мы используем базы данных SQL для его организации); вместо этого мы используем двоичные потоковые файлы для захвата фактических данных. Для этого существует ряд форматов двоичных файлов, включая HDF5 и CDF. Формат файла, который мы здесь используем, является собственным сжимаемым форматом. Но затем мы имеем дело с сотнями мегабайт телеметрических данных за один раз.

Эта статья может показаться вам интересной (ссылки непосредственно на документ Microsoft Word):
http://www.microsoft.com/caseStudies/ServeFileResource.aspx?4000003362

Это тематическое исследование группы McClaren, описывающее, как SQL Server 2008 используется для сбора и обработки данных телеметрии с гоночных автомобилей Формулы-1. Обратите внимание, что они на самом деле не хранят данные телеметрии в базе данных; вместо этого он сохраняется в файловой системе, и для доступа к нему используется возможность FILESTREAM в SQL Server 2008.

1 голос
/ 04 февраля 2010

В IBM Informix Dynamic Server (IDS) есть TimeSeries DataBlade и RealTime Loader, которые могут предоставлять соответствующие функции.

Ваша наивная схема записывает каждое чтение на 100% независимо, что затрудняет корреляцию между показаниями - как для одной и той же переменной в разное время, так и для разных переменных (приблизительно) в одно и то же время. Это может быть необходимо, но это усложняет жизнь при последующей обработке. Насколько важна проблема, зависит от того, как часто вам нужно будет выполнять корреляции между всеми 1000 переменными (или даже значительным процентом из 1000 переменных, где значимое может составлять всего 1% и почти наверняка начнется с 10%) .

Я бы хотел объединить ключевые переменные в группы, которые могут быть записаны совместно. Например, если у вас есть блок мониторинга, который регистрирует температуру, давление и кислотность (pH) в одном месте, и, возможно, на контролируемом заводе есть сотни таких мониторов, я хотел бы сгруппировать три показания плюс идентификатор местоположения (или идентификатор монитора) и время в одной строке:

CREATE TABLE MonitorReading
(
    MonitorID        INTEGER NOT NULL REFERENCES MonitorUnit,
    Time             DATETIME NOT NULL,
    PhReading        FLOAT NOT NULL,
    Pressure         FLOAT NOT NULL,
    Temperature      FLOAT NOT NULL,
    PRIMARY KEY (MonitorID, Time)
);

Это избавляет от необходимости выполнять самостоятельные объединения, чтобы увидеть, какие три показания были в определенном месте в конкретное время, и использует около 20 байтов вместо 3 * 16 = 48 байтов в строке. Если вы непреклонны в том, что вам нужно уникальное целое число ID для записи, оно увеличивается до 24 или 28 байт (в зависимости от того, используете ли вы 4-байтовое или 8-байтовое целое число для столбца ID).

1 голос
/ 04 февраля 2010

Конечно, реляционная база данных подходит для анализа данных после факта.

Различные эксперименты по ядерной физике и физике элементарных частиц, с которыми я принимал участие, исследовали несколько моментов, связанных с тем, что СУБД вообще не использовалась, хотя в БД хранились только сводки по прогонам или прогонам, а также медленно меняющиеся условия окружающей среды, вплоть до заполнения каждого бит собран в БД (хотя сначала он был размещен на диске).

Когда и где скорость передачи данных позволяет все большему количеству групп двигаться в направлении помещения как можно большего количества данных в базу данных.

1 голос
/ 03 февраля 2010

Да, для этого подходит СУБД, хотя это и не самый быстрый вариант. Однако вам придется инвестировать в разумную систему, чтобы справиться с нагрузкой. Я рассмотрю оставшуюся часть моего ответа на эту проблему.

Это зависит от того, насколько сложна система, которую вы готовы бросить на проблему. Существует два основных ограничения скорости ввода данных в БД: объемная скорость ввода-вывода и время поиска. Хорошо спроектированная реляционная БД будет выполнять как минимум 2 операции поиска на вставку: один для начала транзакция (в случае, если транзакция не может быть завершена), и одна, когда транзакция совершается. Добавьте в это дополнительное хранилище, чтобы искать записи индекса и обновлять их.

Если ваши данные большие, то ограничивающим фактором будет то, насколько быстро вы сможете записывать данные. Для жесткого диска это будет около 60-120 МБ / с. Для твердотельного диска вы можете ожидать более 200 МБ / с. Вам (конечно) понадобятся дополнительные диски для RAID-массива. Соответствующим показателем является пропускная способность хранилища Скорость последовательного ввода-вывода AKA.

Если вы пишете много небольших транзакций, ограничение будет заключаться в том, насколько быстро ваш диск может искать и записывать небольшой фрагмент данных, измеряемый в IO в секунду ( IOPS ). Мы можем подсчитать, что для каждой транзакции потребуется 4-8 запросов (разумный случай с включенными транзакциями и индексом или двумя плюс некоторые проверки целостности). Для жесткого диска время поиска будет несколько миллисекунд, в зависимости от оборотов диска. Это ограничит вас несколькими сотнями операций записи в секунду. Для твердотельного диска время поиска составляет менее 1 мс, поэтому вы можете записать несколько тысяч транзакций в секунду.

При обновлении индексов вам нужно будет сделать около 0 (log n) небольших поисков, чтобы найти место для обновления, поэтому БД будет замедляться по мере увеличения количества записей. Помните, что БД может записывать не в максимально эффективном формате, поэтому размер данных может быть больше, чем вы ожидаете.

Таким образом, в общем, ДА, вы можете сделать это с СУБД, хотя вы захотите инвестировать в хорошее хранилище, чтобы оно соответствовало вашей скорости вставки. Если вы хотите сократить расходы, вы можете свернуть данные за определенный возраст (например, 1 год) во вторичный сжатый формат архива.

EDIT: СУБД, вероятно, является самой простой системой для хранения последних данных, но вам следует строго рассмотреть формат HDF5 / CDF, который кто-то другой предложил для хранения старых, заархивированных данных. Это гибкий и широко поддерживаемый формат обеспечивает сжатие, обеспечивает сжатие и ОЧЕНЬ эффективное хранение больших временных рядов и многомерных массивов. Я считаю, что это также предусматривает некоторые методы индексации в данных. Вы должны иметь возможность написать небольшой код для извлечения из этих архивных файлов, если данные слишком стары, чтобы быть в БД.

1 голос
/ 03 февраля 2010

Я полагаю, что вы идете по правильному пути .У нас похожая ситуация, где мы работаем.Данные поступают из различных систем транспорта / автоматизации по различным технологиям, таким как производство, автомобили и т. Д. В основном мы имеем дело с большой тройкой: Ford, Chrysler, GM.Но мы получили много данных от таких клиентов, как CAT.

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

0 голосов
/ 05 февраля 2010

Возможно, вы захотите взглянуть на Stream Data Manager System (SDMS).

Не отвечая всем вашим потребностям (долговременное постоянство), скользящие окна во времени и строках и часто меняющиеся данные являются их сильными сторонами.

Некоторые полезные ссылки:

Все крупные производители баз данных AFAIK должны иметь какую-то прототипную версию СУБД в разработке, поэтому я думаю, что это парадигма, которую стоит проверить.

0 голосов
/ 04 февраля 2010

Другой аспект, который следует учитывать, - это то, что вид выбирает, что вы делаете. Реляционные / SQL базы данных отлично подходят для выполнения сложных объединений, зависящих от нескольких индексов и т. Д. Их действительно нельзя победить. Но если вы не делаете такие вещи, они, вероятно, не такие уж хорошие пары.

Если все, что вы делаете, это хранение записей за один раз, я бы соблазнился свернуть ваш собственный формат файла ... даже просто вывести материал в формате CSV (стоны из аудитории, я знаю, но трудно бить за широкое признание)

Это действительно зависит от ваших требований к индексации / поиску и вашей готовности написать инструменты для этого.

0 голосов
/ 04 февраля 2010

Возможно, вы захотите взглянуть на KDB. Он специально оптимизирован для такого использования: много вставок, мало или нет обновлений или удалений. Однако использовать его не так просто, как в традиционных СУБД.

0 голосов
/ 04 февраля 2010

Несколько лет назад наш клиент пытался загрузить СУБД с данными в реальном времени, собранными с оборудования для мониторинга оборудования. Это не сработало упрощенно.

Является ли реляционная база данных хорошим бэкэндом для историка процесса?

Да, но. Необходимо хранить сводные данные, а не детали.

Вам понадобится интерфейс в оперативной памяти и на плоских файлах. Периодические сводки и дайджесты могут быть загружены в РСУБД для дальнейшего анализа.

Для этого вам понадобятся методы хранения данных. Большая часть того, что вы хотите сделать, это разделить ваши данные на две основные части ---

  1. Факты. Данные, которые имеют единицы. Фактические измерения.

  2. Размеры. Различные атрибуты фактов - дата, местоположение, устройство и т. Д.

Это приводит вас к более сложной модели данных.

 Fact: Key, Measure 1, Measure 2, ..., Measure n, Date, Geography, Device, Product Line, Customer, etc.

 Dimension 1 (Date/Time): Year, Quarter, Month, Week, Day, Hour

 Dimension 2 (Geography): location hierarchy of some kind

 Dimension 3 (Device): attributes of the device

 Dimension *n*:  attributes of each dimension of the fact
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...