Skip to content

Размещение стримов

Стримы распределяет по стримерам лейаутер, подсистема central. Вы добавляете стримеры и заводите стримы, а он решает, какая машина захватывает стрим, какая хранит копию его архива, какая раздаёт его зрителям. Решение пересчитывается при каждом изменении, а при отказе машины стримы переносятся на живые сами.

Решение лейаутера называется назначением и связывает стрим, стример и роль — то, что эта машина для стрима делает. По каждому назначению central собирает серверный конфиг стрима и доставляет его на стример, поэтому настройки стримов правятся в central, а не на машинах.

Размещением управляют три настройки. Неймспейсы делят кластер на непересекающиеся части. Теги задают требования и предпочтения. Лимиты ограничивают, сколько берёт одна машина.

Как распределяются стримы

Что делает лейаутер

  • Назначает роли и пересчитывает назначения. Прогон запускается при изменении входа — добавили стример, завели стрим, поправили настройки. Расписания нет, вручную запускать не нужно.
  • Учитывает возможности стримера. Стрим с кодированием на видеокарте назначается только на стример с картами. Стриму с архивом нужен стример с архивными дисками, если в его неймспейсе нет DVR-стримера: тогда архив записывает DVR-стример, а стримеру захвата диски не нужны.
  • Учитывает нагрузку. Из подходящих стримеров выбирается менее загруженный по процессору, сети и заполненности архива. Перегруженный стример разгружается переносом стримов.
  • Не переносит стримы без причины. Пока вход не менялся, назначения остаются прежними. Недогруженность соседней машины поводом для переноса не является.

Роли назначений

Роли не выбирают и не включают отдельно. Они следуют из того, что уже настроено: у стрима есть источник — нужен захват, стриму задано число резервных копий архива — появятся копии, в кластере есть эдж-стримеры — появится раздача на эдже, на стримере остался архив перенесённого стрима — появится раздача остатков или чистка. Знать их стоит затем, чтобы читать таблицу назначений на вкладке Лейаут стрима.

Захват (ingest) — основная роль, она есть у каждого работающего стрима. Стример принимает источник стрима, транскодирует его и пишет архив, если они настроены. У стрима один стример захвата. Требования стрима к машине проверяются именно здесь, поэтому большинство причин отказа относится к этой роли.

Запись архива (dvr_record) — архив стрима записывает не стример захвата, а DVR-стример его неймспейса. Назначение одно на стрим и появляется у каждого стрима с архивом, как только в неймспейсе есть DVR-стример. Прямой эфир DVR-стример получает со стримера захвата, как резервная копия.

Раздача на эдже (edge) — стрим отдаётся зрителям с эдж-стримера. Роль назначается каждому стриму на каждом подходящем эдже, отдельно включать её не нужно. Такой стрим не захватывает источник и не пишет архив, а получает готовое от стримера захвата.

Резервная копия архива (dvr_backup) — архив записывается ещё на нескольких стримерах помимо стримера захвата или записи. Сколько копий держать, задаёт поле Резервные копии DVR на вкладке Лейаут. В неймспейсе с DVR-стримером копии размещаются только на DVR-стримерах.

Раздача остатков архива (dvr_parts) — стрим перенесён на другой стример, а записанный архив остался на прежнем. Назначение отдаёт этот архив соседям, поэтому зритель видит его в общем таймлайне, и стирает его по глубине хранения стрима. Нового стример не пишет: входов стрима у него нет.

Чистка архива (dvr_cleanup) — на стримере лежит архив стрима, а раздавать его нельзя или незачем. Назначение только стирает архив по глубине хранения: входов у стрима нет, соседи с этого стримера не читают. Это слабейшая роль: она достаётся остатку, которому не положена никакая другая. Когда остаток получает раздачу, а когда чистку — в разделе Остатки архива.

Отказоустойчивость

Состояния стримера описаны в реестре, а лейаутер реагирует на них так.

  • Потеря сигнала. Назначения замораживаются — не снимаются, не создаются, новых стримов машина не получает. Короткий сбой не приводит к переносу стримов, и после восстановления связи машина продолжает вести те же.
  • Офлайн. Стримы переносятся на живые машины, как только подходящие находятся.

Раздача на эдже — исключение. Она сохраняется при любом состоянии связи, потому что эдж поднимает стрим по обращению зрителя, и снимать назначение из-за молчания незачем. Стример, выведенный из кластера, теряет все назначения.

Остатки архива

Когда стрим перенесён на другой стример, записанный архив остаётся на прежней машине. Central учитывает такой архив как остаток и обслуживает одной из двух ролей, пока не истечёт глубина хранения стрима.

  • Раздача остатков — стример подходит стриму по неймспейсу и тегам, не является эджем, машиной захвата или резервной копии, и у него задан внутрикластерный адрес.
  • Чистка архива — во всех остальных случаях: адреса нет, неймспейс другой, требуемые теги не совпали, стрим выключен, запись у стрима снята. Чистке нужны только роль Стример, архивное хранилище и живая подтверждённая машина. Лимит стримов её не считает.

Вкладка Лейаут стрима после переноса: захват на новом стримере, раздача остатков на прежнем

Раздача, которая положена, но не создана, видна незакрытой потребностью на вкладке Лейаут стрима — обычно с причиной нет пригодного адреса. Чистка вместо раздачи за пределами неймспейса или тегов потребности не даёт: неймспейс и теги сработали как настроены, и роль видна только в таблице назначений. Остаток, не обслуженный даже чисткой, — незакрытая потребность роли чистка архива, например с причиной роль ноды не подходит.

Прежний стример без внутрикластерного адреса: остаток чистится, раздача остатков — незакрытая потребность

Снятая запись и выключенный стрим

