Skip to content

Архив с другого сервера (remotes)

Sapsan умеет бесшовно проигрывать архив, который записан (или записывался раньше) на другом сервере. У потока указывается список удаленных серверов — и их архивы становятся продолжением локального: зритель видит один непрерывный архив и не знает, откуда физически приходят данные.

Типовые задачи, которые это решает:

  • миграция на новый сервер без потери истории — новый пишет свежий архив, старый хранит прошлое;
  • чтение архива с серверов-реплик;
  • восстановление после замены диска.

Настройка

streams:
  cam1:
    inputs:
    - rtsp:
        url: rtsp://10.0.0.5/stream0
    dvr: {}
    remotes:
    - url: http://old-server:5080
      timeout_ms: 5000
Параметр Описание
url адрес удаленного сервера Sapsan, на котором есть архив этого потока
timeout_ms таймаут запросов к удаленному серверу

Удаленных серверов может быть несколько — Sapsan опросит все.

Как достигается бесшовность

При каждом обращении к архиву Sapsan объединяет локальные и удаленные данные:

  • Границы архива — объединение диапазонов всех серверов: минимальное начало и максимальный конец. В интерфейсах и API поток выглядит как один непрерывный архив.
  • Плейлисты — списки фрагментов с локального DVR и со всех удаленных серверов сливаются, сортируются и дедуплицируются. На стыке двух архивов нет ни шва, ни дырки, ни дублей.
  • Фрагменты — читаются каскадом: live-буфер → локальный DVR → удаленный сервер. URL фрагмента для плеера одинаковый независимо от того, где лежат данные.

Это возможно благодаря абсолютной адресации фрагментов в Sapsan: имя фрагмента — это его UTC-время, поэтому один и тот же фрагмент называется одинаково на всех серверах, и объединение архивов не требует пересчета таймлайна.

Ленивая репликация

Фрагмент, прочитанный с удаленного сервера, автоматически дописывается в локальный архив. То есть локальный DVR постепенно «затягивает» те участки чужой истории, которые реально смотрят зрители, — и со временем перестает ходить за ними по сети. Ошибка такой записи не мешает отдаче зрителю.

Поведение при сбоях

  • Если удаленный сервер недоступен, а данные есть локально — проигрывание продолжается, проблема только логируется.
  • Sapsan запоминает, каких диапазонов на удаленном сервере нет (negative cache), и не опрашивает его повторно за отсутствующими данными.
  • Init-фрагменты удаленных потоков кешируются.

Note

TODO: авторизация запросов между серверами, рекомендации по таймаутам, ограничения (сколько remotes разумно), взаимодействие с config_external.

Что дальше