Копии VOD и балансировка¶
Ассет, залитый на один стример, играет только с него: упал стример — ассет недоступен, а все его зрители сидят на одной машине. Копия ассета на другом стримере снимает оба ограничения. Central раскладывает зрителей между стримерами, где лежит ассет, выпавший стример выпадает из выбора, вернувшийся возвращается в него.
Копия — не отдельная сущность: её делает то же задание, что и транскодирование, по шаблону ассета. В карточке ассета копия видна как ещё одно местоположение рядом с оригиналом.
Сколько копий¶
В форме шаблона есть поле Копии на других серверах: без копии, 1, 2 и так далее. Число считается помимо оригинала: 1 значит, что ассет будет лежать на двух стримерах. Список предлагает столько копий, сколько влезает в кластер, — стримеров с VOD-хранилищем минус один; подсказка под полем называет их число. Число из списка можно превысить через API, но задание тогда будет ждать, пока стример под копию не появится.

Копии делает каждое задание по этому шаблону: и то, что ставится само после загрузки, и Запустить задание… в карточке ассета. На копию уезжают выходы задания, описатель и все остальные файлы ассета, которых там ещё нет, — постер или субтитры, залитые позже, тоже доедут следующим заданием. Оригинал под удалять после обработки не копируется: он всё равно будет удалён.
Шаблон только из копии, без качеств, тоже допустим: так копируют уже готовые файлы, ничего не перекодируя.
Где ляжет копия¶
Стример под копию оператор не выбирает, его выбирает central при выдаче задания:
- стример на связи, с доступным VOD-хранилищем, у которого central может читать журнал;
- у стримера включена роль Копирование (см. ниже);
- на нём ещё нет этого ассета, ни оригинала, ни другой копии, — по одной копии на стример, иначе отказ машины не спасал бы зрителей;
- свободного места не меньше порога
vod_min_free_bytes(по умолчанию 1 ГиБ) плюс размер файлов ассета.
Из подходящих берётся самый свободный. Уже существующие копии ассета довозятся всегда, новые заводятся, пока копий меньше, чем задано.
Если стримера под копию нет, задание ждёт в очереди и попытки не тратит; в реестре заданий причина названа словами:
- нет сервера — нет ни одного стримера с ролью копирования без этого ассета;
- нет места — стримеры есть, но их хранилища заполнены;
- хранилище копии не готово — у уже существующей копии стример не на связи или заполнен;
- роль копирования снята — стример с уже лежащей копией выведен из копирования; вернут роль — копия доедет тем же заданием.
Появился стример, освободилось место или вернули роль — задание уезжает само.
Как копия доезжает¶
Копию делает отдельное задание копии на стримере-цели: в реестре заданий оно помечено как копия рядом с именем стримера, а в его карточке назван родитель — задание, чьи выходы довозятся. Central ставит его, когда родитель готов, а если шаблон состоит из одной копии, сразу. Стример-цель сам читает файлы у стримера с оригиналом по внутрикластерному адресу, сверяет размер и хеш с каталогом и публикует их у себя; ни central, ни стример с оригиналом байты не передают. Копии идут отдельной полосой и не занимают слоты транскодирования.
В карточке задания копии рядом со статусом стоят чип копия и, пока идут байты, чип загрузка копии; под полосой прогресса вместо обработанного и скорости транскода стоят Загружено — сколько байтов принято из скольких — и Скорость загрузки. В подробностях названы Сервер копии, Файлы, которые везёт это задание, и Родительское задание со ссылкой; у самого родителя копии перечислены в результате с сервером и статусом. Задание становится готово, когда принят каждый файл.

Если копировать нечего, потому что на копии уже лежит всё, родитель помечается без копии с подсказкой, почему копия не понадобилась. Обрыв чтения или несовпадение хеша закрывают задание копии ошибкой, и брокер повторяет его новой попыткой по свежему составу.
Копия готова, когда на ней лежит весь состав ассета. До этого местоположение стоит в статусе копируется; когда после смены состава копия отстаёт, она остаётся готовой на прежней ревизии и довозится следующим заданием.
Роли стримера¶
Кому central даёт работу с VOD, решают две роли стримера в настройках стримера, в секции Роль и размещение: Транскодирование — стример получает задания транскодирования своих ассетов, Копирование — стример принимает копии ассетов на свои хранилища и сам их довозит. Обе включены по умолчанию. Роль — решение central, умение — свойство сборки: у стримера без бэкенда транскодера под переключателем стоит пометка, и заданий транскодирования он не получит, что бы ни стояло в роли.
Снятая роль останавливает только раздачу новой работы. Задания, которые стример уже исполняет, доигрывают до конца и остаются видны в реестре; остановить их можно там же, поштучно. Копия, которая ещё не начиналась, уходит на другой стример, если он есть; копия, довозящая уже лежащий на этом стримере ассет, ждёт возврата роли. Всё, что на стримере лежит, раздаётся как прежде, загрузки новых ассетов в его хранилища не ограничиваются. Так машину выводят на обслуживание или отдают под другие задачи, не трогая её содержимое.
При снятии роли у стримера с незавершёнными заданиями консоль предупреждает, сколько их и что они доработают, и снимает роль только после подтверждения.

Как играют зрители¶
Ссылка на воспроизведение одна и та же, какой бы стример ни отдавал файл: в ней стоит asset id. Central при каждом обращении выбирает среди готовых местоположений ассета стример с наименьшим числом сессий, при равенстве — первый по имени, и отправляет плеер на него редиректом; дальше зритель смотрит с этого стримера до конца сессии. Между отчётами стримеров central учитывает и только что направленных зрителей, поэтому сто плееров, пришедших за секунду, делятся поровну, а не уходят на одну машину.
Стример, переставший отчитываться central, выпадает из выбора, когда истекает срок его живости (liveness_ttl_secs, по умолчанию 30 секунд). Зрители, уже играющие с него, доиграют или переподключатся сами; новые запросы уходят на живые копии, ссылка при этом не меняется. Вернувшийся стример снова получает зрителей после первого же отчёта. Ассет, у которого нет ни одного живого местоположения, отвечает 503 с Retry-After.
Выбор стримера для стримов работает по-другому и здесь не меняется: см. Воспроизведение стрима.
Что видно в консоли¶
В карточке ассета таблица Местоположение показывает каждый стример с ассетом: оригинал или копия, статус, ревизия и Зрителей — сколько сессий этого ассета играет с него сейчас.

В разделе Сессии сессия VOD стоит в колонке Стрим с ключом ассета и ведёт в его карточку; колонка Стример показывает, с какой машины зритель смотрит. На странице Стримеры колонка Сессии даёт общую картину по машинам.
Что дальше¶
- Транскодирование VOD — шаблоны ассетов, задания и их карточки.
- Каталог VOD — карточка ассета, местоположения и ссылки на воспроизведение.
- Настройки стримера — VOD-хранилища и роли стримера.