Skip to content

Запись архива (DVR)

DVR в Sapsan — это собственное дисковое хранилище: поток пишется append-only в часовые файлы, раздельно по дорожкам, на несколько дисков одновременно. Чтение архива не мешает записи.

Хранилище

Глобальная секция 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 включает проверку, что путь диска — действительно точка монтирования (защита от записи в пустой каталог при отвалившемся диске).

Включение записи у потока

streams:
  cam1:
    inputs:
    - rtsp:
        url: rtsp://admin:password@10.0.0.5/stream0
    dvr:
      max_depth: 168        # глубина архива, часов
      max_bytes: 500000000000

dvr: {} включает запись с настройками по умолчанию.

Распределение записи по дискам

Sapsan сам балансирует запись между активными дисками:

  • последовательные часы одного потока чередуются по дискам;
  • соседние потоки размазываются по дискам равномерно;
  • дорожки мультибитрейтного потока пишутся на разные диски параллельно.

Диск в режиме degraded продолжает читаться, но новые данные на него не пишутся — так диск выводят из эксплуатации без потери архива.

Очистка и удержание

Очистка запускается раз в час (через 5 минут после границы часа):

  • max_depth действует с точностью до часа: удаляются только полностью истекшие часы;
  • max_bytes считается от новых блобов к старым: удаляется все старше первого блоба, превысившего лимит;
  • если заданы оба лимита — побеждает более жесткий;
  • блобы с защищенными эпизодами не удаляются по ретеншену;
  • блоб текущего (пишущегося) часа не удаляется никогда.

Отдельно работает защита от переполнения диска: когда свободное место падает ниже min_free_bytes (по умолчанию 1% емкости диска), Sapsan удаляет старейшие блобы невзирая на ретеншен, пока не освободит место.

Как устроено хранение

Архив лежит на дисках в виде <disk>/<hash>/<stream>/<Y>/<M>/<D>/<hour>.mp4. Файлы только дописываются, никогда не переписываются; одинаковые init-сегменты дедуплицируются внутри блоба.

Фоновый индексер постоянно сверяет каталог с дисками и лечит расхождения без участия администратора:

  • блобы, появившиеся на диске мимо каталога (например, после переноса дисков с другого сервера), добавляются в каталог;
  • записи о пропавших файлах удаляются;
  • поврежденный сайдкар-индекс блоба перестраивается сканированием самого блоба;
  • размеры и bloom-фильтры блобов дозаполняются в фоне (блобы моложе часа не трогаются).

Чтение устойчиво к сбоям: если каталог указывает не на тот диск, фрагмент ищется на всех дисках часа; осиротевшие записи каталога пропускаются без ошибки.

Наблюдаемость

DVR отдает статистику по каждому диску (свободное/полное место, счетчики операций и байтов чтения-записи, число блобов, занято архивом) и по каталогу — смотрите Admin API и мониторинг.

Что дальше