UniSet 2.32.1
BackendClickHouse: Реализация работы с ClickHouse.

Настройка BackendClickHouse

Пример секции конфигурации:
<BackendClickHouse name="BackendClickHouse1" dbhost="localhost" dbport="9000" dbuser="" dbpass=""
filter_field="clickhouse" filter_value="1"
tags="TAG1=VAL1 TAG2=VAL2 ..."/>

Где:

  • dbhost - host для связи с ClickHouse
  • dbport - port для связи с ClickHouse. Default: 9000
  • dbuser - user
  • dbpass - password
  • dbtablename - Имя таблицы в которую писать данные. По умолчанию main_history.
  • filter_field - поле у датчика, определяющее, что его нужно сохранять в БД
  • filter_value - значение filter_field, определяющее, что датчик нужно сохранять в БД
  • tags - теги которые будут добавлены для каждой записи (перечисляются через пробел)

Так же статические теги можно указывать непосредственно у датчиков

<sensors>
...
<item id="54" iotype="AI" name="AI54_S" textname="AI sensor 54" clickhouse="1" clickhouse_tags=""/>
<item id="55" iotype="AI" name="AI55_S" textname="AI sensor 55" clickhouse="1" clickhouse_tags="tag1=val1 tag2=val2"/>
...
</sensors>

Буфер на запись в БД

В данной реализации встроен специальный буфер, который накапливает данные и скидывает их пачкой в БД. Так же он является защитным механизмом на случай если БД временно недоступна. Параметры буфера задаются аргументами командной строки или в конфигурационном файле. Доступны следующие параметры:

  • bufSize - размер буфера, при заполнении которого происходит запись данных в БД
  • bufMaxSize - максимальный размер буфера, при котором все данные теряются (буфер чиститься)
  • bufSyncTimeout - период принудительного сброса данных в БД, миллисек.
  • reconnectTime - время на повторную попытку подключения к БД, миллисек.
  • sizeOfMessageQueue - Размер очереди сообщений для обработки изменений по датчикам. При большом количестве отслеживаемых датчиков, размер должен быть достаточным, чтобы не терять изменения.

Настройка динамических тегов

Значения тегов настраиваются в секции <clickhouse_tags>

<BackendClickHouse ...>
<clickhouse_tags>
....
</clickhouse_tags>
</BackendClickHouse>

см. также BackendClickHouse: Поддержка динамических тегов

Впомогательная утилита uniset2-clickhouse-admin

В состав проекта так же входит утилита uniset2-clickhouse-admin облегчающая взаимодействие с ClickHouse. В частности утилита позволяет сгенерировать csv-файлы словарей для подключения к проекту.

Usage: uniset2-clickhouse-admin [command] config.xml
uniset2-clickhouse-admin - generate data for clickhouse server
Valid command are:
-h, --help - display help
-d, --dicts - Generate dictionaries data (csv files) for Clickhouse
-c, --create [dbname] - Create database. Default dbname=uniset
-s, --size - Show table sizes
--outdir dir - write files to directory
Definition Calibration.h:27

В проект входят пример файла для настройки и подключения csv-словарей к ClickHouse. В результате в БД будут доступны словари dict_sensors, dict_objects, dict_nodes позволяющие использовать имена датчиков и другие характеристики в запросах. Пример простого запроса выводящего историю изменения датчиков за последний час

SELECT
timestamp,
value,
dictGetString('dict_sensors', 'name', name_hid),
dictGetString('dict_nodes', 'ip', node_hid)
FROM main_history
WHERE timestamp > now() - toIntervalHour(1)

Или по конкретному датчику

SELECT
timestamp,
value,
dictGetString('dict_sensors', 'name', name_hid),
dictGetString('dict_nodes', 'ip', node_hid)
FROM main_history
WHERE timestamp > now() - toIntervalHour(30) and name_hid = cityHash64('Sensor1_AS')

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

SELECT
timestamp,
value,
tag,
tagvalue
FROM main_history
ARRAY JOIN
tags.name AS tag,
tags.value AS tagvalue
WHERE (tag = 'system') AND (tagvalue = 'temp')

Описание доступных в словарях полей можно посмотреть в файле clickhouse_uniset_dictionary.xml