Skip to content

Gravação DVR

O DVR do Sapsan é um armazenamento próprio em disco: o stream é gravado append-only em arquivos por hora, por pista, em vários discos ao mesmo tempo. Ler o arquivo não atrapalha gravá-lo.

Armazenamento

A seção global dvr descreve o armazenamento inteiro:

dvr:
  root: /storage            # raiz do arquivo
  catalog: /storage/catalog # catálogo de blobs (por padrão <root>/catalog)
  disks:
  - path: d1                # discos relativos a root
  - path: d2
  - path: d3

Parâmetros do disco:

Parâmetro Descrição
path caminho do disco relativo a root
mode Active (padrão) ou Degraded — o disco é lido, mas não se grava nele
min_free_bytes reserva mínima de espaço livre

check_mount verifica que o caminho do disco seja de fato um ponto de montagem (protege contra gravar num diretório vazio quando um disco cai).

Warning

Os discos de gravação são listados explicitamente. A root é a casa do catálogo e a base das rotas relativas, não um disco: com disks vazio, a gravação de cada fragmento termina em erro, visível nas estatísticas, e nada é gravado na root.

Além dos discos de arquivo, o armazenamento pode ter discos de cache (cache_disks) — neles assentam as partes do arquivo que foram lidas: o alheio trazido de outro servidor ou o próprio levantado dos discos de arquivo. A gravação ao vivo nunca os escolhe, e o espaço neles não é liberado pela limpeza, e sim pelo despejo conforme a idade do último acesso. Isso é o cache do arquivo num nó edge.

Ativar a gravação num stream

streams:
  - name: cam1
    inputs:
    - rtsp:
        url: rtsp://admin:password@10.0.0.5/stream0
    dvr:
      max_depth: 168        # profundidade do arquivo, horas
      max_bytes: 500000000000

dvr: {} liga a gravação com as configurações padrão.

Distribuição da gravação entre discos

O Sapsan distribui sozinho a gravação entre os discos ativos:

  • horas consecutivas de um mesmo stream alternam entre discos;
  • streams vizinhos se espalham de forma parelha entre os discos;
  • as pistas de um stream multi-bitrate são gravadas em paralelo em discos diferentes.

Um disco em modo degraded continua servindo leituras mas não recebe dados novos — é assim que um disco é aposentado sem perder o arquivo.

Limpeza e retenção

A limpeza roda uma vez por hora (5 minutos depois da virada da hora):

  • max_depth age com granularidade de hora: só são apagadas as horas plenamente vencidas;
  • max_bytes é contado dos blobs mais novos para os mais velhos: é apagado tudo mais antigo que o primeiro blob a exceder o limite;
  • com os dois limites definidos, vence o mais rígido;
  • blobs com episódios protegidos nunca são apagados pela retenção;
  • o blob da hora atual (a que está sendo gravada) nunca é apagado.

A proteção contra estouro do disco funciona à parte: quando o espaço livre cai abaixo de min_free_bytes (por padrão, 1 % da capacidade do disco), o Sapsan apaga os blobs mais velhos desconsiderando a retenção até liberar espaço suficiente.

Como funciona o armazenamento

O arquivo está disposto nos discos como <disk>/<hash>/<stream>/<Y>/<M>/<D>/<hour>.mp4. Os ficheiros são apenas anexados, nunca reescritos; segmentos init idênticos são deduplicados dentro de um blob.

Um indexador em segundo plano reconcilia sem parar o catálogo com os discos e cura as divergências sem participação do administrador:

  • blobs que apareceram no disco às costas do catálogo (por exemplo, depois de mover discos de outro servidor) são acrescentados ao catálogo;
  • registros de ficheiros desaparecidos são removidos;
  • o índice sidecar de um blob corrompido é reconstruído varrendo o próprio blob;
  • os tamanhos em bytes e os filtros bloom dos blobs são preenchidos em segundo plano (blobs mais novos que uma hora não são mexidos).

As leituras toleram falhas: se o catálogo aponta para o disco errado, o fragmento é procurado em todos os discos daquela hora; registros órfãos do catálogo são pulados sem erro.

Observabilidade

O DVR entrega estatísticas por disco (espaço livre/total, contadores de operações e de bytes de leitura/gravação, número de blobs, bytes ocupados pelo arquivo) e do catálogo — veja o Admin API e o monitoramento.

Próximos passos