Wbincludes:WB6...7: Errata, Mosquitto 1.4 Persistence File: различия между версиями
(не показано 8 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
'''Описание''' | '''Описание''' | ||
Перестаёт работать веб-интерфейс, перестают приходить MQTT-сообщения. Также может рваться связь по VPN, медленно работать консоль | Перестаёт работать веб-интерфейс, перестают приходить MQTT-сообщения. Также может рваться связь по VPN, медленно работать консоль. Контроллер может самопроизвольно перезагружаться в результате [[watchdog|срабатывания сторожевого]] таймера, который следит за свободной RAM на контроллере. | ||
'''Причины и подробное описание''' | '''Причины и подробное описание''' | ||
Проблема вызвана не оборудованием или программным обеспечением, разработанным компанией Wiren Board, а является следствием бага в MQTT-брокере mosquitto, [[MQTT | используемом]] в контроллере: [https://github.com/eclipse/mosquitto/issues/389 Unexpected growth in the .db file]. | Проблема вызвана не оборудованием или программным обеспечением, разработанным компанией Wiren Board, а является следствием бага в MQTT-брокере mosquitto, [[MQTT | используемом]] в контроллере: [https://github.com/eclipse/mosquitto/issues/389 Unexpected growth in the .db file]. | ||
Строка 20: | Строка 19: | ||
Проверить размер базы данных брокера можно командой <code>du -h /var/lib/mosquitto/mosquitto.db</code>. | Проверить размер базы данных брокера можно командой <code>du -h /var/lib/mosquitto/mosquitto.db</code>. | ||
'''Пути обхода''' | |||
Важно! Инструкция ниже только для старых релизов, выпуск которых прекратился весной 2022 года — wb-2207 и старее. | |||
Чтобы вернуть контроллер в рабочее состояние: | |||
# Удалите файл с базой данных брокера (persistence file). Это можно сделать любым способом, но так как ПО контроллера, включая SSH, может работать медленно из-за недостатка свободного места, удобнее всего это сделать с помощью [[WB_Debug_Console |отладочной консоли]]: <code>rm /var/lib/mosquitto/mosquitto.db</code>. Если из-за проблем в работе контроллера у вас не получается удалить эту базу, можете [[Wiren_Board_7_Firmware_Update | выполнить factory reset]]. | |||
# В <code>/etc/mosquitto/mosquitto.conf</code> отключите функцию сохранения неотправленных сообщений в файл, для этого: | |||
## Откройте файл в редакторе: | |||
##:<syntaxhighlight lang="bash"> | |||
nano /etc/mosquitto/mosquitto.conf | |||
</syntaxhighlight> | |||
## Поменяйте <code>persistence true</code> на <code>persistence false</code>. | |||
# Перезапустите контроллер. | |||
# Ещё раз удалите файл с базой данных брокера. | |||
Либо:<syntaxhighlight lang="bash"> | |||
sed -i 's$^persistence true$persistence false$' /etc/mosquitto/mosquitto.conf && systemctl restart mosquitto | |||
</syntaxhighlight> | |||
Важно! При обновлении ПО контроллера файл <code>/etc/mosquitto/mosquitto.conf</code> будет заменён на дефолтный, поэтому снова установите <code>persistence false</code>. | |||
С отключенной функция сохранения неотправленных сообщений в файл, эта проблема не будет возникать. Однако в редких случаях, описанных в разделе «Причины и подробное описание», некоторые MQTT-сообщения могут быть не доставлены. | |||
'''Исправление''' | |||
По заявлениям разработчиков стороннего софта mosquitto, они исправили этот баг в mosquitto версии 1.5.6. '''В Debian 11 «bullseye» (релиз wb-2301 и новее) включен mosquitto версии 2.0.7-3 и новее, поэтому там этого бага нет.''' Поэтому для решения проблемы обновите прошивку контроллера на любой свежий стабильный релиз. |
Текущая версия на 16:14, 27 августа 2024
Описание
Перестаёт работать веб-интерфейс, перестают приходить MQTT-сообщения. Также может рваться связь по VPN, медленно работать консоль. Контроллер может самопроизвольно перезагружаться в результате срабатывания сторожевого таймера, который следит за свободной RAM на контроллере.
Причины и подробное описание Проблема вызвана не оборудованием или программным обеспечением, разработанным компанией Wiren Board, а является следствием бага в MQTT-брокере mosquitto, используемом в контроллере: Unexpected growth in the .db file.
Эта проблема связана с локальной базой брокера, который в оригинале называется persistence file.
Если брокер mosquitto не может отправить сообщение кому-то из подключенных клиентов, то он сохраняет сообщение в оперативной памяти. Например, это может случиться, когда настроена пересылка сообщений на другой брокер, подключенный через bridge, но внезапно пропала связь. Когда связь восстановится, сообщения из оперативной памяти будут отправлены.
Однако, если за время отсутствия связи сервис mosquitto был перезапущен,например, если выключался контроллер — эти данные будут утеряны. Чтобы не допустить утерю данных, брокер mosquitto может сохранять такие сообщения не только в оперативную память, но и на накопитель в свою базу данных, откуда потом загрузит информацию при следующем запуске. Подробнее в статье How to set up persistent storage for Mosquitto MQTT broker.
Базу данных для отложенных сообщения можно включать или выключать в настройках mosquitto. На контроллерах Wiren Board он по умолчанию включен.
Из-за ошибки в коде mosquitto pбаза данных брокера может вырастать до размера 50 Мбайт и более, хотя при нормальной работе он обычно меньше 25 Мбайт. При следующем запуске mosquitto не может обработать такой большой файл и в итоге не запускается. Из-за этого также перестают работать работать веб-интерфейс и отправка MQTT-сообщений.
Ещё база данных брокера большого размера может занять всё свободное место на разделе, из-за чего может перестать работать другой софт контроллера, в том числе VPN и SSH. Также в некоторых версиях ПО контроллера за статусом сервиса mosquitto следил watchdog, и из-за того, что сервис не запускался, watchdog перезапускал контроллер.
Проверить размер базы данных брокера можно командой du -h /var/lib/mosquitto/mosquitto.db
.
Пути обхода
Важно! Инструкция ниже только для старых релизов, выпуск которых прекратился весной 2022 года — wb-2207 и старее.
Чтобы вернуть контроллер в рабочее состояние:
- Удалите файл с базой данных брокера (persistence file). Это можно сделать любым способом, но так как ПО контроллера, включая SSH, может работать медленно из-за недостатка свободного места, удобнее всего это сделать с помощью отладочной консоли:
rm /var/lib/mosquitto/mosquitto.db
. Если из-за проблем в работе контроллера у вас не получается удалить эту базу, можете выполнить factory reset. - В
/etc/mosquitto/mosquitto.conf
отключите функцию сохранения неотправленных сообщений в файл, для этого:- Откройте файл в редакторе:
nano /etc/mosquitto/mosquitto.conf
- Поменяйте
persistence true
наpersistence false
.
- Откройте файл в редакторе:
- Перезапустите контроллер.
- Ещё раз удалите файл с базой данных брокера.
Либо:
sed -i 's$^persistence true$persistence false$' /etc/mosquitto/mosquitto.conf && systemctl restart mosquitto
Важно! При обновлении ПО контроллера файл /etc/mosquitto/mosquitto.conf
будет заменён на дефолтный, поэтому снова установите persistence false
.
С отключенной функция сохранения неотправленных сообщений в файл, эта проблема не будет возникать. Однако в редких случаях, описанных в разделе «Причины и подробное описание», некоторые MQTT-сообщения могут быть не доставлены.
Исправление
По заявлениям разработчиков стороннего софта mosquitto, они исправили этот баг в mosquitto версии 1.5.6. В Debian 11 «bullseye» (релиз wb-2301 и новее) включен mosquitto версии 2.0.7-3 и новее, поэтому там этого бага нет. Поэтому для решения проблемы обновите прошивку контроллера на любой свежий стабильный релиз.