Skip to content

Запись архива

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 и мониторинг.

Что дальше