Выключение записи не стирает архив сразу. Стрим остаётся на стримерах, где лежит его архив, и каждый стирает записанное чисткой с глубиной по умолчанию — сутки. Включите запись раньше, и архив снова действует целиком. Выключенный стрим получает только чистку: его остатки стираются по глубине хранения стрима.

Сироты

Архив, у которого нет стрима, — сирота. Таким остаётся архив удалённого стрима; так же выглядит архив на стримере, вернувшемся в кластер после долгого отсутствия.

Стример сам находит такой архив и докладывает о нём central, а тот назначает чистку с причиной сирота. Делать ничего не нужно: через сутки архив стёрт, место свободно. Если стрим с этим именем существует, архив считается его архивом и обслуживается по его правилам.

У сироты нет страницы стрима. Её назначение видно на странице стримера в срезе стримов: строка с пометкой без документа, роль чистка архива, причина сирота. Сколько такого архива лежит на дисках, показывает DVR кластера.

Как влиять на размещение

Настройки стримера живут на вкладке Кластер его страницы.

Вкладка Кластер стримера: роль, неймспейс, лимиты и теги

У стрима свои неймспейс и теги, и задаются они на вкладке Лейаут его страницы — там же, где видны его назначения.

Вкладка Лейаут стрима: неймспейс, теги и число резервных копий архива

Неймспейсы

Неймспейс — жёсткая граница. Стрим назначается только на стримеры с тем же неймспейсом, и никаких исключений между неймспейсами нет. Пустое значение — тоже неймспейс, поэтому стрим без него назначается только на стримеры без него.

Так кластер делят на непересекающиеся части — например, по арендаторам или площадкам. Стримеру неймспейс задаётся на вкладке Кластер, стриму — на вкладке Лейаут.

Теги

Тег — произвольная пометка, которую вы ставите стримеру и стриму. Что она означает, решаете вы: лейаутер только сверяет теги, когда выбирает машину. Так в размещение вносят условие, о котором система знать не может.

Тег и неймспейс умеют одно и то же — запрещать размещение — и граница в обоих случаях непересекаема. Разница в масштабе. Неймспейс делит весь кластер: разметить надо всё, и ни один стрим не переедет между частями. Тег привязывает к машинам отдельные стримы и допускает отступление через preferred_. Нужна изоляция всего кластера — берите неймспейс; условие про отдельные стримы — тег.

Стримеру теги задаются на вкладке Кластер, стриму — на вкладке Лейаут. Форма записи решает, что тег означает. Слово fast ниже — просто пример, на его месте может быть любое ваше.

  • fast — свойство. Так помечают машину или стрим, ничего при этом не требуя.
  • required_fast — требование. Стрим с ним назначается только на стример, у которого тег fast тоже есть. Правило действует в обе стороны — стример с required_fast возьмёт только стримы с этим тегом.
  • preferred_fast — предпочтение. При прочих равных выигрывает стример с тегом fast, но при его отсутствии назначение всё равно состоится.

Сверяется само слово, а не форма записи. Требование required_fast удовлетворяет любая из трёх форм на другой стороне — fast, required_fast или preferred_fast. Предпочтение preferred_fast считается так же.

Примеры размещения

Два дата-центра с узким каналом между ними. Пока лейаутер видит кластер целиком, он размещает стримы и их архивные копии на любых машинах: трафик переправки архива идёт через канал между ДЦ, а при отказе площадки её стримы переезжают в другой ДЦ, хотя источники там принять нельзя. Разделите кластер неймспейсами dc1 и dc2 — и каждый стрим со всеми ролями живёт внутри своей площадки. Разметить придётся всё: неймспейс нужен каждому стриму и каждому стримеру, а стример без него стримам dc1 и dc2 недоступен.

Multicast-источник доступен не из каждого ДЦ. Десять нод раскиданы по двум ДЦ, а multicast роутится только внутри своего. Привязывать к площадке нужно один стрим, а не весь кластер — поэтому не неймспейс, а тег: стримерам dc1 и dc2, стриму required_dc1. Остальные стримы по-прежнему размещаются на всём кластере.

GPU-машины в первую очередь, но не только они. Стрим может кодироваться и на процессоре, и на видеокарте, но машин с картами мало. Машинам — тег gpu, стриму — preferred_gpu: при прочих равных он назначается на GPU-машину, а когда они заполнены, переливает на остальные. Кодирование на GPU описано на странице Транскодер.

Стриму лучше в своём ДЦ, но переезд допустим. preferred_dc1 держит стрим в первом ДЦ, пока там хватает мощности, и переливает во второй при переполнении. Такое отступление неймспейс выразить не может.

Машина и стрим с несколькими тегами. Тегов у машины и у стрима может быть много: стример в первом ДЦ с видеокартой несёт dc1 и gpu, а стрим с required_dc1 и preferred_gpu остаётся внутри первого ДЦ, в первую очередь на GPU-машинах.

Лимиты и нагрузка

Нагрузка стримера измеряется по машине целиком — весь процессор и весь трафик, включая раздачу зрителям, перекачки между стримерами и посторонние процессы. Роли назначений на измерение не влияют.

Три поля на вкладке Кластер задают пределы.

  • Лимит стримов — сколько стримов машине можно нести. Ноль оставляет её в кластере, но пустой.
  • Лимит сети, кбит/с — предел трафика машины. Сверх него лейаутер стримов не добавляет, а при превышении разгружает машину.
  • Лимит DVR, % — занятость архивных дисков, с которой стример считается заполненным.

Пределы ограничивают назначение захвата, записи архива и резервных копий архива. Раздачу на эдже, раздачу остатков и чистку архива они не ограничивают — эти роли назначаются независимо от загрузки машины.

Что дальше

Что лейаутер решил и почему стрим оказался там, где оказался, показывает Состояние размещения.