Запись архива (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 и мониторинг.