Проблемы с драйвером истории (wb-mqtt-db)

Здравствуйте!
Хочу уточнить, как правильно работать с группами/каналами в настройках истории, так как второй раз сталкиваюсь с очень неприятной проблемой из за которой не работают графики.
Изначально, проблему я встретил только в своем веб-приложении, что я пишу для WB, но понял быстро, что оно затрагивает и homeui, и в целом взаимодействие с wb-mqtt-db драйвером
Ситуация:
Заметил, что wb-mqtt-db перестал отвечать на запросы вообще, не мог построить графики (в том числе из homeui), пошел копать. Оказалось, что настройках была одна группа all с очень агрессивными параметрами, что забила память контроллера + сама эта группа была забита тоже. Последнее, насколько я понимаю, приводит к тому, что wb-mqtt-db старается зачищать данные по прибытию новых.
Что сделал, чтобы исправить ситуацию:

  1. Прописал новые группы, нужные мне, уменьшил “агрессивность” all группы
  2. Почистил вручную бд. Точные команды приведу ниже.
Команды для чистки БД
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 перезапускается, а соответственно он не будет отвечать на запросы, хотя раньше тоже не отвечал без всяких бд повреждений (полагаю, что из за заполненности группы?)

Хотелось бы разобраться в следующем:

  1. Хоть и “проблема” конкретно проявляется с map3et устройствами, вопрос открыт: а что делать если группа забивается? Забьется она в любом случае, а есть ощущение, что db сервис перестает отвечать на запросы просто в такой ситуации.. не чистить же БД каждый раз, верно?
  2. Если БД повреждена, то значит моими командами, а что было сделано неверно тогда?

Служебная информация:
Wiren Board 6.8.1, wb-2507
wb-mqtt-db 2.9.1

Добрый день!

“values_total”: 1000000, для группы с двумя устройствами wb-map3et – это много. У wb-map3et обычно 10–20 каналов, то есть values: 60_000 × ~20 каналов = до 1.2 млн записей. Это приводит к тому, что очистка, когда она наконец срабатывает, удаляет сотни тысяч строк за раз.

Глубина хранения истории настраивается с помощью параметров «Максимальное количество записей на канал» и «Максимальное количество записей на группу». Работает это так:

  1. Группируете каналы по группам. По умолчанию создана группа all, куда включены все существующие mqtt-каналы по маске +/+.

  2. Далее настраиваете параметр «Максимальное количество записей на канал» для каждого канала.

  3. И, чтобы не было сюрпризов, вроде заполненной памяти контроллера, ограничиваете «Максимальное количество записей на группу».

Старые записи должны удаляться ,если хватает памяти:

      // Максимальное число записей одного канала в базе.
      // При превышении, наиболее старые записи будут удалены.
      "values" : 10000,

      // Максимальное число записей всех каналов, относящихся к группе.
      // При превышении, наиболее старые записи будут удалены.
      "values_total" : 100000,

Отдельная очистка не требуется, если правильно настроена глубина хранения.

Если база повреждена, то лучше полностью удалить данные (если они вам не нужны):

systemctl stop wb-mqtt-db
rm /var/lib/wirenboard/db/data.db
systemctl start wb-mqtt-db

Спасибо, стало понятнее, но пару вопросов осталось все же
Касаемо этой фразы:

Это из за того, что values_total большой или хуже влияет то, что values * кол-во каналов > values_total?
Я исходил из пожелания того, чтоб данные хранились подольше и пользователь мог “отлистнуть” назад с неплохой точностью (посмотреть данные возрастом в 1 месяц, например). Сильно ли важен values_total в таком контексте?

Мои вопросы применяются и к этой фразе тоже:

По какому принципу я ее настраиваю правильно?

Придерживаясь вашего примера values=10_000 и values_total=100_000, происходит ситуация такая же, что values * кол-во каналов > values_total, но я предполагаю, что из за меньшего values_total удаление из БД не настолько агрессивное, чтобы драйвер не отвечал на запросы, верно?

Оба параметра влияют, но главная проблема именно в слишком большом values_total.

По-умолчанию БД хранит 100000 точек, но не более 10000 по каждому каналу.

Уменьшите values_total, очистите базу и понаблюдайте.

Ручную очистку рекомендую делать только при остановленном сервисе.

Понял, спасибо большое вам!