Видео

Зачем свой YouTube?

Создание собственного видеосервиса позволяет:

  • Получить независимость от поставщика внешнего видеохостинга
  • Обеспечить “вечное” хранение
  • Использовать видеосервис как основу видеосервисов организации

Обзор архитектуры

Видеосервис архитектурно близок к распределенной архитектуре YouTube. Оригинал видео загружается на сайт ELiS (Drupal), где создается задача на конвертирование и ставится в очередь на конвертацию. Ферма серверов конвертации видео, по мере освобождения ресурсов, конвертирует оригинал видео в три разных разрешения и два формата для показа в интернете. Сконвертированное видео загружается на ферму серверов хранения, откуда потом будет доставляться в браузеры пользователей и на мобильные устройства.

Выделение отдельных серверов транскодирования видео позволяет не снижать производительность сайта видеосервиса во время конвертации. Использование отедельных серверов хранения позволяет не использовать сложные кластерные системы и дорогостоящие системы хранения большого объема, расширяя пространство под сконвертированное видео по мере необходимости.

При наличии всего одного сервера, ноду файлового сервера и ноду транскодера можно разместить на одном сервисе с ELiS.

Сайт видеосервиса

Сайт видеосервиса представляет собой два модуля к CMS Drupal7 и может быть полностью независимым решением, никак не интегрированным с основной инфраструктурой ELiS. В случае интеграции с ELiS, загруженное видео попадет в поиск, сможет прикрепляться в каталог ELiS и отображаться в приложениях. Для видео появится возможность добавления в избранное и другой стандартный функционал, относящийся к документам ELiS. При интеграции видеосервиса в библиотеку ELiS, модули устанавливаются на тотже сайт, на который загружаются книги. Видео, загружаемое на сайт, попадает в папку /var/www/vh/library/sites/all/defualt/files/myvideo. Эту папку следует размещать на отдельном диске большой емкости. При размещении большого числа видеоматериалов можно использовать кластерную файловую систему. Производительность этой файловой системы большого значения не имеет, т.к. при просмотре видео, оригинал использоваться не будет.

Кроме установки модулей myvideo, потребуется установить ffmpeg, при помощи которого генерируются скриншоты после загрузки видео (устанавливается автоматически при установке ELiS).

Видеоканалы

К каждому видео можно добавить теги, на основе которых генерируются видеоканалы. Активация модуля myvideo channel создает по адресу http://example.com/channel/<tag> плеер, случайным образом отображающий видео помеченное тегом <tag>. Пример: https://elis.example.com/channel/топ5

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

Настройка сервера ELiS для подключения файловых и транскодирующих нод

Зайдите по URL admin/config/media/myvideo/settings и придумайте префикс (этот префикс будет добавляться ко всем транскодируемым файлам) из букв латинского алфавита (пример: mylibraryname).

Сгенерируйте из букв латинского алфавита секрет (пароль), с помощью которого транскодеры и файловые ноды будут подключаться и авторизоваться на сервере ELiS. Выберите секрет достаточно большим, например 20 букв (регистр значим).

Дальше можно добавить ноды транскодеров и ноды хранения в необходимом количестве, но не менее одной ноды транскодера и одной ноды хранения.

Ноды транскодеров

Видео, отображаемое в вебе, должно поддерживаться браузерами и мобильными устройствами. Для обеспечения поддержки максимального числа браузеров, видео должно быть в MP4/H.264 и WebM/VP9. Кроме того, чтобы пользователи могли смотреть видео на низкоскоростных каналах, требуется перекодировать видео в низкое разрешение, для снижения требований к полосе пропускания.

Перекодированием (транскодированием) оригинального видео в два разных формата и три разрешения занимаются специализированные сервера, которые так и называются транскодирующими серверами. Итого, на каждое оригинальное видео будет создано дополнительно 6 файлов.

Число серверов в ферме зависит от скорости загрузки видео и его длительности. Для работы видеосервиса требуется не менее одного транскодирующего сервера. Максимальное число серверов транскодирования не ограничено.

Системные требования

Для транскодирования видео требуются много процессорного времени. Поэтому таким нодам следует обеспечить максимальную производительность по процессору. Транскодирование видео практически линейно масштабируется с ростом числа ядер процессора.

