Здравствуйте!
Хочу уточнить, как правильно работать с группами/каналами в настройках истории, так как второй раз сталкиваюсь с очень неприятной проблемой из за которой не работают графики.
Изначально, проблему я встретил только в своем веб-приложении, что я пишу для WB, но понял быстро, что оно затрагивает и homeui, и в целом взаимодействие с wb-mqtt-db драйвером
Ситуация:
Заметил, что wb-mqtt-db перестал отвечать на запросы вообще, не мог построить графики (в том числе из homeui), пошел копать. Оказалось, что настройках была одна группа all с очень агрессивными параметрами, что забила память контроллера + сама эта группа была забита тоже. Последнее, насколько я понимаю, приводит к тому, что wb-mqtt-db старается зачищать данные по прибытию новых.
Что сделал, чтобы исправить ситуацию:
- Прописал новые группы, нужные мне, уменьшил “агрессивность”
allгруппы - Почистил вручную бд. Точные команды приведу ниже.
Команды для чистки БД
sqlite3 /var/lib/wirenboard/db/data.db "
WITH ranked AS (
SELECT d.uid,
row_number() OVER (
PARTITION BY d.channel
ORDER BY d.timestamp DESC, d.uid DESC
) AS rn
FROM data d
JOIN channels c ON c.int_id = d.channel
WHERE c.device NOT IN ('wb-modbus-0-0', 'wb-modbus-0-1')
)
DELETE FROM data
WHERE uid IN (
SELECT uid FROM ranked WHERE rn > 10000
);
"
sqlite3 /var/lib/wirenboard/db/data.db "
WITH ranked AS (
SELECT d.uid,
row_number() OVER (
PARTITION BY d.channel
ORDER BY d.timestamp DESC, d.uid DESC
) AS rn
FROM data d
JOIN channels c ON c.int_id = d.channel
WHERE c.device = 'wb-modbus-0-0'
)
DELETE FROM data
WHERE uid IN (
SELECT uid FROM ranked WHERE rn > 60000
);
"
sqlite3 /var/lib/wirenboard/db/data.db "VACUUM;"
Памятка: важно было оставить побольше данных на двух modbus устройствах, но по сути конечная цель была просто почистить бд, не снося ее полностью, чтобы все работало.
По итогу после перезапуска wb-mqtt-db все работало как и раньше, может даже лучше, а память контроллера подосвободилась
Проблема:
Снова забилась группа, но уже map3et устройств, снова графики работать перестали, хотя память контроллера свободна
Перед возобновлением проблемы я прописал вот такую группу на map3et устройства, которая мне не показалась сильно агрессивной
Группа на датчики
{
"name": "Датчики электроэнергии",
"channels": ["wb-map3et_229/+", "wb-map3et_242/+"],
"values": 60000,
"values_total": 1000000,
"min_interval": 60,
"min_unchanged_interval": 300,
"max_burst": 30
},
По итогу результат точно такой же, группа забита, а wb-mqtt-db не отвечает на rpc запросы → графики строить нет возможности (в том числе с homeui), но симптоматика из журнала в контроллере немного другая
Вывод логов wb-mqtt-db
Jun 02 07:49:48 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: MQTT broker localhost:1883
Jun 02 07:49:48 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: Config file /etc/wb-mqtt-db.conf
Jun 02 07:49:48 wirenboard-ALOYGCV6 systemd[1]: Started Wiren Board database logger.
Jun 02 07:49:48 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] Default host and port detected, checking if UNIX socket exists on>
Jun 02 07:49:48 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] UNIX socket exists, using it for connection
Jun 02 07:49:48 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [sqlite] Creating tables if necessary
Jun 02 07:49:48 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [sqlite] Create indices if necessary
Jun 02 07:49:48 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [sqlite] Analyzing data table
Jun 02 07:50:27 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [sqlite] DB initialization is done
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: DB logger started, go to main loop
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] connection estabilished with code "0" <success>
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 1)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 2)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 4)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 5)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 6)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 7)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 8)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 9)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 10)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 11)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 12)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 13)
Jun 02 07:50:42 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 14)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 15)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 16)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 17)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 18)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 19)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 20)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 21)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 22)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 23)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 24)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 25)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 26)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 27)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 28)
Jun 02 07:50:45 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 29)
Jun 02 07:50:51 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 32)
Jun 02 07:50:51 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [mqtt] subscription succeeded (message id 34)
Jun 02 07:50:51 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: INFO: [dblogger] Group data limit is reached: group Датчики электроэнергии, ro>
Jun 02 07:51:09 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: ERROR: database disk image is malformed
Jun 02 07:51:10 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: WARNING: [rpc] Unable to cleanup topic '/rpc/v1/db_logger/history/get_values':>
Jun 02 07:51:14 wirenboard-ALOYGCV6 wb-mqtt-db[14821]: terminate called without an active exception
Jun 02 07:51:14 wirenboard-ALOYGCV6 systemd[1]: wb-mqtt-db.service: Main process exited, code=killed, status=6/ABRT
Jun 02 07:51:14 wirenboard-ALOYGCV6 systemd[1]: wb-mqtt-db.service: Failed with result 'signal'.
Jun 02 07:51:14 wirenboard-ALOYGCV6 systemd[1]: wb-mqtt-db.service: Consumed 16.812s CPU time.
Jun 02 07:51:15 wirenboard-ALOYGCV6 systemd[1]: wb-mqtt-db.service: Scheduled restart job, restart counter is at 853.
Jun 02 07:51:15 wirenboard-ALOYGCV6 systemd[1]: Stopped Wiren Board database logger.
Я полагаю, что я повредил саму бд, однако сообщение о заполненности группы тоже имеется. Насколько я понимаю, wb-mqtt-db перезапускается, а соответственно он не будет отвечать на запросы, хотя раньше тоже не отвечал без всяких бд повреждений (полагаю, что из за заполненности группы?)
Хотелось бы разобраться в следующем:
- Хоть и “проблема” конкретно проявляется с map3et устройствами, вопрос открыт: а что делать если группа забивается? Забьется она в любом случае, а есть ощущение, что db сервис перестает отвечать на запросы просто в такой ситуации.. не чистить же БД каждый раз, верно?
- Если БД повреждена, то значит моими командами, а что было сделано неверно тогда?
Служебная информация:
Wiren Board 6.8.1, wb-2507
wb-mqtt-db 2.9.1