Описание сервиса
Сервис обработки исторических данных запускается как отдельный процесс и принимает соединения по TCP/IP. Сервис позволяет клиентам добавить данные в базу, сделать запрос на получение исторических данных за требуемое время или получить необходимое количество данных. При запросе данных из базы можно использовать различные функции обработки данных. Например, получить среднее значение, максимальное или минимальное, получить значение по условию. Можно применять статистические функции или функции предсказания. Все функции находятся в файле historyFunctions.js.
Запись исторических данных всегда происходит через сервер. Получение исторических данных может выполняться как через сервер, так и при обращении напрямую к файлам БД. При обращении напрямую к файлам скорость получения данных будет выше и ресурсов будет использовано меньше. Способ получения данных регулируется настройкой directAccessToDBFile.
Объектом, для которого хранятся данные в системе обработки исторических данных является счетчик, подключенный к определенному объекту в ALEPIZ. Идентификатор каждого объекта в истории - это так называемый ObjectCounterID или OCID - поле id из таблицы objectsCounters
При добавлении новых данных они записываются в кэш, хранящийся в оперативной памяти. Объем хранимых в памяти данных меняется динамически для каждого объекта. Он зависит от интенсивности запросов на чтение данных для этого объекта и от количества запрашиваемых данных. Работа с кэшем выполняется в historyCache.js
Запись данных из кэша в базу данных производится через определенные интервалы времени. Запись и чтение данных из файлового хранилища производится в файле historyStorageServer.js. В качестве файлового хранилища используется база данных SQLite.
Во время записи данных в файловое хранилище формируются данные о трендах - усредненные значения за интервалы времени в 10, 30 и 60 минут. Временные интервалы для трендов определены в переменной const trendsTimeIntervals = [10, 30, 60] в файле historyStorage.js. Тренды обычно хранятся дольше чем данные, занимают меньше места и позволяют быстро получить усредненные данные из базы при запросе данных за большой период времени.
Периодически происходит запуск специально функции - housekeeper. Она необходима для исторических данных, трендов и кэша от записей, время хранения которых закончилось. Время хранения данных определяется отдельно для каждого счетчика. Это можно сделать через действие Counter settings с помощью установки параметров Keep history и Keep trends. Housekeeper запоминает идентификатор объекта на котором остановилась очистка данных и при запуске ALEPIZ продолжает очистку с объекта, на котором он закончил очистку во время остановки.
Кроме этого периодически запускается функция очистки истории от удаленных объектов. Функция называется removeZombiesFromStorage() и удаляет объекты, данные и тренды для несуществующих objectCounterID в ALEPIZ.
Для резервирования исторической базы данных используется технология асинхронной репликации. Во время сохранения данных из кэша, запись в различные базы данных выполняется из нескольких потоков. Обычно настраивается два потока. Один для записи данных в основную базу данных, другой - для записи в резервную. Процесс ожидает запись только в первую настроенную базу данных, которая является основной. В остальные базы данные пишутся без ожидания окончания записи для ускорения сохранения и предотвращения блокировки при недоступности резервной базы данных.
Процесс, обслуживающий систему обработки исторических данных запускает по одному потоку на каждую базу данных для записи данных и по несколько потоков для запросов данных из базы. Данные запрашиваются только из первой настроенной базы данных. При запросе данные будут получены сначала из кэша. Если кэше недостаточно данных, происходит обращение к файловому хранилищу.
Настройки по умолчанию находятся в файле historyParameters.js.
Настройки
- localAddress - IP адрес к которому будет привязан сервер истории. По умолчанию 127.0.0.1.
- serverAddress - IP адрес, к которому будут подключаться клиенты. По умолчанию 127.0.0.1.
- serverPort - TCP порт, который будет слушать сервер и к которому будут подключаться клиенты. По умолчанию 10163.
- dbLockTimeout - время ожидания в миллисекундах выполнения запросов к заблокированной базе данных, прежде чем произойдет ошибка SQLITE_BUSY. По умолчанию: 5000.
- maxSocketErrorsCnt - максимальное количество ошибок сокета, после которого сервер будет остановлен. По умолчанию 500.
- cacheServiceInterval - интервал времени в секундах для периодического запуска функции обслуживания кэша. Во время обслуживания производится сохранение данных из кэша в базу данных и формирование трендов. По умолчанию 300,
- maxNumberObjectsToDeleteAtTime - максимальное количество объектов, которое будет удалено за одну транзакцию. По умолчанию 100
- pauseBetweenDeletingSeriesObjects - пауза в миллисекундах между удалением серии объектов из maxNumberObjectsToDeleteAtTime. По умолчанию 1000.
- initCachedRecords - количество кэшируемых записей для одного объекта при создании нового объекта в сервисе обработки исторических данных. По умолчанию 5. Если не используется прямое получение данных из БД, в дальнейшем, количество кэшируемых может быть увеличено в зависимости от запросов данных для объекта. Если количество запросов уменьшается, количество данных в кэше так же будет сокращаться, но до значения, не меньше чем установленно в этом параметре.
- directAccessToDBFile - (true|false) при необходимости получить исторические данные из БД, запросы на получение данных будут выполнятся напрямую к БД (true) или с использованием сервиса обработки исторических данных (false). Прямое получение данных из БД обычно позволяет увеличить скорость доступа к данным. Исторические функции в этом случае обрабатывают данные не в сервисе обработки исторических данных, а в функции, из которой выполняется запрос на получение данных. При прямом получении данных для каждого объекта кэшируется initCachedRecords данных. Нужно учесть, что при большом количестве запросов от разных процессов могут возникать блокировки базы данных, которые в свою очередь могут привести к задержкам в получении данных их БД. По умолчанию true.
- queryMaxResultNumbers - возвращать за один запрос не более указанного количества исторических данных при запросе числовых данных. По умолчанию 5000,
- queryMaxResultStrings - возвращать за один запрос не более указанного количества исторических данных при запросе строковых данных. По умолчанию 50
- timestampMaxTimeDiff - максимальная разница между текущем временем и меткой времени (timestamp) , которую коллектор передал в Алепиз, при превышении которой метка времени коллектора будет проигнорирована, и будет сформирована новая метка времени, соответствующая времени получения данных ALEPIZ. По умолчанию 2592000000 (30 дней).
- storageQueryingProcessesNum - количество потоков, для обслуживания запросов на получение данных. По умолчанию 0 - количество потоков равно количеству ядер процессоров
- housekeeperInterval - интервал времени в миллисекундах для периодического запуска housekeeper - системы очистки базы данных, трендов и кэша от исторических данных. По умолчанию - 1800000 (30 минут)
- housekeeperWatchdogCheckInterval - интервал времени в миллисекундах для проверки housekeeper, что он выполняет действия по очистке базы данных. Если housekeeper запущен, каждый раз лог будет выводится информация о текущей работе housekeeper. По умолчанию 300000.
- queriesMaxQueueLength - если количество запросов больше чем установленное значение в этом параметре, будет выдано предупреждение в лог. По умолчанию 1000.
- slowQueueSec - Если запрос длился больше времени, указанном в этом параметра (в секундах), в лог файл будет выведено предупреждение о долгом запросе. По умолчанию 15.
- dumpFileName - имя файла в который при остановке ALEPIZ будет сохраняться кэш. За счет этого уменьшается время остановки ALEPIZ и не теряются данные из кэша между остановкой и стартом. Файл находится в каталоге, установленном в файле common.json, параметр tempDir. После запуска ALEPIZ данные из файла загружаются обратно в кэш. После запуска ALEPIZ и выполнения первой операции по сохранению данных из кэша в базу данных, файл с сохраненными данными удаляется. По умолчанию unsavedData.json.
- db - массив объектов с описанием файлов баз данных, в которых хранятся исторические данные. Таких файлов может быть несколько. Обычно настраивается два файла, для основной базы и ее резервной копии. Первый файл является основной базой в которую производится синхронная запись данных. При запросах исторических данных, информация извлекается только из первого файла. Во второй и последующие файлы данные записываются асинхронно без ожидания окончания записи. В запросах исторических данных эти файлы не участвуют.
- path - путь до базы данных. Например, DB или \\\\ALEPIZ-BCP\\d$\\ALEPIZ\\DB
- file - имя файла для базы данных, например history.db
- relative - (true|false) - является ли путь относительным (true) или абсолютным (false)