Найти в Дзене
DigitalComfort

Ускорение работы Home Assistant - установка базы данных MariaDB

База данных в Home Assistant используется для хранения истории изменения данных с датчиков, истории различных событий объектов и устройств и прочей статистики. Сама конфигурация Home Assistant в БД не хранится. И чем больше в системе устройств и датчиков, чем чаще они отправляют свои данные, тем больше становится размер БД. Home Assistant "из коробки" использует СУБД (систему управления базой данных) SQLite. И долгое время меня этот вопрос вообще не заботил, и я даже не знал, как именно оно устроено. До тех пор, пока Home Assistant не начал работать всё медленнее и медленнее. Напомню, что я не являюсь специалистом ни в области программирования на каком бы то ни было языке (хотя и немного развлекаюсь этим для своих практических нужд на C++ и C#), ни в области администрирования операционных систем или баз данных. Поэтому, к сожалению, не смогу компетентно сравнить различные СУБД и показать преимущества одних типов перед другими. В моём конкретном случае задача была практическая и конкрет
Оглавление

База данных в Home Assistant используется для хранения истории изменения данных с датчиков, истории различных событий объектов и устройств и прочей статистики. Сама конфигурация Home Assistant в БД не хранится. И чем больше в системе устройств и датчиков, чем чаще они отправляют свои данные, тем больше становится размер БД.

Зачем я поставил MariaDB

Home Assistant "из коробки" использует СУБД (систему управления базой данных) SQLite. И долгое время меня этот вопрос вообще не заботил, и я даже не знал, как именно оно устроено. До тех пор, пока Home Assistant не начал работать всё медленнее и медленнее.

Напомню, что я не являюсь специалистом ни в области программирования на каком бы то ни было языке (хотя и немного развлекаюсь этим для своих практических нужд на C++ и C#), ни в области администрирования операционных систем или баз данных. Поэтому, к сожалению, не смогу компетентно сравнить различные СУБД и показать преимущества одних типов перед другими.

В моём конкретном случае задача была практическая и конкретная - ускорить работу Home Assistant. Поиски информации по этой проблеме привели меня к изучению темы БД Home Assistant.

Одной из причин медленной работы умного дома могла быть разросшаяся по размерам база данных. Размер файла home-assistant_v2.db (а SQLite хранит всю базу данных в одном файле) в какой-то момент у меня достиг нескольких гигабайт (я намеренно увеличил время хранения статистики с дефолтных 10-ти до 90 дней), а сам Home Assistant в то время работал ещё на Raspberry Pi3 с обычной картой памяти.

По найденным в сообществе Home Assistant советам я решил перейти с медленной СУБД SQLite на более быструю СУБД - MariaDB, которая является ответвлением от СУБД MySQL.

Так ли это на самом деле, что эти СУБД отличаются по скорости работы, я не знаю. Возможно, что и нет. А может быть и сама постановка вопроса некорректна. Но, вероятно, из-за разной архитектуры хранения данных на носителе эти СУБД отличаются по эффективности при работе с БД большого размера.

Впрочем, все эти размышления и догадки без углублённого изучения матчасти практического смысла не имеют. Главное лишь в том, что переход с SQLite на MariaDB решил проблему медленной работы Home Assistant.

Возможно ли было выполнить корректную миграцию данных с одной БД на другую, я так и не понял, информации по этому вопросу я не нашёл, и в тот момент я потерял всю накопленную с датчиков статистику. База данных начала копиться с нуля. Но когда она достигла тех же значений своего объёма, то Home Assistant продолжал работать так же быстро, как и раньше. Сейчас размер БД у меня составляет около 8 Гб, и никаких проблем со скоростью работы HA я не наблюдаю.

Вторым преимуществом установки MariaDB стала возможность использовать phpMyAdmin - широко известный инструмент администрирования баз данных MySQL через веб-интерфейс, где в ручном режиме с помощью SQL-запросов можно как изучать сохраняемые в БД данные, так и корректировать их. Для SQLite приложения администрирования тоже существуют, но они все слабенькие и не могут быть встроены в Home Assistant. Приходилось делать копию файла home-assistant_v2.db, скачивать его по samba на комп, изучать, корректировать и заливать обратно. Всё это было очень долго и неудобно. А для phpMyAdmin в Home Assistant есть специальное дополнение, которое позволяет администрировать БД на лету:

Подготовка к установке дополнения MariaDB

Ещё раз оговорюсь - я не знаю как корректно выполнить миграцию данных из базы SQLite в базу MariaDB, и возможно ли это вообще, поэтому выполняя мои последующие рекомендации вы однозначно потеряете всю накопленную статистику, и данные начнут копиться заново. Все графики, журнал событий и история окажутся пустыми.

Так как процедура смены типа БД небезопасна и можно всё очень сильно поломать, то перед началом этих действий обязательно сделайте резервную копию системы - меню "Настройки" -> "Система" -> "Резервные копии".

Также не лишним будет отдельно создать копию базы данных - скопировать файл home-assistant_v2.db на свой компьютер, подключившись к Home Assistant по samba, если вы делаете это из под Windows. О том, как установить samba, я рассказывал здесь:

Файл home-assistant_v2.db расположен в папке config:

-2

Установка MariaDB

MariaDB устанавливается в Home Assistant как дополнение. То есть это будет самостоятельное программное обеспечение, не встроенное в ядро Home Assistant. СУБД будет работать рядом с Home Assistant, а Home Assistant будет обращаться уже не к своей локальной базе данных SQLite, а к другой базе данных, расположенной за пределами Home Assistant и не видимой пользователю обычными средствами.

Переходим в магазин дополнений - меню "Настройки" -> "Дополнения" -> кнопка "Магазин дополнений" и находим там MariaDB:

-3

Выбираем его, и нажимаем кнопку "Установить":

-4

Скачивание и установка у меня заняли примерно полторы минуты. Включаем сторожевого пса (опцию Watchdog), чтобы в случае непредвиденного падения дополнения оно рестартовало автоматически:

-5

Переходим на вкладку "Конфигурация", и вместо null задаём пароль к БД, после чего нажимаем кнопку "Сохранить":

-6

Возвращаемся на вкладку "Информация" и нажимаем кнопку "Запустить", если дополнение не стартовало само на предыдущем шаге (у меня стартовало):

-7

Всё, СУБД MariaDB работает. Теперь нужно перенастроить Home Assistant на работу с новой базой данных.

Настройка Home Assistant

Потребуется отредактировать файл configuration.yaml. Это можно сделать с помощью дополнения File Editor, напомню, что рассказывал о его установке здесь:

Добавляем в файл configuration.yaml две строчки:

recorder:
db_url: 'mysql://homeassistant:homeassistant@core-mariadb/homeassistant?charset=utf8mb4'

-8

Сохраняем изменения, проверяем конфигурацию и перезапускаем Home Assistant:

-9

После первого перезапуска у меня новая БД не заработала, возникла ошибка. Первое, что обратило на себя внимание, это отсутствие пунктов меню "История" и "Журнал событий":

-10

А это значит, что встроенная интеграция "recorder", отвечающая за запись данных в БД, не стартовала. Открыв журнал сервера (меню "Настройки" -> "Система" -> "Журнал сервера") я увидел там ожидаемые ошибки:

-11

После чего, зайдя в меню "Настройки" -> "Дополнения" -> "MariaDB", я обнаружил, что дополнение не запущено. Запустил его снова вручную, и ещё раз перезагрузил Home Assistant. После второй перезагрузки все пункты меню вернулись на место, а дополнение стартовало автоматически:

-12

Последующие попытки перезапуска Home Assistant также больше не приводили к проблеме, из чего я делаю вывод о каком-то "сбое первого запуска". С таким явлением мне уже не раз приходилось сталкиваться, когда что-то вновь установленное или перенастроенное начинало работать только после второго перезапуска системы.

На этом всё. Теперь Home Assistant работает с новой базой данных, других настроек для работы MariaDB не требуется. При резервном копировании системы новая база данных, как и прежде, будет автоматически включена в резервную копию, а при восстановлении - восстановлена. Никаких дополнительных действий для этого выполнять не нужно.