Оперативной памяти, наоборот, много не требуется и 4 ГБ на ноду будет достаточно.

Дискового пространства также много не требуется, как и применение высокопроизводительных SAS-дисков. Достаточно выделить 100ГБ на папку /tmp и использовать для нее обычные SATA-диски на 7200 об/мин.

Есть экспериментальная поддержка кодирования видео с помощью видеокарт: https://elibsystem.ru/node/532.

Установка ПО на ноду транскодера

ПО транскодера автоматически устанавливается на сервер ELiS, но если вы будете транскодировать на выделенных сервера, выполните установку ПО:

Установите тот же дистрибутив, что и для ELiS на сервер (виртуальную машину или контейнер) транскодера.

Выполните:

# dnf install php elis-video-transcoder

Подключение ноды транскодера

На сайте ELiS пройдите по URL и добавьте ноду транскодера по URL: admin/config/media/myvideo/transcodernode/add. При этом если нода работает на одном сервере с ELiS, укажите в качестве “Server IP address” 127.0.0.1. В “Server hostname” продублируйте IP. Подключения для транскодирования будут приниматься только с этого IP.

Зайдите на сервер транскодера по SSH и отредактируйте файл /etc/elis-video-transcoder.conf, имеющий следующее содержимое:

<?php
class TranscoderConf {
  public static $threads = 4;
  public static $gpu = null;
  public static $servers = array(
    1 => array('host' => '127.0.0.1', 'baseUrl'=>'', 'proto' => 'http', 'description' => 'elis.example.com', 'secret' => 'pczlyq3ytADEnpM89u'),
  );
}

Здесь в $threads надо указать количество потоков, которое отводится для транскодирования видео. Можно указать (2N-1), где N - число ядер процессора вместе с HT-ядрами.

В $servers = array(); задайте IP-адрес ELiS (127.0.0.1, если транскодер на том же сервере, что и ELiS) и в качестве secret установите секрет (секретный ключ), введенный в ELiS по URL: admin/config/media/myvideo/settings

Один транскодер может обслуживать несколько сайтов (видеосервисов). Тогда все поддерживаемы серверы указываете в массиве $servers.

Процесс транскодирования

Ноды транскодирования сами обращаются на сайт видеосервиса и получают задание. Далее скачивается оригинальный файл на транскодирующую ноду и, с помощью ffmpeg, начинается процесс транскодирования. Транскодированное видео размещается в папке /tmp. Готовое видео загружается на ноду (сервер) постоянного хранения и происходит оповещение сайта видеосервиса об выполнении задания.

В случае, если производительности сервера хватает для одновременного транскодирования нескольких видео, нода может взять несколько заданий.

При использовании систем виртуаллизации, полная утилизация всех процессорных ядер может приводить к нежелательным миграциям виртуальных машин с загруженного хоста. В таких случаях не следует выделять для транскодирующего сервера более половины процессорных ядер при включенном Hyper-threading. Также имеется параметр утилизации процессора $cpu_utiliz_koef в файле /usr/lib64/elis-video-transcoder/cron.php, который изменяется от 0 до 1 и является средней утилизацией всех процессорных ядер, при превышении которых новое задание на транскодирование браться не будет.

Например: при указании $cpu_utiliz_koef 0.5 и 16 процессорных ядер, задания на транскодирования перестанут браться если будет полностью утилизированы любые 8 ядер. Не рекомендуется устанавливать данный параметр более 0.8, т.к. это приведет к увеличению времени публикации отдельного загруженного видео.

Сервера постоянного хранения видео

Транскодированное видео должно быть доставлено пользователю. Для этого оно размещается на ферме серверов хранения, основная задача которых - быстрая отдача файлов в браузеры и на устройства по протоколу http.

Такие сервера могут иметь публичный ip-адрес и доступны в интернете (если видео будет доступно в интернете). Если сервера находятся за NAT или на одном сервере с ELiS, то трафик с серверов направляется через ELiS путем реверс-проксирования.

Для работы видеосервиса нужно не менее одного сервера хранения. Аналогично с серверами транскодирования, один сервер хранения может обслуживать несколько видеосервисов, разделяя видео от них за счет префикса в названии файлов транскодированного видео.

Системные требования

