Запись архива¶
media.dvr.record
DVR в Sapsan — это собственное дисковое хранилище: поток пишется append-only в часовые файлы, раздельно по дорожкам, на несколько дисков одновременно. Чтение архива не мешает записи.
Производительность и стабильная адресация¶
Хранилище успешно апробировано при скорости записи 25 Гбит/с на шпиндельные диски одновременно с чисткой архива и чтением. Это результат апробации конфигурации хранилища; при выборе оборудования учитывайте суммарную нагрузку записи и чтения.
Каждый фрагмент и каждый кадр имеет стабильный адрес: имя стрима, идентификатор дорожки и целочисленный timestamp. Временная шкала задаётся целочисленными отсчётами и их частотой (timescale), без округления до дробных секунд. Адрес не зависит от физического диска или сервера и сохраняется во всём кластере, при репликации и переносе архива.
Это позволяет ИИ-видеоаналитике сохранять ссылки на обнаруженные события, а ERP-системам затем обращаться к тем же отдельным кадрам. Для кадра JPEG-дорожки используется /streaming/v/<stream>/image/<track>/<utc_ms>.jpg; адреса фрагментов содержат дорожку и timestamp в форме <ticks>-<timescale>. Доступность данных по стабильному адресу ограничена сроком хранения архива и правами доступа.
Хранилище¶
Глобальная секция dvr описывает хранилище целиком:
dvr:
root: /storage # корень архива
catalog: /storage/catalog # каталог блобов (по умолчанию <root>/catalog)
disks:
- path: d1 # диски относительно root
- path: d2
- path: d3
Параметры диска:
| Параметр | Описание |
|---|---|
path |
путь диска относительно root |
mode |
Active (по умолчанию) или Degraded — диск читается, но не пишется |
min_free_bytes |
минимальный запас свободного места |
check_mount включает проверку, что путь диска — действительно точка монтирования (защита от записи в пустой каталог при отвалившемся диске).
Warning
Диски записи перечисляются явно. root — это дом каталога и база относительных путей, а не диск: при пустом disks запись каждого фрагмента завершается ошибкой, видимой в статистике, и в root данные не пишутся.
Кроме архивных дисков, в хранилище бывают кэш-диски (cache_disks) — на них оседают прочитанные участки архива: чужого, пришедшего с другого сервера, или своего, поднятого с архивных дисков. Живая запись их не выбирает, а место на них освобождает не зачистка, а вытеснение по давности обращения. Это кэш архива на эдже.
Включение записи у потока¶
streams:
- name: cam1
inputs:
- rtsp:
url: rtsp://admin:password@10.0.0.5/stream0
dvr:
max_depth: 168 # глубина архива, часов
dvr: {} включает запись с настройками по умолчанию.
Распределение записи по дискам¶
Sapsan сам балансирует запись между активными дисками:
- последовательные часы одного потока чередуются по дискам;
- соседние потоки размазываются по дискам равномерно;
- дорожки мультибитрейтного потока пишутся на разные диски параллельно.
Диск в режиме degraded продолжает читаться, но новые данные на него не пишутся — так диск выводят из эксплуатации без потери архива.
Как устроено хранение¶
Архив лежит на дисках в виде <disk>/<hash>/<stream>/<Y>/<M>/<D>/<hour>.mp4. Файлы только дописываются, никогда не переписываются; одинаковые init-сегменты дедуплицируются внутри блоба.
Фоновый индексер постоянно сверяет каталог с дисками и лечит расхождения без участия администратора:
- блобы, появившиеся на диске мимо каталога (например, после переноса дисков с другого сервера), добавляются в каталог;
- записи о пропавших файлах удаляются;
- поврежденный сайдкар-индекс блоба перестраивается сканированием самого блоба;
- размеры и bloom-фильтры блобов дозаполняются в фоне (блобы моложе часа не трогаются).
Чтение устойчиво к сбоям: если каталог указывает не на тот диск, фрагмент ищется на всех дисках часа; осиротевшие записи каталога пропускаются без ошибки.
Наблюдаемость¶
DVR отдает статистику по каждому диску (свободное/полное место, счетчики операций и байтов чтения-записи, число блобов, занято архивом) и по каталогу — смотрите Admin API и мониторинг.