Skip to content

Grabación DVR

El DVR de Sapsan es un almacenamiento propio en disco: el stream se escribe append-only en archivos por horas, por pista, en varios discos a la vez. La lectura del archivo no interfiere con la escritura.

Almacenamiento

La sección global dvr describe el almacenamiento entero:

dvr:
  root: /storage            # raíz del archivo
  catalog: /storage/catalog # catálogo de blobs (por defecto <root>/catalog)
  disks:
  - path: d1                # discos relativos a root
  - path: d2
  - path: d3

Parámetros del disco:

Parámetro Descripción
path ruta del disco relativa a root
mode Active (por defecto) o Degraded — el disco se lee, pero no se escribe en él
min_free_bytes reserva mínima de espacio libre

check_mount comprueba que la ruta del disco sea de verdad un punto de montaje (protege de escribir en un directorio vacío cuando un disco se cae).

Warning

Los discos de escritura se enumeran explícitamente. root es la casa del catálogo y la base de las rutas relativas, no un disco: con disks vacío, la escritura de cada fragmento termina en un error visible en las estadísticas, y en root no se escribe nada.

Además de los discos de archivo, el almacenamiento puede llevar discos de caché (cache_disks) — en ellos se asientan las partes del archivo que se leyeron: el ajeno traído de otro servidor o el propio levantado de los discos de archivo. La grabación en vivo nunca los elige, y su espacio no lo libera la limpieza, sino el desalojo según la antigüedad del último acceso. Eso es la caché del archivo en un nodo edge.

Activar la grabación en un stream

streams:
  - name: cam1
    inputs:
    - rtsp:
        url: rtsp://admin:password@10.0.0.5/stream0
    dvr:
      max_depth: 168        # profundidad del archivo, horas
      max_bytes: 500000000000

dvr: {} activa la grabación con los ajustes por defecto.

Reparto de la escritura entre discos

Sapsan reparte solo la grabación entre los discos activos:

  • las horas consecutivas de un mismo stream se alternan entre discos;
  • los streams vecinos se reparten de forma pareja entre los discos;
  • las pistas de un stream multibitrate se escriben en paralelo en discos distintos.

Un disco en modo degraded sigue sirviendo lecturas pero no recibe datos nuevos — así se retira un disco sin perder el archivo.

Limpieza y retención

La limpieza se ejecuta una vez por hora (5 minutos después del cambio de hora):

  • max_depth actúa con granularidad de hora: solo se borran las horas plenamente vencidas;
  • max_bytes se cuenta de los blobs más nuevos hacia los más viejos: se borra todo lo anterior al primer blob que exceda el límite;
  • con ambos límites fijados, gana el más estricto;
  • los blobs con episodios protegidos nunca se borran por retención;
  • el blob de la hora actual (la que se está escribiendo) nunca se borra.

La protección contra el desbordamiento del disco funciona aparte: cuando el espacio libre cae por debajo de min_free_bytes (por defecto, el 1 % de la capacidad del disco), Sapsan borra los blobs más viejos al margen de la retención hasta liberar espacio suficiente.

Cómo funciona el almacenamiento

El archivo está dispuesto en los discos como <disk>/<hash>/<stream>/<Y>/<M>/<D>/<hour>.mp4. Los ficheros solo se añaden, nunca se reescriben; los segmentos init idénticos se deduplican dentro de un blob.

Un indexador en segundo plano sincroniza sin descanso el catálogo con los discos y cura las divergencias sin intervención del administrador:

  • los blobs que aparecieron en el disco a espaldas del catálogo (por ejemplo, tras mover discos de otro servidor) se añaden al catálogo;
  • los registros de ficheros desaparecidos se eliminan;
  • el índice sidecar de un blob dañado se reconstruye escaneando el propio blob;
  • los tamaños en bytes y los filtros bloom de los blobs se rellenan en segundo plano (a los blobs más jóvenes de una hora no se les toca).

Las lecturas toleran fallos: si el catálogo apunta al disco equivocado, el fragmento se busca en todos los discos de esa hora; los registros huérfanos del catálogo se saltan sin error.

Observabilidad

El DVR entrega estadísticas por disco (espacio libre/total, contadores de operaciones y de bytes de lectura/escritura, número de blobs, bytes ocupados por el archivo) y del catálogo — véanse el Admin API y la monitorización.

Siguientes pasos