Архитектура подсистемы хранения и Key-Value базы данных
RUSEON Core реализует двухуровневую архитектуру хранения (pkg/storage/), разделяющую транзакционные метаданные с низкой задержкой и последовательный поток видеоархива.
1. Уровень 1: Встраиваемая база данных состояния (BadgerDB v4)
Для хранения состояния камер, пользователей, тегов и папок используется BadgerDB v4 (чистый Go, встраиваемая база данных LSM-дерева):
Схема префиксов ключей:
| Пространство ключей | Формат ключа | Структура значения (JSON) |
|---|---|---|
camera: | camera:{camera_id} | CameraConfig (URL, флаги записи, ретеншн, SIM-карта, теги, папка) |
tag: | tag:{tag_id} | TagConfig (ID, Название, HEX-цвет) |
folder: | folder:{folder_id} | FolderConfig (ID, Название, Родительский ID) |
user: | user:{username} | User (Имя, Хэш пароля bcrypt, Роль: admin/operator/viewer/service) |
Параметры BadgerDB в ядре:
- Низкий расход RAM:
MemTableSize = 16MB,NumMemtables = 1. - Ночной сборщик мусора GC: Фоновый процесс (
0 3 * * *) запускаетRunValueLogGC(0.5)для сжатия и очистки дискового пространства. - Атомарный бэкап:
GET /api/system/backup/exportвыгружает полный JSON-снимок (BackupData), восстанавливаемый черезPOST /api/system/backup/import.
2. Уровень 2: Хранилище медиафайлов (LocalFS)
Видеофайлы сохраняются в корневой каталог архива (по умолчанию recordings/):
- Завершенные часовые отрезки:
recordings/{camera_id}/{YYYY-MM-DD_HH-mm-ss}_to_{HH-mm-ss}.mp4 - Текущая запись:
recordings/{camera_id}/{YYYY-MM-DD_HH-mm-ss}_ongoing.mp4 - Вытеснение кеша
POSIX_FADV_DONTNEEDудерживает RAM сервера в фиксированных границах.