Архив с другого сервера (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.