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_depthage 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.