Skip to content

Копии 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 стоит в колонке Стрим с ключом ассета и ведёт в его карточку; колонка Стример показывает, с какой машины зритель смотрит. На странице Стримеры колонка Сессии даёт общую картину по машинам.

Что дальше