Сервера хранения требуют прежде всего дискового пространства. В большинстве случаев можно ограничиться SATA-дисками на 7200 или 5600 об/мин. Процессорных ядер достаточно 2-4. Оперативной памяти от 4ГБ. Увеличение объема оперативной памяти будет изспользоваться для дискового кеша, поэтому, при большой нагрузке желательно использовать большее количество памяти.

Установка ПО на сервер хранения

Можно все ПО установить на один сервер с ELiS и не плодить дополнительные контейнеры или виртуальные машины, такой вариант подойдет если у вас будет относительно немного видео.

Если видео может быть много, стоит выделить отдельные сервера (ноды) для транскодирования и хранения, как на изображении ниже:

_images/elis_video-elis_proxy-architecture.svg

Установка ПО на один сервер с ELiS

В данном примере будет одна нода хранения vod1, при желании может быть несколько нод (vod2, vod3, … vodN).

Установите ПО:

# dnf install php php-fpm nginx elis-storage

В файле /etc/php-fpm.d/elis-storage.conf находятся настройки php-fpm.

В файле /etc/nginx/conf.d/elis-storage.inc находятся настройки nginx для сервера хранения.

В /etc/nginx/conf.d/elis.conf в секции server добавьте (раскомментируйте):

include conf.d/elis-storage.inc;

И расскомментируйте в /etc/nginx/conf.d/elis.conf в секции server секцию vod1:

location /vod1 {
    rewrite ^/vod1/(.*) /$1 break;
    proxy_pass http://127.0.0.1;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   Host $http_host;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_request_buffering off;
    client_max_body_size 0;
    proxy_connect_timeout 3600;
    proxy_send_timeout 3600;
    proxy_read_timeout 3600;
}

Установка ПО сервера хранения на выделенный сервер

Установите тот же дистрибутив или контейнер, что и ELiS.

Скопируйте с сервера ELiS на сервер ноды хранения репозиторий /etc/yum.repos.d/elis.conf, выполнив с сервера ELiS команду (с заменой <IP-address> на IP-адрес сервера хранения:

На сервере хранения установите ПО:

# dnf install php php-fpm nginx elis-storage

В /etc/nginx/conf.d/default.conf добавьте в секцию сервер:

include conf.d/elis-storage.inc;

Запустите nginx:

# systemctl enable --now nginx

У вас есть два варианта, как может передаваться видео. Сервер хранения может иметь выделенный (белый) IP-адрес или не иметь и все запросы на него тогда проходят через сервер ELiS. Через сервер ELiS настроить проще, но работать будет медленнее (т.к. появляется еще одно звено в передаче данных).

Если настраиваете через сервер ELiS, расскоментируйте на сервере ELiS в /etc/nginx/conf.d/elis.conf аналогичную секцию vod1, заменив в proxy_pass http://127.0.0.1 IP-адрес на адрес файловой ноды.

location /vod1 {
    rewrite ^/vod1/(.*) /$1 break;
    proxy_pass http://127.0.0.1;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   Host $http_host;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_request_buffering off;
    client_max_body_size 0;
    proxy_connect_timeout 3600;
    proxy_send_timeout 3600;
    proxy_read_timeout 3600;
}

Если у вас будет несколько файловых сервисов хранения, то повторите операцию, заменяя vod1 на vod2, vod3, … vodN.

Подключение сервера хранения

  1. На сайте ELiS по admin/config/media/myvideo создайте префикс и секретный ключ (если они еще не созданы).
  2. На сайте ELiS по admin/config/media/myvideo/filenode/add добавьте сервер хранения.

На этом процесс добавления закончен.

Note

Префикс может быть пустым (“”), но секретный ключ обязан быть не пустым и сложным, т.к. он является паролем, который использует инфраструктура видеосервиса для загрузки видео и удаления уже не нужного видео при удалении ноды видео на сайте.

Префикс необходим в случае, если один файловый сервер обслуживает несколько сайтов и обеспечивает уникальность имен.

Обслуживание видеосервиса

Администратору необходимо мониторить свободное пространство на серверах хранения и вовремя выводить их из списка, на которые возможно загрузка сконвертированного видео (myvideo_filenode.can_upload поставить в 0). Также необходимо поставить под мониторинг свободное место на сервере с сайтом видеосервиса.